分布式追踪分析:booking-microservices中的Jaeger追踪解析

分布式追踪分析:booking-microservices中的Jaeger追踪解析

【免费下载链接】booking-microservices Practical microservices, built with .Net 8, DDD, CQRS, Event Sourcing, Vertical Slice Architecture, Event-Driven Architecture, and the latest technologies. 【免费下载链接】booking-microservices 项目地址: https://gitcode.com/GitHub_Trending/bo/booking-microservices

1. 追踪系统架构概览

在分布式系统中,一个用户请求往往需要多个微服务协同处理。当请求出现延迟或错误时,如何快速定位问题根源?分布式追踪(Distributed Tracing)技术通过记录请求在各个服务间的传播路径,帮助开发和运维人员实现全链路可视化。

booking-microservices项目采用OpenTelemetry + Jaeger的追踪方案,实现了跨服务调用链的自动采集与分析。其核心架构包含三个层级:

  • 应用层:通过OpenTelemetry SDK埋点采集 traces、metrics 和 logs
  • 传输层:OTLP协议标准化数据格式与传输
  • 存储与展示层:Jaeger负责数据存储、查询与可视化

微服务架构图

相关实现代码:

2. 应用层追踪实现

2.1 自动埋点配置

项目通过AddCustomObservability方法统一配置追踪能力,该实现位于Extensions.cs。核心代码片段:

public static WebApplicationBuilder AddCustomObservability(this WebApplicationBuilder builder)
{
    Activity.DefaultIdFormat = ActivityIdFormat.W3C;
    builder.Services.AddSingleton<IDiagnosticsProvider, CustomeDiagnosticsProvider>();
    
    // 配置服务元数据
    void ConfigureResourceBuilder(ResourceBuilder resourceBuilder)
    {
        resourceBuilder.AddAttributes([new("service.environment", builder.Environment.EnvironmentName)]);
        resourceBuilder.AddService(
            serviceName: observabilityOptions.ServiceName ?? builder.Environment.ApplicationName,
            serviceVersion: Assembly.GetCallingAssembly().GetName().Version?.ToString() ?? "unknown",
            serviceInstanceId: Environment.MachineName
        );
    }
    
    // 配置追踪采集
    if (observabilityOptions.TracingEnabled)
    {
        otel.WithTracing(tracing =>
        {
            tracing
                .SetErrorStatusOnException()
                .AddAspNetCoreInstrumentation(options =>
                {
                    options.RecordException = true;
                    // 排除健康检查端点
                    options.Filter = httpContext => 
                        !(httpContext.Request.Path.StartsWithSegments("/health") || 
                          httpContext.Request.Path.StartsWithSegments("/alive"));
                })
                .AddGrpcClientInstrumentation()
                .AddHttpClientInstrumentation()
                .AddEntityFrameworkCoreInstrumentation()
                .AddNpgsql();
        });
    }
}

2.2 追踪上下文传播

