授课语音

Jaeger - 分布式追踪系统

Jaeger 是一个开源的分布式追踪系统,由 Uber 开发并贡献给了 Cloud Native Computing Foundation (CNCF),旨在帮助开发人员分析和可视化分布式系统中的请求流转和性能瓶颈。Jaeger 通过收集、存储、分析和展示链路追踪数据,使得开发者能够快速识别系统中的延迟、故障和性能问题。

Jaeger 支持多种存储后端,可以使用多种数据库来存储追踪数据(如 Cassandra、Elasticsearch、Kafka 等)。它通常与 OpenTelemetry 集成,支持跨语言的链路追踪,适用于微服务架构、容器化环境以及大规模分布式系统。

Jaeger 的核心组件

Jaeger 系统主要由以下几个组件组成:

  1. Jaeger Agent

    • Jaeger Agent 是一个轻量级的进程,通常部署在每个应用的实例旁边。它负责接收来自应用程序的追踪数据(Span 数据),并将其转发到 Jaeger Collector。
    • Jaeger Agent 通过 UDP 协议与 Jaeger Collector 通信,以减少网络延迟。
  2. Jaeger Collector

    • Jaeger Collector 负责接收来自 Agent 的追踪数据,并将数据持久化到指定的存储后端(如 Cassandra、Elasticsearch 或其他)。
    • Collector 是 Jaeger 的数据接收和处理中心。
  3. Jaeger Query

    • Jaeger Query 是一个用于提供查询功能的组件。它允许用户通过 UI 或 API 查询和可视化分布式追踪数据。
    • Jaeger Query 会从存储后端(如 Cassandra 或 Elasticsearch)中读取追踪数据并将其展示给用户。
  4. Jaeger UI

    • Jaeger UI 是一个可视化界面,用于展示链路追踪数据。通过 Jaeger UI,用户可以查看单个请求的完整追踪信息,查看每个 Span 的详细执行时间,分析服务之间的调用关系。
    • Jaeger UI 提供了 Trace 查看、依赖图、性能瓶颈分析等功能。
  5. 存储后端

    • Jaeger 支持多种存储后端,常见的有:
      • Cassandra:一个高度可扩展的 NoSQL 数据库,适合存储大规模的追踪数据。
      • Elasticsearch:一个分布式搜索和分析引擎,适合存储和查询日志和追踪数据。
      • Kafka:一个分布式流处理平台,常用于消息队列和流式数据处理。
      • MySQL、PostgreSQL:支持存储小规模的数据。
  6. Jaeger Client Libraries

    • Jaeger 提供了多种语言的客户端库(如 Go、Java、Python、Node.js 等),用于集成链路追踪功能。通过这些库,开发人员可以在应用程序中创建和传递 Span,收集请求的追踪数据,并发送到 Jaeger Agent。

Jaeger 的工作原理

  1. 客户端创建 Span

    • 当应用程序接收到请求时,它会在应用中创建一个新的 Span。每个 Span 都包含操作的详细信息,包括操作名称、开始时间、结束时间、父 Span ID(如果有)等。
    • 如果应用程序需要调用其他服务,它会在下游服务中创建一个新的 Span,并传递当前的 Trace ID 和 Parent Span ID,确保请求在不同服务间关联。
  2. Jaeger Agent 收集 Span 数据

    • 应用程序通过 Jaeger Client Library 向 Jaeger Agent 发送生成的 Span 数据。Jaeger Agent 在每个应用实例上运行,收集应用的追踪信息。
    • Jaeger Agent 通过 UDP 协议将追踪数据批量传输给 Jaeger Collector。
  3. Jaeger Collector 存储数据

    • Jaeger Collector 接收到来自 Agent 的 Span 数据后,将这些数据存储到配置的存储后端中(如 Cassandra、Elasticsearch 等)。
    • Collector 还会处理数据的压缩和优化,确保系统的高效运行。
  4. Jaeger Query 提供查询接口

    • Jaeger Query 从存储后端中检索追踪数据,并通过 UI 或 API 提供查询接口,允许用户查看和分析链路追踪信息。
    • 用户可以根据 Trace ID 查询请求的整个生命周期,分析每个服务的性能和瓶颈。
  5. Jaeger UI 可视化数据

    • Jaeger UI 提供了一个直观的界面,允许用户可视化请求的追踪信息。用户可以看到整个 Trace 的调用路径、各个服务的响应时间、请求的依赖关系等。
    • Jaeger UI 还提供了 Trace 列表、依赖图、性能分析等功能,帮助开发人员定位问题。

