在 JDK8 + springboot2.7.9 的环境中使用时版本兼容性如下:
JDK |
springboot |
|---|---|
| 1.8 | 2.7.9 |
opentelemetry-javaagent |
otel/opentelemetry-collector-contrib |
|---|---|
| 2.9.0 | 0.112.0 |
| 2.16.0 | 0.126.0 |
java有多种接入接入方式,其中最简单的方式是使用 opentelemetry-java-instrumentation ,但这也已经能基本满足需求。
引用自 ChatGPT
使用
opentelemetry-java-instrumentation时,整个链路中不需要在请求拦截器中手动处理trace id和span id。这部分工作会由 OpenTelemetry 的 Java Agent 自动完成。只需在日志配置中做相应的配置,就可以自动捕获和记录trace id和span id。具体原因是:
自动追踪与上下文传播:
opentelemetry-java-instrumentation代理会自动为应用中的请求链路创建和传递trace id和span id。它支持常用框架(如 Spring、gRPC、HTTP 客户端等),会自动创建span并将上下文信息通过 W3C Trace Context 或 B3 Headers 等标准格式在不同服务间传播。日志集成自动注入 MDC: Java Agent 默认将当前上下文的
trace id和span id注入到 MDC 中,因此只需在日志配置中通过%X{trace_id}和%X{span_id}引用这些字段,就可以在日志中看到完整的追踪信息,无需手动添加。所以,除非有特殊的自定义需求(如增加额外的属性到
span),一般无需在代码中显式处理trace id和span id。
使用方法:
- 在
application.yml中配置logging.pattern.level参数为:%5p [%X{trace_id:-NoTrace},%X{span_id:-NoSpan},%X{trace_flags:-NoFlags}](可以按照实际需求调整) - 在
jvm option中添加参数:-javaagent:/path/to/opentelemetry-javaagent.jar -Dotel.exporter.otlp.endpoint=http://127.0.0.1:4317otel.exporter.otlp.endpoint也可以使用环境变量OTEL_EXPORTER_OTLP_ENDPOINT设置
- 按照实际需求配置
receivers、exporters、processors、service - 通过
command设置配置文件路径,如:--config=/etc/config.yml - 按照实际
receiver配置映射端口,如:- 4317:
OLTP gRPC - 4318:
OLTP HTTP
- 4317:
# 开启HTTP数据流以配合grafana
stream_over_http_enabled: true
## 对外服务接口配置
server:
http_listen_port: 3200
# grpc_listen_port: 9095
log_level: info
## 数据来源配置
distributor:
receivers:
otlp:
protocols:
grpc:
http:
## 查询接口性能配置
query_frontend:
search:
duration_slo: 5s
throughput_bytes_slo: 1.073741824e+09 # 1.073741824 GB(约 1 GB)
trace_by_id:
duration_slo: 5s
## 数据压缩相关
compactor:
compaction:
block_retention: 24h # 配置存储中的数据保留时间
## 存储相关
storage:
trace:
backend: local
wal: # Write-Ahead Log 可以理解为在保存至目标存储前的临时存储
path: /var/tempo/wal
local:
path: /var/tempo/blocks- 创建如上配置文件 (该文件主要用于本地存储)
- 在docker环境中需要将工作文件夹的用户组信息改为
10001:10001,由于操作较为繁琐建议使用docker compose初始化工作目录 - 通过
command设置配置文件路径,如:-config=/etc/config.yml注意此处config前只有一条-与前面OTEL的配置不同 - 将配置文件和工作目录映射进容器