Skip to main content

Opentelemetry全链路追踪组件 (Tracing)

1. 简介​

1.1 什么是分布式追踪?​

分布式追踪是一种记录系统的运行状态的机制,它可以帮助开发人员排查问题,并了解系统的性能。

分布式追踪的关键是记录每个请求的上下文信息,包括请求的源和目的地,请求的处理时间,请求的结果等。

1.2 什么是 OpenTelemetry?​

OpenTelemetry 是由 OpenCensus 和 OpenTracing 组成的开源项目,用于在分布式系统中收集、传输和处理遥测数据。 OpenTelemetry 定义了统一的 API,以便在各种语言和运行时中使用。

1.3 如何使用 OpenTelemetry?​

jvm 参数​

-javaagent:/path/opentelemetry-javaagent.jar -Dotel.traces.exporter=otlp -Dotel.exporter.otlp.endpoint=otlp_endpoint -Dotel.resource.attributes=service.name=service_name,username=username javaagent是指定javaagent的路径,可以使用相对路径或绝对路径。 otel.traces.exporter是指定追踪数据的输出方式,目前支持otlp、jaeger、zipkin、none等方式。 otel.exporter.otlp.endpoint是指定otlp的输出地址,格式为 http://ip:port。 otel.resource.attributes是指定追踪数据的属性,可以指定多个,格式为key=value。

例子:​

-javaagent:C:/Users/dante/IdeaProjects/github/observable-demo/opentelemetry-javaagent/opentelemetry-javaagent-1.32.0.jar
-Dotel.traces.exporter=otlp
-Dotel.exporter.otlp.endpoint=http://10.100.0.107:4317
-Dotel.resource.attributes=service.name=demo,username=yy

OpenTelemetry 参数​

trace.exporter.host是指定追踪数据的输出地址,格式为ip。 trace.exporter.port是指定追踪数据的输出端口,格式为port。

例子:​

--trace.exporter.host=10.100.0.107 --trace.exporter.port=4317

trace.exporter.host和otel.exporter.otlp.endpoint参数的区别​

trace.exporter.host 通常用于配置追踪数据的导出目标主机的地址,例如指定远程的追踪数据接收端的主机地址。

otel.exporter.otlp.endpoint 则是用于配置 OpenTelemetry Protocol (OTLP) 导出器的端点地址,用于指定追踪数据的发送目标地址,通常包括主机名和端口号。

因此,trace.exporter.host 主要用于指定追踪数据的目标主机地址,而 otel.exporter.otlp.endpoint 则用于配置 OTLP 导出器的端点地址。

1.4 如何在日志中打印追踪数据traceId和spanId​

在logback-spring.xml中的pattern中添加[traceId=%X{trace_id} spanId=%X{span_id}]即可。

<property name="FILE_LOG_PATTERN" value="%d{HH:mm:ss} [%thread] %-5level %logger{10} [traceId=%X{trace_id} spanId=%X{span_id}] %msg%n" />

1.5 使用jaeger UI查看追踪数据​

在浏览器中输入 http://ip:16686,即可打开 jaeger UI,查看追踪数据。

jaegerui.png

1.6 开关功能​

禁用某些代理

可以使用命令行参数或环境变量禁用代理。要禁用代理,请将以下内容添加到命令行参数中 -Dotel.instrumentation.[name].enabled=false 例如,要禁用 Spring Web MVC 代理,可以使用以下命令行参数: -Dotel.instrumentation.spring-web-mvc.enabled=false

使用环境变量时,将 [name] 替换为检测的名称。 OTEL_INSTRUMENTATION_[NAME]_ENABLED=false 例如,要禁用 Spring Web MVC 代理,可以使用以下环境变量: OTEL_INSTRUMENTATION_SPRING_WEB_MVC_ENABLED=false

1.7 otel支持的组件​

官方支持的组件

1.8 如何使用docker-compose搭建opentelemetry-collector以及jaeger?​

version: '3'
services:
jaeger:
image: jaegertracing/all-in-one:latest
container_name: otel_collector_jaeger
ports:
- 16686
- 14250
- 14268
# environment:
# - COLLECTOR_GRPC_PORT=14250 # gRPC 端口
# - COLLECTOR_HTTP_PORT=14268 # HTTP 端口

otel-collector:
image: otel/opentelemetry-collector-contrib:latest
container_name: otel_collector
volumes:
- ./otel-collector-config.yaml:/etc/otel-collector-config.yaml
ports:
- "8888:8888" # Prometheus metrics exposed by the collector
- "8889:8889" # Prometheus exporter metrics
- "4317:4317" # OTLP gRPC receiver
- "1888:1888" # pprof extension
- "13133:13133" # health_check extension
- "55679:55679" # zpages extension
depends_on:
- jaeger

otel-collector-config.yaml配置如下:

receivers:
otlp:
protocols:
grpc:
http:

exporters:
logging:
jaeger:
endpoint: otel_collector_jaeger:14250
tls:
insecure: true

processors:
batch:

service:
extensions: [pprof, zpages, health_check]
pipelines:
traces:
receivers: [otlp]
processors: [batch]
exporters: [logging, jaeger]

extensions:
health_check:
endpoint: :13133
pprof:
endpoint: :1888
zpages:
endpoint: :55679