作者:Yuri Shkuro
最新的Jaeger v1.35 版本[1]引入了通过OpenTelemetry 协议(OTLP)[2]接收 OpenTelemetry 追踪数据的能力,所有 OpenTelemetry SDK 都需要支持该协议。这是之前宣布淘汰 Jaeger“经典”客户端库[3]的后续。
有了这项新功能,不再需要将 Jaeger 导出器与 OpenTelemetry SDK 一起使用,也不再需要在 Jaeger 后端运行 OpenTelemetry 收集器。使用 OTLP 导出器,SDK 可以配置为将数据直接发送到 Jaeger 后端。OTLP 接收器通过 gRPC 或 HTTP 端点接受数据。
Primer
让我们来看看这个功能的运行情况。首先,按照入门文档[4]中的说明启动 Jaeger 一体机:
代码语言:javascript复制docker run --name jaeger
-e COLLECTOR_OTLP_ENABLED=true
-p 16686:16686
-p 4317:4317
-p 4318:4318
jaegertracing/all-in-one:1.35
请注意,与以前的版本相比:
- 导出列表中还添加了两个端口,4317 和 4318,OTLP 接收器使用它们来监听 gRPC 和 HTTP 连接。
- OTLP 接收器必须通过 COLLECTOR_OTLP_ENABLED=true 使能。
- 我们删除了与本例无关的其他端口。
当 Jaeger 后端启动时,你应该会看到这两行日志:
代码语言:javascript复制{... "msg":"Starting GRPC server on endpoint 0.0.0.0:4317"}
{... "msg":"Starting HTTP server on endpoint 0.0.0.0:4318"}
和往常一样,Jaeger UI 可以在http://localhost:16686/访问。
现在让我们使用一个简单的 Python 程序,它用 OTLPSpanExporter 配置 OpenTelemetry SDK 并生成一个单跨度追踪。
代码语言:javascript复制from opentelemetry import trace
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor
from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter
trace.set_tracer_provider(TracerProvider())
trace.get_tracer_provider().add_span_processor(
BatchSpanProcessor(OTLPSpanExporter())
)
tracer = trace.get_tracer(__name__)
with tracer.start_as_current_span("foo"):
print("Hello world!")
basic_trace.py
代码语言:javascript复制opentelemetry-api
opentelemetry-sdk
opentelemetry-exporter-otlp-proto-http
requirements.txt
按如下方式运行该程序:
代码语言:javascript复制pip install -r requirements.txt
OTEL_SERVICE_NAME=primer python3 basic_trace.py
如果我们现在刷新 Jaeger UI 中的搜索屏幕,服务下拉列表应该包含服务 primer(请注意,我们通过环境变量将此服务名称传递给 SDK),来自此服务的追踪应该如下所示:
通过 OTLP 提交的样本追踪。
OTLP 接收器可以通过以--collector.otlp.*开头的多个标志进一步定制,这些标志可以通过收集器和 all-in-one 二进制文件中的 help 命令获得。这些标志允许更改两个 OTLP 服务器的端口号,配置 TLS,以及更改一些其他参数,如最大消息大小和保持活动状态。
限制
现有的实现有一些注意事项:
- 如果你的应用程序使用 OTLP 导出追踪和指标,那么你仍然需要运行 OpenTelemetry 收集器,因为 Jaeger 收集器只能接受 OTLP 数据的追踪部分。或者,你可以用指向不同后端的两个 OTLP 导出器来配置 SDK。
- Jaeger 后端并不支持 OpenTelemetry 收集器中 OTLP 接收器支持的所有选项。
- 只有 Jaeger 收集器支持新的 OTLP 接收器。Jaeger 代理仅支持“经典”Jaeger 格式。如果你的部署需要本地代理,我们建议运行 OpenTelemetry 收集器。
参考资料
[1]
Jaeger v1.35 版本: https://github.com/jaegertracing/jaeger/releases/tag/v1.35.0
[2]
OpenTelemetry 协议(OTLP): https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/protocol/otlp.md
[3]
宣布淘汰 Jaeger“经典”客户端库: https://twitter.com/YuriShkuro/status/1455170693197402119
[4]
入门文档: https://www.jaegertracing.io/docs/latest/getting-started/
[5]
聊天室: https://www.jaegertracing.io/get-in-touch/
CNCF (Cloud Native Computing Foundation)成立于2015年12月,隶属于Linux Foundation,是非营利性组织。
CNCF(云原生计算基金会)致力于培育和维护一个厂商中立的开源生态系统,来推广云原生技术。我们通过将最前沿的模式民主化,让这些创新为大众所用。