多语言服务接入可观测平台的正确姿势:用 OpenTelemetry Collector 统一采样、批量与上报,附完整配置文件、Java/Go/Python/Node 接入要点和常见坑。
接入可观测平台有两种姿势:SDK 直连后端,或在中间加一层 OpenTelemetry Collector。多语言、多服务团队我强烈建议用 Collector,原因有三:
Collector 是单二进制,每台机器或每个集群跑一个,接收各语言的 OTLP,再汇成一路统一上报。
下载二进制,指向 otel-collector-config.yaml:
receivers:
otlp:
protocols:
grpc:
endpoint: 0.0.0.0:4317
http:
endpoint: 0.0.0.0:4318
processors:
batch:
timeout: 5s
send_batch_size: 1024
exporters:
otlphttp:
endpoint: https://ob.example.com/otlp
headers:
Authorization: Bearer <你的接入Token>
service:
pipelines:
traces:
receivers: [otlp]
processors: [batch]
exporters: [otlphttp]
logs:
receivers: [otlp]
processors: [batch]
exporters: [otlphttp]
metrics:
receivers: [otlp]
processors: [batch]
exporters: [otlphttp]
应用只需把数据发到本机 4317(gRPC)或 4318(HTTP)端口。traces / logs / metrics 三条 pipeline 分开声明,可以先只开一条,确认稳定再逐个加。
opentelemetry-javaagent,启动参数加 -javaagent:opentelemetry-javaagent.jar,配合环境变量 OTEL_EXPORTER_OTLP_ENDPOINT=http://127.0.0.1:4318。零代码侵入,自动采集 HTTP、DB、MQ。otelhttp 包一层路由,手动 start/end span。Go 最大的坑是 context:子 span 必须传父级的 context.Context,否则 trace 会悄悄断成几截。opentelemetry-instrument 自动注入,再加一行 FlaskInstrumentor().instrument_app(app)。@opentelemetry/sdk-trace-node 配 NodeTracerProvider,要在路由定义之前注册;注意请求头 traceparent 透传。关键点:让日志和链路关联起来。日志里带上 trace_id,排查时才能从一条日志直接跳到整条调用链。Java Agent 会自动把 trace id 注入 MDC,logging.pattern 里加 %X{trace_id} 即可;Go 和 Python 需要自己写几行,把当前 span 的 trace id 写进每条日志。
traceparent 头,检查中间件/网关是否拦截了 trace 头。tail_sampling 配好,健康检查这类高频低价值请求直接丢弃。