用最小改动演示如何通过 OpenTelemetry SDK 自动埋点一个 Java 服务,并配置 Collector 把 trace 和日志推送进炬鲸 OBSERVE,附关键配置与常见坑。
先确认三样东西:一台能访问外网的服务器、一个炬鲸 OBSERVE 账号(拿到接入端点)、以及一个跑着 Java 服务的应用。本文以 Spring Boot 为例,其他语言思路一致,只换 SDK 和启动参数。
OpenTelemetry 对 Java 提供了 Java Agent,通过 -javaagent 参数在启动时自动注入埋点,覆盖 HTTP、数据库、消息队列等常见框架,业务代码一行不用改。下载 agent:
curl -LO https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/latest/download/opentelemetry-javaagent.jar
启动时加上参数,把数据先发到本地的 Collector:
java -javaagent:opentelemetry-javaagent.jar \
-Dotel.service.name=order-service \
-Dotel.traces.exporter=otlp \
-Dotel.metrics.exporter=none \
-Dotel.logs.exporter=none \
-Dotel.exporter.otlp.endpoint=http://localhost:4317 \
-jar app.jar
service.name 一定要设成稳定、语义化的名字,后面所有检索和告警都依赖它,别用默认的 unknown_service。
Agent 只负责采集,落地到平台由 Collector 完成。装一个 Collector,写入下面配置:
receivers:
otlp:
protocols: { grpc: { endpoint: 0.0.0.0:4317 } }
processors:
batch:
resource:
attributes:
- key: deployment.environment
value: production
action: upsert
exporters:
otlphttp:
endpoint: https://ob.jjhub.cn/otel
headers:
authorization: Bearer <你的接入令牌>
service:
pipelines:
traces:
receivers: [otlp]
processors: [resource, batch]
exporters: [otlphttp]
resource processor 用来给所有数据统一打上环境标签,避免每个服务各写各的。batch processor 负责攒批,能显著降低网络开销。
启动服务和 Collector 后,随便打一次请求,然后到平台的「链路追踪」页面按 service.name 过滤。正常情况下几十秒内能看到 trace;点进去能看到完整的 span 瀑布图和耗时分布。如果看不到,按顺序查三处:agent 是否真的加载(看启动日志)、Collector 日志有无 exporter 报错、令牌是否填对。