部署
另请参阅
Jaeger 后端主要组件已作为 Docker 镜像发布在 Docker Hub 和 Quay 上
上面列出的镜像是主要的发布版本。大多数组件还发布了额外的镜像
${component}-debug
镜像包含 Delve 调试器${component}-snapshot
镜像是针对主分支的每次提交发布的,允许测试未发布的版本${component}-debug-snapshot
快照镜像包含 Delve 调试器
有用于运行 Jaeger 的编排模板:
- Kubernetes: github.com/jaegertracing/jaeger-kubernetes ,
- OpenShift: github.com/jaegertracing/jaeger-openshift 。
配置选项
Jaeger 二进制文件可以通过多种方式配置(优先级递减顺序如下)
- 命令行参数,
- 环境变量,
- JSON、TOML、YAML、HCL 或 Java properties 格式的配置文件。
要查看完整的选项列表,请运行带有 help
命令的二进制文件或参阅 CLI 参数 页面了解更多信息。特定于某个存储后端的选项仅在选择了相应的存储类型时列出。例如,要查看使用 Cassandra 存储时 Collector 中的所有可用选项:
$ docker run --rm \
-e SPAN_STORAGE_TYPE=cassandra \
jaegertracing/jaeger-collector:1.69.0 \
help
为了通过环境变量提供配置参数,请找到相应的命令行选项并将其名称转换为 UPPER_SNAKE_CASE,例如
命令行选项 | 环境变量 |
---|---|
--cassandra.connections-per-host | CASSANDRA_CONNECTIONS_PER_HOST |
--metrics-backend | METRICS_BACKEND |
一体化 (All-in-one)
Jaeger all-in-one 是一种特殊的发行版,它将 Jaeger 的三个组件(collector 和 query service/UI)组合在一个二进制文件或容器镜像中。它适用于单节点部署,当您的跟踪数据量较轻时,单个实例即可处理。默认情况下,all-in-one 使用 memory
存储,这意味着重启后所有数据都将丢失。所有其他span 存储后端也可以与 all-in-one 一起使用,但 memory
和 badger
是 all-in-one 特有的,因为它们不能在多个实例之间共享。
All-in-one 监听其包含的组件所使用的相同端口(如下所述),但管理端口除外。
端口 | 协议 | 功能 |
---|---|---|
14269 | HTTP | 管理端口:/ 路径的健康检查和 /metrics 路径的指标 |
## make sure to expose only the ports you use in your deployment scenario!
docker run -d --name jaeger \
-e COLLECTOR_OTLP_ENABLED=true \
-e COLLECTOR_ZIPKIN_HOST_PORT=:9411 \
-p 5775:5775/udp \
-p 6831:6831/udp \
-p 6832:6832/udp \
-p 5778:5778 \
-p 16686:16686 \
-p 14250:14250 \
-p 14268:14268 \
-p 14269:14269 \
-p 4317:4317 \
-p 4318:4318 \
-p 9411:9411 \
jaegertracing/all-in-one:1.69.0
您可以导航到 http://localhost:16686
访问 Jaeger UI。
Collector
jaeger-collector 是无状态的,因此可以并行运行多个 jaeger-collector 实例。 jaeger-collector 几乎不需要配置,除了存储位置,例如 --cassandra.keyspace
和 --cassandra.servers
选项,或者 Elasticsearch 集群的位置(通过 --es.server-urls
),具体取决于指定的存储类型。参阅 CLI 参数 了解所有命令行选项。
在默认设置下 jaeger-collector 暴露以下端口
端口 | 协议 | 端点 | 功能 |
---|---|---|---|
4317 | gRPC | n/a | 接受 OpenTelemetry OTLP 格式 (Protobuf) 的跟踪数据。 |
4318 | HTTP | /v1/traces | 接受 OpenTelemetry OTLP 格式 (Protobuf 和 JSON) 的跟踪数据。 |
14268 | HTTP | /api/sampling | 提供采样策略(参阅 远程采样)。 |
/api/traces | 接受使用 binary thrift 协议(POST )的 jaeger.thrift 格式的 spans。 | ||
14269 | HTTP | / | 管理端口:健康检查(GET )。 |
/metrics | Prometheus 风格的指标(GET )。 | ||
9411 | HTTP | /api/v1/spans 和 /api/v2/spans | 接受 Thrift、JSON 和 Proto 格式的 Zipkin spans(默认禁用)。 |
14250 | gRPC | n/a | 接受 model.proto Protobuf 格式的 spans。 |
Ingester
jaeger-ingester 是一个从 Kafka topic 读取 span 数据并将其写入另一个存储后端(Elasticsearch 或 Cassandra)的服务。
端口 | 协议 | 功能 |
---|---|---|
14270 | HTTP | 管理端口:/ 路径的健康检查和 /metrics 路径的指标 |
要查看所有暴露的配置选项,请运行以下命令
docker run \
-e SPAN_STORAGE_TYPE=cassandra \
jaegertracing/jaeger-ingester:1.69.0
--help
查询服务 & UI
jaeger-query 提供 API 端点和基于 React/Javascript 的 UI。该服务是无状态的,通常运行在负载均衡器后面,例如 NGINX 。
在默认设置下 jaeger-query 服务暴露以下端口
端口 | 协议 | 功能 |
---|---|---|
16685 | gRPC | Protobuf/gRPC QueryService |
16686 | HTTP | /api/* 端点和 / 路径的 Jaeger UI |
16687 | HTTP | 管理端口:/ 路径的健康检查和 /metrics 路径的指标 |
最小化部署示例(Elasticsearch 后端)
docker run -d --rm \
-p 16685:16685 \
-p 16686:16686 \
-p 16687:16687 \
-e SPAN_STORAGE_TYPE=elasticsearch \
-e ES_SERVER_URLS=http://<ES_SERVER_IP>:<ES_SERVER_PORT> \
jaegertracing/jaeger-query:1.69.0
时钟偏差调整
Jaeger 后端会合并通常运行在不同主机上的应用程序的跟踪数据。主机上的硬件时钟经常会出现相对漂移,这被称为 时钟偏差效应 。时钟偏差会使理解跟踪变得困难,例如,服务器 span 可能会出现在客户端 span 之前开始,而这本不应发生。jaeger-query 服务实现了一种 时钟偏差调整 算法(代码 )来纠正时钟漂移,该算法利用了 spans 之间的因果关系知识。所有调整过的 spans 在 UI 中都会显示一个警告,提供应用于其时间戳的精确时钟偏差增量。
有时这些调整本身会使跟踪难以理解。例如,在父 span 的范围内重新定位服务器 span 时,Jaeger 不知道请求和响应延迟之间的确切关系,因此它假设它们相等并将子 span 放在父 span 的中间(参阅 issue #961 )。
jaeger-query 服务支持一个配置标志 --query.max-clock-skew-adjustment
,它控制允许的时钟偏差调整量。将此参数设置为零(0s
)会完全禁用时钟偏差调整。此设置适用于从给定查询服务检索的所有跟踪。有一个未解决的 ticket #197 支持直接在 UI 中切换调整的启用/禁用。
UI 基础路径
所有 jaeger-query HTTP 路由的基础路径可以设置为非根值,例如 /jaeger
会使所有 UI URL 都以 /jaeger
开头。这在使用反向代理运行 jaeger-query 时很有用。
基础路径可以通过 --query.base-path
命令行参数或 QUERY_BASE_PATH
环境变量进行配置。
UI 定制和嵌入
请参阅专门的 前端/UI 页面。
远程存储(组件)
jaeger-remote-storage 实现了 远程存储 gRPC API 并将其代理到常规的 Jaeger 后端之一。这在想要运行 Jaeger 组件的完整部署(例如,单独的 collector 和 query 服务),但使用单节点存储后端(如 memory 存储或 Badger)的情况下非常有用。如果没有远程存储,单节点后端只能与 all-in-one 一起使用,因为它们无法在多个进程之间共享。
在默认设置下,服务监听以下端口
端口 | 协议 | 功能 |
---|---|---|
17271 | gRPC | 远程存储 API |
17270 | HTTP | 管理端口:/ 路径的健康检查和 /metrics 路径的指标 |
Span 存储后端
Jaeger 需要一个持久化存储后端。Cassandra 和 Elasticsearch/OpenSearch 是主要支持的分布式存储后端。额外的后端 在此处讨论 。
存储类型可以通过 SPAN_STORAGE_TYPE
环境变量传入。有效值包括 cassandra
、elasticsearch
、kafka
(仅作为缓冲区)、badger
和 memory
。
从版本 1.6.0 开始,可以通过向 SPAN_STORAGE_TYPE
环境变量提供逗号分隔的有效类型列表来同时使用多种存储类型。重要的是要注意,所有列出的存储类型都用于写入,但列表中只有第一个类型将用于读取和归档。
对于大规模生产部署,Jaeger 团队 推荐 OpenSearch 后端而非 Cassandra。
内存
内存存储不适用于生产工作负载。它旨在作为快速入门的简单解决方案,进程退出后数据将丢失。
默认情况下,存储在内存中的跟踪数量没有限制,但可以通过 --memory.max-traces
传递一个整数值来设置限制。
Badger - 本地存储
- 自 Jaeger v1.9 起
Badger 是一种嵌入式本地存储,仅适用于 all-in-one 分发版。默认情况下,它使用临时文件系统作为临时存储。这可以通过使用 --badger.ephemeral=false
选项来覆盖。
docker run \
-e SPAN_STORAGE_TYPE=badger \
-e BADGER_EPHEMERAL=false \
-e BADGER_DIRECTORY_VALUE=/badger/data \
-e BADGER_DIRECTORY_KEY=/badger/key \
-v <storage_dir_on_host>:/badger \
-p 16686:16686 \
jaegertracing/all-in-one:1.69.0
Cassandra
- 支持的版本:4.x, 5.x
部署 Cassandra 本身不在我们的文档范围之内。一个很好的文档来源是 Apache Cassandra 文档 。
配置
最小配置
docker run \
-e SPAN_STORAGE_TYPE=cassandra \
-e CASSANDRA_SERVERS=<...> \
jaegertracing/jaeger-collector:1.69.0
注意:CASSANDRA_SERVERS
允许使用空白字符。例如:服务器可以传递为 CASSANDRA_SERVERS=“1.2.3.4, 5.6.7.8”
以提高可读性。
所有选项
要查看完整的配置选项列表,请运行以下命令
docker run \
-e SPAN_STORAGE_TYPE=cassandra \
jaegertracing/jaeger-collector:1.69.0 \
--help
Schema 脚本
提供了使用 Cassandra 交互式 shell cqlsh
初始化 Cassandra keyspace 和 schema 的脚本
MODE=test sh ./internal/storage/v1/cassandra/schema/create.sh | cqlsh
或使用发布的 Docker 镜像(确保提供正确的 IP 地址)
docker run \
-e CQLSH_HOST={server IP address} \
jaegertracing/jaeger-cassandra-schema:1.69.0
对于生产部署,向脚本传递 MODE=prod DATACENTER={datacenter}
参数,其中 {datacenter}
是 Cassandra 配置/网络拓扑中使用的名称。
该脚本还允许覆盖 TTL、keyspace 名称、复制因子等。不带参数运行脚本可查看所有识别的参数列表。
注意:有关 Cassandra schema 管理的更多详细信息,请参阅 README 。
TLS 支持
只要您正确配置了 Cassandra 集群,Jaeger 就支持 TLS 客户端到节点的连接。例如,使用 cqlsh
验证后,您可以像这样配置 collector 和 query
docker run \
-e CASSANDRA_SERVERS=<...> \
-e CASSANDRA_TLS=true \
-e CASSANDRA_TLS_SERVER_NAME="CN-in-certificate" \
-e CASSANDRA_TLS_KEY=<path to client key file> \
-e CASSANDRA_TLS_CERT=<path to client cert file> \
-e CASSANDRA_TLS_CA=<path to your CA cert file> \
jaegertracing/jaeger-collector:1.69.0
schema 工具也支持 TLS。您需要像这样创建一个自定义的 cqlshrc 文件
# Creating schema in a cassandra cluster requiring client TLS certificates.
#
# Create a volume for the schema docker container containing four files:
# cqlshrc: this file
# ca-cert: the cert authority for your keys
# client-key: the keyfile for your client
# client-cert: the cert file matching client-key
#
# if there is any sort of DNS mismatch and you want to ignore server validation
# issues, then uncomment validate = false below.
#
# When running the container, map this volume to /root/.cassandra and set the
# environment variable CQLSH_SSL=--ssl
[ssl]
certfile = ~/.cassandra/ca-cert
userkey = ~/.cassandra/client-key
usercert = ~/.cassandra/client-cert
# validate = false
兼容的后端
- ScyllaDB 可以作为 Cassandra 的直接替代品,因为它使用相同的数据模型和查询语言。
Elasticsearch
- 自 Jaeger v0.6.0 起支持
- 支持的 ES 版本:7.x, 8.x (自 Jaeger v1.52.0 起)
Elasticsearch 版本会自动从 root/ping 端点检索。基于此版本,Jaeger 使用兼容的索引映射和 Elasticsearch REST API。可以通过 --es.version=
标志显式提供版本。
除了安装和运行 Elasticsearch 外,Elasticsearch 不需要额外初始化。运行后,将正确的配置值传递给 jaeger-collector 和 jaeger-query。
配置
最小配置
docker run \
-e SPAN_STORAGE_TYPE=elasticsearch \
-e ES_SERVER_URLS=<...> \
jaegertracing/jaeger-collector:1.69.0
所有选项
要查看完整的配置选项列表,请运行以下命令
docker run \
-e SPAN_STORAGE_TYPE=elasticsearch \
jaegertracing/jaeger-collector:1.69.0 \
--help
Elasticsearch 索引的分片和副本
分片和副本是一些需要特别注意的配置值,因为它们在索引创建时决定。这篇文章 详细介绍了如何选择分片数量以进行优化。
Elasticsearch 索引滚动
Elasticsearch 滚动 是一种索引管理策略,用于优化分配给索引的资源使用。例如,不包含任何数据的索引仍然分配分片,反之,单个索引可能包含比其他索引多得多的数据。Jaeger 默认将数据存储在每日索引中,这可能无法最佳地利用资源。可以通过 --es.use-aliases=true
启用滚动功能。
滚动允许您根据以下一个或多个条件配置何时滚动到新索引
max_age
- 索引的最大年龄。它使用时间单位 :d
,h
,m
。max_docs
- 索引中的最大文档数。max_size
- 主分片的最大估计大小(自 Elasticsearch 6.x 起)。它使用字节单位tb
,gb
,mb
。
索引滚动管理策略比使用默认的每日索引更复杂,它需要一个初始化作业来准备存储,以及两个 cron 作业来管理索引。
要了解更多关于 Jaeger 中索引滚动管理的信息,请参考这篇文章 。
对于自动化滚动,请参考Elasticsearch ILM 支持。
初始化
以下命令通过创建索引别名、索引和索引模板来准备 Elasticsearch 进行滚动部署
docker run -it --rm --net=host jaegertracing/jaeger-es-rollover:latest init http://localhost:9200 # <1>
如果需要初始化归档存储,请添加 -e ARCHIVE=true
。
初始化后,可以使用 --es.use-aliases=true
部署 Jaeger。
滚动到新索引
下一步是定期执行滚动 API,该 API 根据提供的条件将写入别名滚动到新索引。该命令还将新索引添加到读取别名,以便新数据可供搜索。
docker run -it --rm --net=host -e CONDITIONS='{"max_age": "2d"}' jaegertracing/jaeger-es-rollover:latest rollover http://localhost:9200 # <1>
<1> 如果当前写入索引的年龄超过 2 天,该命令会将别名滚动到新索引。更多条件请参阅Elasticsearch 文档 。
下一步是从读取别名中移除旧索引。这意味着旧数据将不可用于搜索。这模拟了默认每日索引部署中使用的 --es.max-span-age
标志的行为。此步骤可能是可选的,旧索引可以在下一步中由索引清理器直接删除。
docker run -it --rm --net=host -e UNIT=days -e UNIT_COUNT=7 jaegertracing/jaeger-es-rollover:latest lookback http://localhost:9200 # <1>
<1> 从读取别名中移除早于 7 天的索引。
移除旧数据
历史数据可以使用 jaeger-es-index-cleaner
移除,该工具也用于每日索引。
docker run -it --rm --net=host -e ROLLOVER=true jaegertracing/jaeger-es-index-cleaner:latest 14 http://localhost:9200 # <1>
<1> 移除早于 14 天的索引。
Elasticsearch ILM 支持
在release v1.22.0 中添加的实验性功能。
支持的 Elasticsearch 版本:7.x
例如
- 根据大小(字节或文档数量)或年龄滚动到新索引,并归档旧索引
- 删除过期索引以强制执行数据保留标准
启用 ILM 支持
在 Elasticsearch 中创建一个名为 jaeger-ilm-policy 的 ILM 策略。
例如,以下策略将在“活动”索引的年龄超过 1 分钟时将其滚动,并删除年龄超过 2 分钟的索引。
curl -X PUT http://localhost:9200/_ilm/policy/jaeger-ilm-policy \ -H 'Content-Type: application/json; charset=utf-8' \ --data-binary @- << EOF { "policy": { "phases": { "hot": { "min_age": "0ms", "actions": { "rollover": { "max_age": "1m" }, "set_priority": { "priority": 100 } } }, "delete": { "min_age": "2m", "actions": { "delete": {} } } } } } EOF
使用
ES_USE_ILM=true
运行 Elasticsearch 初始化器docker run -it --rm --net=host -e ES_USE_ILM=true jaegertracing/jaeger-es-rollover:latest init http://localhost:9200 # <1>
<1> 如果需要初始化归档存储,请添加
-e ARCHIVE=true
。在使用 ILM 支持进行初始化时,请确保事先在 Elasticsearch 中创建了一个名为
jaeger-ilm-policy
的 ILM 策略(参见上一步),否则将显示以下错误消息“ILM policy jaeger-ilm-policy doesn’t exist in Elasticsearch. Please create it and rerun init”
初始化后,使用
--es.use-ilm=true
和--es.use-aliases=true
部署 Jaeger。
升级 Elasticsearch 版本
Elasticsearch 定义了线协议和索引兼容性版本。索引兼容性定义了节点可以从中读取数据的最低版本。例如,Elasticsearch 8 可以读取由 Elasticsearch 7 创建的索引,但即使使用相同的索引映射,它也无法读取由 Elasticsearch 6 创建的索引。因此,从 Elasticsearch 7 升级到 8 不需要任何数据迁移。但是,从 Elasticsearch 6 升级到 8 必须通过 Elasticsearch 7 进行,并等待由 ES 6.x 创建的索引被删除或显式重建索引。
有关线协议和索引兼容性版本,请参考 Elasticsearch 文档 。通常可以从 root/ping REST 端点检索此信息。
重建索引 (Reindex)
从 Elasticsearch 6 升级到 8(通过 Elasticsearch 7)时,可以使用手动重建索引,而无需等待由 Elasticsearch 6 创建的索引被删除。
将所有 span 索引重建到带后缀
-1
的新索引中curl -ivX POST -H "Content-Type: application/json" http://localhost:9200/_reindex -d @reindex.json { "source": { "index": "jaeger-span-*" }, "dest": { "index": "jaeger-span" }, "script": { "lang": "painless", "source": "ctx._index = 'jaeger-span-' + (ctx._index.substring('jaeger-span-'.length(), ctx._index.length())) + '-1'" } }
删除带有旧映射的索引
curl -ivX DELETE -H "Content-Type: application/json" http://localhost:9200/jaeger-span-\*,-\*-1
创建不带
-1
后缀的索引curl -ivX POST -H "Content-Type: application/json" http://localhost:9200/_reindex -d @reindex.json { "source": { "index": "jaeger-span-*" }, "dest": { "index": "jaeger-span" }, "script": { "lang": "painless", "source": "ctx._index = 'jaeger-span-' + (ctx._index.substring('jaeger-span-'.length(), ctx._index.length() - 2))" } }
删除带后缀的索引
curl -ivX DELETE -H "Content-Type: application/json" http://localhost:9200/jaeger-span-\*-1
对其他 Jaeger 索引也类似地运行这些命令。
可能存在更有效的迁移过程。请与社区分享任何发现。
Kafka
- 自 Jaeger 1.6.0 起支持
- 支持的 Kafka 版本:0.9+
Kafka 可以用作 collector 和实际存储之间的中间缓冲。将 jaeger-collector 配置为 SPAN_STORAGE_TYPE=kafka
会使其将所有接收到的 span 写入 Kafka topic。jaeger-ingester 用于从 Kafka 读取并将 span 存储到另一个存储后端(Elasticsearch 或 Cassandra)。
将数据写入 Kafka 对于构建后处理数据管道特别有用。
配置
最小配置
docker run \
-e SPAN_STORAGE_TYPE=kafka \
-e KAFKA_PRODUCER_BROKERS=<...> \
-e KAFKA_TOPIC=<...> \
jaegertracing/jaeger-collector:1.69.0
所有选项
要查看完整的配置选项列表,请运行以下命令
docker run \
-e SPAN_STORAGE_TYPE=kafka \
jaegertracing/jaeger-collector:1.69.0 \
--help
Topic 和 分区
除非您的 Kafka 集群配置为自动创建 topic,否则您需要提前创建它。您可以参考Kafka 快速入门文档 了解如何操作。
您可以在官方文档 中找到有关 topic 和分区的一般信息。这篇文章 提供了关于如何选择分区数量的更多详细信息。
远程存储
Jaeger 支持基于 gRPC 的远程存储 API ,它允许使用项目不直接支持的自定义存储后端扩展 Jaeger 生态系统。这些存储后端可以部署为远程 gRPC 服务器(自 Jaeger v1.30 起)。从 v1.58 开始将不再支持旧的 sidecar 插件部署模式。
要将远程存储用作 Jaeger 存储后端,请使用 grpc
作为存储类型并指定远程 gRPC 服务器地址。更多信息请参考internal/storage/v1/grpc 。
示例
docker run \
-e SPAN_STORAGE_TYPE=grpc \
-e GRPC_STORAGE_SERVER=<...> \
jaegertracing/all-in-one:1.69.0
已知的远程存储后端
指标存储后端
Jaeger Query 能够从存储后端查询聚合的 R.E.D 指标,并在Monitor 选项卡上可视化它们。需要强调的是,配置的指标存储类型仅用于读取,因此只适用于 Jaeger Query 组件(以及包含 Jaeger Query 的 All In One)。
可以通过 METRICS_STORAGE_TYPE
环境变量传递存储类型。有效值为:prometheus
。
Prometheus
Jaeger Query 支持任何 PromQL 兼容的后端。Julius Volz 在此文章中汇编了这些后端的列表:https://promlabs.com/blog/2020/11/26/an-update-on-promql-compatibility-across-vendors
配置
最小配置
docker run \
-e METRICS_STORAGE_TYPE=prometheus \
jaegertracing/jaeger-query:1.69.0
所有选项
要查看完整的配置选项列表,请运行以下命令
docker run \
-e METRICS_STORAGE_TYPE=prometheus \
jaegertracing/jaeger-query:1.69.0 \
--help
TLS 支持
只要您正确配置了 Prometheus 服务器 ,Jaeger 就支持 TLS 客户端到 Prometheus 服务器的连接。您可以像这样配置 jaeger-query
docker run \
-e METRICS_STORAGE_TYPE=prometheus \
-e PROMETHEUS_SERVER_URL=<...> \
-e PROMETHEUS_TLS_ENABLED=true \
-e PROMETHEUS_TLS_CA=<path to your CA cert file> \
jaegertracing/jaeger-query:1.69.0
服务依赖关系的聚合作业
生产部署需要一个外部进程来聚合数据并创建服务之间的依赖关系链接。spark-dependencies 项目是一个 Spark 作业,用于派生依赖关系链接并将其直接写入存储。