用 OpenTelemetry Collector 做统一出口,把应用的 trace、metric、log 一次性接到炬鲸 OBSERVE。给出最小可用的 collector 配置、Java 自动埋点示例,以及接不通时的排查顺序。
开始前准备三样东西:
如果只是本地验证,可以用 docker 跑一个 Collector 单机版,下面会提到。如果已经有一套 OpenTelemetry 部署,可以直接跳过 Collector 这节,把现有的 exporter 指到平台即可。
推荐用 OpenTelemetry Collector 作为统一出口,应用不需要直连平台,同时它给你一个统一做批处理、重试、脱敏的地方。一个最小可用的 collector 配置:
receivers:
otlp:
protocols:
grpc:
endpoint: 0.0.0.0:4317
http:
endpoint: 0.0.0.0:4318
processors:
batch:
timeout: 5s
send_batch_size: 512
memory_limiter:
check_interval: 1s
limit_mib: 512
exporters:
otlphttp:
endpoint: https://ob.example.com/otlp
headers:
Authorization: "Bearer <token>"
service:
pipelines:
traces:
receivers: [otlp]
processors: [memory_limiter, batch]
exporters: [otlphttp]
metrics:
receivers: [otlp]
processors: [memory_limiter, batch]
exporters: [otlphttp]
logs:
receivers: [otlp]
processors: [memory_limiter, batch]
exporters: [otlphttp]
注意三件事:batch 处理器要放 memory_limiter 之后,避免背压时 OOM(顺序反了是生产环境 Collector 内存爆掉的最常见原因);token 通过 header 传,不要写进代码,轮换时只在 Collector 改;三条 pipeline 分开配置,方便单独开关或迁移。
以 Java 为例,用 OpenTelemetry 自动埋点 agent,零侵入:
java -javaagent:opentelemetry-javaagent.jar \
-Dotel.traces.exporter=otlp \
-Dotel.metrics.exporter=otlp \
-Dotel.logs.exporter=otlp \
-Dotel.exporter.otlp.endpoint=http://localhost:4317 \
-Dotel.service.name=order-service \
-jar order-service.jar
生产环境建议再加两个参数:otel.resource.attributes=service.version=<版本>,方便按版本对比延迟;otel.traces.sampler 设置采样比例,先 1.0,量上来再降。
Go 用 SDK 手动埋点(启动时建 trace provider,handler 套 otelhttp),Python 用 opentelemetry-instrument 命令包裹。无论哪种语言,最关键的是 service.name 要全局唯一且语义清晰(order-service、pay-gateway),它是后面按服务聚合、画拓扑图的 join 键,改名会打断历史视图。
埋点后大概 1 分钟内,控制台的"服务拓扑"和"链路追踪"页就应该能看到数据了。
如果看不到数据,按顺序查这几处:
验证链路完整性,可以在代码里打一个 trace_id 到日志,再到平台按 trace_id 反查,确认 logs 与 traces 能关联上;如果 trace 有但日志没挂上,说明日志管道没透传 trace context。