Jaeger 介绍

发布时间: 更新时间: 总字数:1495 阅读时间:3m 作者: IP上海 分享 网址

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

架构

jaeger-arch
  • 图片转载自 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)

部署

  • 官方提供二级制和 docker 镜像,参考

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/
jaeger-ui

docker-compose

  • 参考
  • jaeger-docker-compose.yml
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

参考

  1. https://jaegertracing.io/docs/
  2. https://www.jaegertracing.io/download/
Home Archives Categories Tags Statistics
本文总阅读量 次 本站总访问量 次 本站总访客数