Jaeger是开源、分布式跟踪平台,支持云原生且无限可扩展。
介绍
- Jaeger 受到 Dapper 和 OpenZipkin 的启发,是由
Uber Technologies
创建并捐赠给 CNCF 的分布式跟踪平台
- Jaeger 于 2017-9-13 被 CNCF 接受为孵化项目,然后于 2019-10-31 转移到毕业成熟度级别
- 它可用于监控基于微服务的分布式系统:
- 分布式上下文传播
- 分布式事务监控
- 根本原因分析
- 服务依赖性分析
- 性能/延迟优化
- 作用:监控复杂分布式系统中的工作流程并排除故障
- Jaeger 使用 Go 语言编写的,在并发性能、对系统资源的消耗底
- 特点
- 高度可扩展性
- 现代化 UI 界面
- 云原生部署,如 Jaeger Operator
- 支持基于 Prometheus metrics
- 与 Zipkin 向后兼容
- 版本兼容性保证
- 与 OpenTelemetry 的关系
- Jaeger 和 OpenTelemetry 有着不同的目标(参考 Jaeger and OpenTelemetry)
- OpenTelemetry 的目标是提供多种语言的应用程序接口(API)和 SDK,允许应用程序将各种遥测数据输出到任意数量的度量和跟踪后端
- Jaeger 主要是跟踪后端,它接收跟踪遥测数据,并对数据进行处理、汇总、数据挖掘和可视化
- Jaeger 项目推荐使用 OpenTelemetry SDK 进行数据采集
- Jaeger 最初设计是为了支持 OpenTracing standard,且 OpenTracing 已经合并到 OpenTelemetry
- 特点
- 通过数据驱动的依赖关系图了解整个系统的架构
- 查看请求时间线和错误;了解应用程序如何运行
- 查找延迟和并发性不足的根源
- 高度上下文化的日志记录
- 使用行李传播诊断请求间争用(排队)和服务耗时
- 使用 opentelemetry-contrib 提供的开源库,免费获取厂商中立的产品
- Jaeger 兼容 Zipkin
架构
- 图片转载自 github,spm arch 参考
Jaeger Collector
接收来自代理或直接来自客户的 spans,并将其保存在持久存储器中
- 可以作为 OpenTelemetry 的 exporter
- 自 2022 年起,不再支持 Jaeger SDK(aka tracers, client libraries) that implemented the OpenTracing API
Jaeger Agent (deprecated, 已废弃)
从 Jaeger 客户端接收 spans 并转发给 Jaeger Collector
Jaeger Query Service
为 Jaeger UI 和从存储中检索 traces 的应用程序接口提供服务
Jaeger Ingester
收集器的替代方案;从 Kafka 主题读取跨度并保存到存储中
jaeger-remote-storage
在另一个受支持的后端之上实现远程存储 API 的服务。可用于在多个 Jaeger 进程之间共享单节点存储后端(如内存)
- Jaeger 支持的存储后端
- 原生支持两种流行的开源 NoSQL 数据库作为跟踪存储后端:Cassandra 和 Elasticsearch
- 通过 gRPC API 与其他经认证符合 Jaeger 标准的知名数据库集成:TimescaleDB via Promscale、ClickHouse
- 使用 Badger 和简单的内存存储为测试设置提供嵌入式数据库支持
- 由于 ScyllaDB 使用相同的数据模型和查询语言,因此可直接替代 Cassandra
- 社区正在使用其他数据库进行实验,如 InfluxDB、Amazon DynamoDB 和 YugabyteDB(YCQL)
部署
All in One
部署的组件包括:
- Jaeger UI
- jaeger-collector
- jaeger-query
- jaeger-agent
- with an in memory storage component
docker run --rm --name jaeger \
-e COLLECTOR_ZIPKIN_HOST_PORT=:9411 \
-p 6831:6831/udp \
-p 6832:6832/udp \
-p 5778:5778 \
-p 16686:16686 \
-p 4317:4317 \
-p 4318:4318 \
-p 14250:14250 \
-p 14268:14268 \
-p 14269:14269 \
-p 9411:9411 \
jaegertracing/all-in-one:1.57
端口说明:
Port |
Protocol |
Component |
Function |
6831 |
UDP |
agent |
accept jaeger.thrift over Thrift-compact protocol (used by most SDKs) |
6832 |
UDP |
agent |
accept jaeger.thrift over Thrift-binary protocol (used by Node.js SDK) |
5775 |
UDP |
agent |
(deprecated) accept zipkin.thrift over compact Thrift protocol (used by legacy clients only) |
5778 |
HTTP |
agent |
serve configs (sampling, etc.) |
|
|
|
|
16686 |
HTTP |
query |
serve frontend |
|
|
|
|
4317 |
HTTP |
collector |
accept OpenTelemetry Protocol (OTLP) over gRPC |
4318 |
HTTP |
collector |
accept OpenTelemetry Protocol (OTLP) over HTTP |
14268 |
HTTP |
collector |
accept jaeger.thrift directly from clients |
14250 |
HTTP |
collector |
accept model.proto |
9411 |
HTTP |
collector |
Zipkin compatible endpoint (optional) |
docker run --rm -it --link jaeger \
-p8080-8083:8080-8083 \
-e OTEL_EXPORTER_OTLP_ENDPOINT="http://jaeger:4318" \
jaegertracing/example-hotrod:1.57 \
all --otel-exporter=otlp
- 访问 hotrod 示例应用:http://localhost:8080/ 点击如下链接会产生日志,日志中会展示链接
[find trace] [open trace]
- Rachel’s Floral Designs
- Trom Chocolatier
- xxx Desserts
- Amazing Coffee Roasters
- 访问 jaeger-query/UI:http://localhost:16686/
docker-compose
- 参考
- jaeger-docker-compose.yml
# version: '2'
# services:
# hotrod:
# image: jaegertracing/example-hotrod:1.57
# ports:
# - '8080:8080'
# - '8083:8083'
# command: ["-m","prometheus","all"]
# environment:
# - JAEGER_AGENT_HOST=jaeger-agent
# - JAEGER_AGENT_PORT=6831
# - JAEGER_SAMPLER_TYPE=remote
# - JAEGER_SAMPLING_ENDPOINT=http://jaeger-agent:5778/sampling
# depends_on:
# - jaeger-agent
# jaeger-collector:
# image: jaegertracing/jaeger-collector:1.57
# command:
# - "--cassandra.keyspace=jaeger_v1_dc1"
# - "--cassandra.servers=cassandra"
# - "--collector.zipkin.host-port=9411"
# - "--sampling.initial-sampling-probability=.5"
# - "--sampling.target-samples-per-second=.01"
# environment:
# - SAMPLING_CONFIG_TYPE=adaptive
# ports:
# - "14269:14269"
# - "14268:14268"
# - "14250"
# - "9411:9411"
# restart: on-failure
# depends_on:
# - cassandra-schema
# jaeger-query:
# image: jaegertracing/jaeger-query:1.57
# command: ["--cassandra.keyspace=jaeger_v1_dc1", "--cassandra.servers=cassandra"]
# ports:
# - "16686:16686"
# - "16687"
# restart: on-failure
# depends_on:
# - cassandra-schema
# jaeger-agent:
# image: jaegertracing/jaeger-agent:1.57
# command: ["--reporter.grpc.host-port=jaeger-collector:14250"]
# ports:
# - "5775:5775/udp"
# - "6831:6831/udp"
# - "6832:6832/udp"
# - "5778:5778"
# restart: on-failure
# depends_on:
# - jaeger-collector
# cassandra:
# image: cassandra:4.0
# cassandra-schema:
# image: jaegertracing/jaeger-cassandra-schema:1.57
# depends_on:
# - cassandra
version: '3.7'
services:
jaeger:
image: jaegertracing/all-in-one:1.57
ports:
- "6831:6831/udp"
- "6832:6832/udp"
- "5778:5778"
- "16686:16686"
- "4317:4317"
- "4318:4318"
- "14250:14250"
- "14268:14268"
- "14269:14269"
- "9411:9411"
environment:
- COLLECTOR_ZIPKIN_HOST_PORT=:9411
networks:
- jaeger-net
hotrod:
image: jaegertracing/example-hotrod:1.57
ports:
- "8080:8080"
- "8081:8081"
- "8082:8082"
- "8083:8083"
command: ["all", "--otel-exporter=otlp"]
environment:
- OTEL_EXPORTER_OTLP_ENDPOINT="http://jaeger:4318"
networks:
- jaeger-net
depends_on:
- jaeger
networks:
jaeger-net:
docker-compose up -d
Kubernetes
通过 jaegertracing/jaeger-operator 部署,详细参考
# 1. deploy ingress-nginx
# 2. deploy jaeger operator
kubectl create namespace observability # <1>
kubectl create -f https://github.com/jaegertracing/jaeger-operator/releases/download/v1.57.0/jaeger-operator.yaml -n observability # <2>
# 3. Deploying the AllInOne image
kubectl apply -n observability -f - <<EOF
apiVersion: jaegertracing.io/v1
kind: Jaeger
metadata:
name: simplest
EOF