Jaeger 的优缺点

优点:

  1. 开源且高度可扩展

    • Jaeger 是一个开源项目,支持大规模分布式系统的链路追踪。它的架构非常灵活,支持水平扩展,可以适应不同规模的应用。
  2. 多语言支持

    • Jaeger 提供了多个编程语言的客户端库(如 Go、Java、Python、Node.js 等),能够在不同的应用程序中集成链路追踪。
  3. 高性能和低延迟

    • Jaeger 使用 UDP 协议与 Agent 通信,减少了网络延迟和带宽的压力。数据以批量的方式传输,提高了性能。
  4. 完善的查询和可视化功能

    • Jaeger 提供了丰富的查询和可视化功能,帮助开发人员快速识别系统中的性能瓶颈和潜在问题。
  5. 支持多种存储后端

    • Jaeger 支持多种存储后端,如 Cassandra、Elasticsearch 等,用户可以根据需求选择合适的存储方案。

缺点:

  1. 配置和维护复杂

    • Jaeger 的部署和配置相对复杂,尤其是在大规模分布式系统中,需要配置多个组件(Agent、Collector、Query 等)并进行协调。
  2. 资源消耗较大

    • 由于 Jaeger 需要收集和存储大量的链路追踪数据,它可能会消耗较多的系统资源(如 CPU、内存和磁盘空间)。
  3. 数据查询延迟

    • 如果使用不适合的存储后端,Jaeger 的查询性能可能会受到影响,尤其是在大量追踪数据时,查询和展示的延迟可能较高。

使用 Jaeger 进行链路追踪

1. 安装 Jaeger

Jaeger 提供了多种安装方式,常见的有:

  • 使用 Docker: 通过 Docker Compose 快速启动 Jaeger 集群,以下是一个示例的 docker-compose.yml 文件:

    version: '3'
    services:
      jaeger-agent:
        image: jaegertracing/jaeger-agent:latest
        environment:
          - COLLECTOR_ZIPKIN_HTTP_HTTP_PORT=5775
        ports:
          - "5775:5775"
      jaeger-collector:
        image: jaegertracing/jaeger-collector:latest
        environment:
          - COLLECTOR_ZIPKIN_HTTP_HTTP_PORT=5775
        ports:
          - "5776:5776"
      jaeger-query:
        image: jaegertracing/jaeger-query:latest
        environment:
          - QUERY_PORT=16686
        ports:
          - "16686:16686"
    

    启动 Jaeger:

    docker-compose up
    
  • Kubernetes 部署: Jaeger 官方提供了 Kubernetes 部署的文档,可以通过 Helm chart 或直接使用 Kubernetes 配置文件来部署 Jaeger。

2. 集成 Jaeger 到应用程序

以下是使用 Go 语言集成 Jaeger 的基本步骤:

  1. 安装 Jaeger 客户端库:

    go get github.com/jaegertracing/jaeger-client-go
    go get github.com/opentracing/opentracing-go
    
  2. 初始化 Jaeger Tracer:

    package main
    
    import (
        "github.com/jaegertracing/jaeger-client-go"
        "github.com/jaegertracing/jaeger-client-go/config"
        "github.com/opentracing/opentracing-go"
        "log"
    )
    
    func main() {
        cfg := &config.Configuration{
            ServiceName: "example-service",
            Sampler: &config.SamplerConfig{
                Type:  "const",
                Param: 1,
            },
            Reporter: &config.ReporterConfig{
                LogSpans:            true,
                CollectorEndpoint:   "http://localhost:5775",
            },
        }
    
        tracer, closer, err := cfg.NewTracer()
        if err != nil {
            log.Fatalf("Could not initialize Jaeger tracer: %v", err)
        }
        defer closer.Close()
        opentracing.SetGlobalTracer(tracer)
    
        // Example of creating a Span
        span := tracer.StartSpan("example-operation")
        span.Finish()
    }
    

3. 查看追踪数据

启动 Jaeger UI,通过浏览器访问 http://localhost:16686,你可以查询和可视化你的追踪数据。你可以根据 Trace ID 查看详细的请求流转路径,分析各个服务的响应时间、调用链等。

总结

Jaeger 是一个强大且灵活的分布式追踪系统,能够帮助开发人员和运维人员全面了解和分析分布式系统中的请求流转、性能瓶颈和潜在问题。通过与 OpenTelemetry 等标准框架的结合,Jaeger 为微服务架构中的链路追踪提供了一个开源、可扩展的解决方案。

去1:1私密咨询

系列课程: