在微服务架构普及的当下,一个用户请求往往会经过多个独立部署的服务处理,服务间的调用关系错综复杂。当请求出现超时、报错等问题时,仅靠单个服务的日志很难快速定位根因,这时候分布式追踪系统就派上了用场,Jaeger就是这类系统中应用广泛的开源方案。

Jaeger 是什么
Jaeger是Uber开源的分布式追踪系统,现在已经是CNCF的毕业项目,主要用于监控和排查微服务架构下的分布式事务,支持分布式上下文传播、服务依赖分析、性能优化、故障定位等核心能力。
它的核心组件包含以下几个部分:
- Client:嵌入到业务服务中的SDK,负责生成追踪数据,支持多种语言包括.NET、Java、Go等。
- Agent:常驻服务节点,接收Client上报的追踪数据,批量转发给Collector,通常和微服务部署在同一台机器。
- Collector:接收Agent上报的数据,进行校验、处理、存储,支持将数据存入Elasticsearch、Cassandra等存储组件。
- Query:提供查询接口和Web UI,用户可以通过UI查看调用链路、服务依赖、请求耗时等信息。
Jaeger 追踪 .NET 微服务的基本原理
Jaeger的追踪逻辑基于Trace和Span两个核心概念:一个Trace代表一次完整的请求链路,由多个Span组成;每个Span代表链路中的一个独立操作,比如一次服务调用、一次数据库查询,Span之间会通过上下文关联,形成完整的调用树。
在.NET微服务中,我们通常会结合OpenTelemetry来上报追踪数据,OpenTelemetry是云原生可观测性的标准,提供了统一的API和SDK,不需要直接依赖Jaeger的客户端,后续切换追踪系统也更灵活。
在 .NET 微服务中集成 Jaeger 的步骤
1. 环境准备
首先我们需要部署Jaeger服务,最简单的方式是用Docker启动All-in-one版本,适合开发和测试环境:
docker run -d --name jaeger -e COLLECTOR_ZIPKIN_HOST_PORT=:9411 -p 5775:5775/udp -p 6831:6831/udp -p 6832:6832/udp -p 5778:5778 -p 16686:16686 -p 14250:14250 -p 14268:14268 -p 14269:14269 -p 9411:9411 ghcr.io/jaegertracing/all-in-one:1.47
启动后访问http://127.0.0.1:16686就可以打开Jaeger的Web UI。
2. .NET 服务添加依赖
在需要追踪的.NET微服务项目中,通过NuGet安装以下包:
- OpenTelemetry.Extensions.Hosting:提供OpenTelemetry的宿主扩展
- OpenTelemetry.Instrumentation.AspNetCore:自动采集ASP.NET Core的请求追踪数据
- OpenTelemetry.Instrumentation.Http:自动采集HttpClient的调用追踪数据
- OpenTelemetry.Exporter.Jaeger:将追踪数据导出到Jaeger
如果是.NET 6及以上版本,可以直接在csproj文件中添加以下依赖:
<ItemGroup> <PackageReference Include="OpenTelemetry.Extensions.Hosting" Version="1.7.0" /> <PackageReference Include="OpenTelemetry.Instrumentation.AspNetCore" Version="1.5.0" /> <PackageReference Include="OpenTelemetry.Instrumentation.Http" Version="1.5.0" /> <PackageReference Include="OpenTelemetry.Exporter.Jaeger" Version="1.5.0" /> </ItemGroup>
3. 配置 OpenTelemetry 上报 Jaeger
在Program.cs中添加OpenTelemetry的配置,示例代码如下:
using OpenTelemetry;
using OpenTelemetry.Resources;
using OpenTelemetry.Trace;
var builder = WebApplication.CreateBuilder(args);
// 配置OpenTelemetry追踪
builder.Services.AddOpenTelemetry()
.WithTracing(tracerProvider =>
{
tracerProvider
// 设置服务名称,会在Jaeger中显示
.SetResourceBuilder(ResourceBuilder.CreateDefault().AddService("OrderService"))
// 自动采集ASP.NET Core请求数据
.AddAspNetCoreInstrumentation()
// 自动采集HttpClient调用数据
.AddHttpClientInstrumentation()
// 配置Jaeger导出器
.AddJaegerExporter(options =>
{
// Jaeger Agent的地址,默认UDP端口6831
options.AgentHost = "127.0.0.1";
options.AgentPort = 6831;
// 也可以配置Collector的HTTP地址,默认端口14268
// options.Endpoint = new Uri("http://127.0.0.1:14268/api/traces");
});
});
// 添加控制器等服务
builder.Services.AddControllers();
var app = builder.Build();
app.MapControllers();
app.Run();
4. 服务间调用自动追踪
如果微服务之间用HttpClient进行调用,OpenTelemetry会自动传播追踪上下文,不需要额外处理。比如订单服务调用用户服务的代码:
[ApiController]
[Route("api/order")]
public class OrderController : ControllerBase
{
private readonly HttpClient _httpClient;
public OrderController(IHttpClientFactory httpClientFactory)
{
_httpClient = httpClientFactory.CreateClient();
}
[HttpGet("{orderId}")]
public async Task<IActionResult> GetOrder(string orderId)
{
// 调用用户服务,追踪上下文会自动传递
var userResponse = await _httpClient.GetAsync("http://127.0.0.1:5001/api/user/123");
var userInfo = await userResponse.Content.ReadAsStringAsync();
// 模拟业务逻辑
return Ok(new { OrderId = orderId, UserInfo = userInfo });
}
}
5. 查看追踪结果
启动多个微服务后,发起一次请求,然后打开Jaeger的Web UI,在Service下拉框选择对应的服务名称,点击Find Traces就可以看到对应的Trace列表,点击单个Trace可以查看完整的调用链路,包括每个Span的耗时、标签、日志等信息,还能看到服务之间的依赖关系。
注意事项
- 生产环境建议部署独立的Jaeger Collector和存储组件,不要使用All-in-one版本。
- 可以通过采样策略控制追踪数据的上报比例,避免大量数据占用存储和带宽,默认是全量采样。
- 除了自动采集的Span,也可以在业务代码中手动创建Span,记录自定义的操作,比如一段复杂的业务逻辑:
using var span = TracerProvider.Default.GetTracer("OrderService").StartActiveSpan("ProcessOrder");
try
{
// 业务逻辑
span.SetAttribute("order.id", orderId);
}
catch (Exception ex)
{
span.RecordException(ex);
span.SetStatus(Status.Error);
}
Jaeger.NET_微服务分布式追踪OpenTelemetry修改时间:2026-06-19 05:54:33