应用直连后端维护成本高。本文用一份 Collector 配置把日志、指标、链路统一接入炬鲸 OBSERVE,含 agent/gateway 两种部署、尾部采样与关联验证步骤。
应用直接上报到后端看起来简单,但坑不少:每个语言都要装对应 SDK,后端地址变更要改所有应用,网络抖动时没有缓冲和重试,采样策略散落在各个服务里难以统一。OpenTelemetry Collector 作为统一采集网关,把“接收、处理、导出”三段式架构收口到一处,应用只负责发,策略全在 Collector 上维护。
部署有两种形态:跑在每台机器上做 agent(就近采集、分担后端的协议转换压力),或集中部署做 gateway(统一认证、统一采样、统一路由)。规模小的时候一台 gateway 就够,规模大了建议“agent + gateway”两层。
Collector 一个二进制即可部署。核心配置文件 otel-collector-config.yaml:
receivers:
otlp:
protocols:
grpc: { endpoint: 0.0.0.0:4317 }
http: { endpoint: 0.0.0.0:4318 }
processors:
memory_limiter:
check_interval: 1s
limit_mib: 512
batch:
timeout: 1s
send_batch_size: 1024
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]
启动:
otelcol --config otel-collector-config.yaml
Java 应用用 javaagent 最省事,无需改代码,启动参数加上:
java -javaagent:opentelemetry-javaagent.jar \
-Dotel.traces.exporter=otlp \
-Dotel.metrics.exporter=otlp \
-Dotel.logs.exporter=otlp \
-Dotel.exporter.otlp.endpoint=http://collector:4317 \
-Dotel.service.name=order-service \
-jar app.jar
Go、Python、Node.js 同理,配好 OTEL_EXPORTER_OTLP_ENDPOINT 环境变量即可。注意 service.name 要规范统一,它决定了服务在控制台里的分组。
生产环境全量采集代价高,Collector 支持分层采样:
建议配置:错误链路 100% 保留,正常链路按 1% 采样。日志侧可用 processor 过滤掉 DEBUG 级和敏感字段,减少无效存储。
发几笔带错误的请求,到控制台用 trace id 查一条链路,确认日志、指标、链路三者能通过 trace id 关联起来;再停掉一个下游服务,确认告警能触发。两个都通过,接入才算完成。