分布式追踪的关键在于上下文(Context)的跨服务传递。项目通过以下机制确保追踪链的连续性:

  • W3C Trace Context:使用Activity.DefaultIdFormat = ActivityIdFormat.W3C标准化trace-id和span-id格式
  • 自动 instrumentation:HTTP/gRPC客户端自动注入追踪头(traceparent
  • 手动埋点:通过ActivitySource创建自定义span,如CommandHandlerActivity

3. 传输层协议配置

3.1 OTLP协议应用

OpenTelemetry Protocol (OTLP) 是项目采用的标准传输协议,负责将追踪数据从应用发送到Collector。配置位于Extensions.cs

// Jaeger exporter配置
if (observabilityOptions.UseJaegerExporter)
{
    tracing.AddOtlpExporter(x =>
    {
        x.Endpoint = new Uri(observabilityOptions.JaegerOptions.OTLPGrpcExporterEndpoint);
        x.Protocol = OtlpExportProtocol.Grpc;
    });
}

3.2 Collector配置

OpenTelemetry Collector作为数据中转站,接收应用发送的OTLP数据并转发至Jaeger。配置文件otel-collector-config.yaml定义了完整的数据处理流程:

receivers:
  otlp:
    protocols:
      grpc:
        endpoint: 0.0.0.0:4317  # gRPC端口
      http:
        endpoint: 0.0.0.0:4318  # HTTP端口

processors:
  batch:  # 批处理优化性能

exporters:
  otlp/jaeger:  # 转发至Jaeger
    endpoint: "http://jaeger-all-in-one:4317"
    tls:
      insecure: true

service:
  pipelines:
    traces:
      receivers: [otlp]
      processors: [batch]
      exporters: [otlp/jaeger]

4. 部署配置与容器编排

4.1 Docker Compose配置

项目通过Docker Compose实现追踪系统的一键部署,关键配置位于docker-compose.infrastructure.yaml

services:
  jaeger-all-in-one:
    image: jaegertracing/all-in-one:1.55
    ports:
      - "16686:16686"  # Jaeger UI
      - "14317:4317"   # OTLP gRPC接收端口
      - "14318:4318"   # OTLP HTTP接收端口

  otel-collector:
    image: otel/opentelemetry-collector-contrib:0.91.0
    volumes:
      - ./configs/otel-collector-config.yaml:/etc/otelcol-contrib/config.yaml
    depends_on:
      - jaeger-all-in-one

4.2 服务网络拓扑

各组件网络关系如下:

  1. 微服务应用 → OTLP → Collector (4317/4318端口)
  2. Collector → OTLP → Jaeger (4317端口)
  3. 用户 → Jaeger UI (16686端口) 查看追踪数据

垂直切片架构

5. 追踪数据分析与问题定位

5.1 Jaeger UI使用

访问http://localhost:16686打开Jaeger UI,可进行以下操作:

  • 按服务名、操作名筛选追踪记录
  • 查看调用链耗时分布
  • 识别性能瓶颈和错误点
  • 分析服务依赖关系

5.2 关键指标监控

项目同时采集与追踪相关的性能指标,如:

  • http.server.request.duration:请求处理耗时
  • otel.traces.exporter.success:追踪数据导出成功率
  • db.client.query.duration:数据库查询耗时

指标采集配置见Extensions.cs中的metrics部分:

otel.WithMetrics(metrics =>
{
    metrics
        .AddAspNetCoreInstrumentation()
        .AddHttpClientInstrumentation()
        .AddProcessInstrumentation()
        .AddRuntimeInstrumentation()
        .AddView(
            "http.server.request.duration",
            new ExplicitBucketHistogramConfiguration
            {
                Boundaries = [0, 0.005, 0.01, 0.025, 0.05, 0.075, 0.1, 0.25, 0.5, 0.75, 1, 2.5, 5, 7.5, 10],
            }
        );
});

6. 部署与使用指南

6.1 环境准备

  1. 克隆项目仓库:
git clone https://gitcode.com/GitHub_Trending/bo/booking-microservices
cd booking-microservices
  1. 启动基础设施服务:
docker-compose -f deployments/docker-compose/docker-compose.infrastructure.yaml up -d

6.2 验证追踪系统

  1. 启动应用服务:
dotnet run --project src/Aspire/src/AppHost/AppHost.csproj
  1. 访问应用接口生成追踪数据:
curl http://localhost:5000/api/booking
  1. 在Jaeger UI中查看追踪结果: 打开浏览器访问http://localhost:16686,选择服务名并搜索追踪记录。

7. 总结与最佳实践

booking-microservices项目通过OpenTelemetry和Jaeger构建了完整的分布式追踪体系,实现了"一次埋点,多处使用"的可观测性目标。推荐实践:

  1. 全链路覆盖:确保所有服务和关键依赖(数据库、消息队列)都接入追踪
  2. 采样策略:生产环境建议使用基于QPS的采样策略,避免性能影响
  3. 上下文传递:跨进程调用必须正确传递traceparent头
  4. 结构化日志:结合日志和追踪数据,提高问题定位效率

项目官方文档:README.md 追踪配置源码:OpenTelemetryCollector/ 部署配置:deployments/

通过这套追踪系统,开发团队可以快速定位分布式调用中的问题,优化系统性能,提升用户体验。随着微服务架构的不断演进,可观测性将成为保障系统稳定性的关键支柱。

【免费下载链接】booking-microservices Practical microservices, built with .Net 8, DDD, CQRS, Event Sourcing, Vertical Slice Architecture, Event-Driven Architecture, and the latest technologies. 【免费下载链接】booking-microservices 项目地址: https://gitcode.com/GitHub_Trending/bo/booking-microservices

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值