跳转到内容

Jaeger

Jaeger 是一款开源的分布式追踪系统,由 Uber 公司开发并贡献给 云原生计算基金会 (CNCF)。它主要用于监控和排查复杂的微服务架构中的性能问题,通过收集、存储和分析请求在分布式系统中的流转路径和时间消耗。

概述[编辑 | 编辑源代码]

Jaeger 的名称来源于德语中的"猎人",寓意其能够帮助开发者"追踪"分布式系统中的请求流转。该系统实现了 OpenTracing 标准,并与 OpenTelemetry 项目兼容,是现代可观测性技术栈中的重要组成部分。

主要功能包括:

  • 分布式上下文传播
  • 事务监控
  • 根因分析
  • 服务依赖分析
  • 性能优化

架构组成[编辑 | 编辑源代码]

Jaeger 由多个组件构成,采用模块化设计:

核心组件[编辑 | 编辑源代码]

  • Jaeger Client - 支持多种语言的客户端库
  • Jaeger Agent - 接收客户端发送的跨度数据
  • Jaeger Collector - 接收并处理来自 Agent 的数据
  • Storage Backend - 支持 ElasticsearchCassandra 等存储
  • Jaeger Query - 提供查询界面和 API
  • Jaeger UI - 基于 React 的可视化界面

部署架构[编辑 | 编辑源代码]

graph TD A[Client] -->|发送Span| B(Agent) B --> C[Collector] C --> D[(Storage)] D --> E[Query] E --> F[UI]

核心概念[编辑 | 编辑源代码]

追踪 (Trace)[编辑 | 编辑源代码]

表示一个完整的请求流程,由多个Span组成。例如,一个 HTTP 请求从进入系统到返回响应所经历的所有服务调用。

跨度 (Span)[编辑 | 编辑源代码]

代表一个操作单元,包含:

  • 操作名称
  • 开始时间戳
  • 持续时间
  • 标签 (Tags)
  • 日志 (Logs)
  • 引用关系 (References)

上下文传播[编辑 | 编辑源代码]

Jaeger 使用以下方式传播追踪上下文:

  • HTTP 头 (如 `uber-trace-id`)
  • gRPC 元数据
  • 消息队列属性

安装与配置[编辑 | 编辑源代码]

使用 Docker 快速启动[编辑 | 编辑源代码]

docker run -d --name jaeger \
  -e COLLECTOR_ZIPKIN_HTTP_PORT=9411 \
  -p 5775:5775/udp \
  -p 6831:6831/udp \
  -p 6832:6832/udp \
  -p 5778:5778 \
  -p 16686:16686 \
  -p 14268:14268 \
  -p 9411:9411 \
  jaegertracing/all-in-one:1.30

生产环境部署[编辑 | 编辑源代码]

推荐使用 Kubernetes 部署各组件分离的架构,存储后端建议使用 Elasticsearch 集群。

代码集成示例[编辑 | 编辑源代码]

Go 语言示例[编辑 | 编辑源代码]

package main

import (
	"context"
	"log"
	"time"

	"github.com/uber/jaeger-client-go"
	"github.com/uber/jaeger-client-go/config"
)

func main() {
	cfg := config.Configuration{
		ServiceName: "my-service",
		Sampler: &config.SamplerConfig{
			Type:  jaeger.SamplerTypeConst,
			Param: 1,
		},
		Reporter: &config.ReporterConfig{
			LogSpans:           true,
			LocalAgentHostPort: "localhost:6831",
		},
	}

	tracer, closer, err := cfg.NewTracer()
	if err != nil {
		log.Fatal(err)
	}
	defer closer.Close()

	// 创建根span
	parentSpan := tracer.StartSpan("parent-operation")
	defer parentSpan.Finish()

	// 创建子span
	childSpan := tracer.StartSpan("child-operation", jaeger.ChildOf(parentSpan.Context()))
	time.Sleep(100 * time.Millisecond)
	childSpan.Finish()
}

可视化分析[编辑 | 编辑源代码]

Jaeger UI 提供以下关键功能:

  • 服务依赖图
  • 追踪时间线
  • 错误标记
  • 延迟热图
  • 比较分析工具

与其他系统的集成[编辑 | 编辑源代码]

  • Prometheus 集成进行指标监控
  • Grafana 集成实现统一仪表盘
  • Kubernetes 集成进行服务发现
  • Istio 集成实现服务网格追踪

性能调优[编辑 | 编辑源代码]

采样策略[编辑 | 编辑源代码]

Jaeger 支持多种采样策略以平衡性能和开销:

  • 恒定采样 (Const)
  • 概率采样 (Probabilistic)
  • 速率限制采样 (Rate Limiting)
  • 自适应采样 (Adaptive)

存储优化[编辑 | 编辑源代码]

对于高流量系统,建议:

实际应用案例[编辑 | 编辑源代码]

电商系统追踪[编辑 | 编辑源代码]

graph LR A[用户] -->|HTTP请求| B(API网关) B --> C[用户服务] B --> D[商品服务] D --> E[库存服务] D --> F[推荐服务] C --> G[订单服务] G --> H[支付服务] G --> I[物流服务]

通过 Jaeger 可以: 1. 分析下单流程的瓶颈 2. 发现跨服务调用的异常延迟 3. 识别不必要的高频调用

社区与生态[编辑 | 编辑源代码]

Jaeger 拥有活跃的开源社区,主要资源包括:

  • 官方文档
  • GitHub 仓库
  • CNCF Slack 频道
  • 定期社区会议

参见[编辑 | 编辑源代码]

参考资料[编辑 | 编辑源代码]