不想给每个应用单独接 SDK?用 OpenTelemetry Collector 做统一接入层,一份配置同时收日志、指标、链路并转发到炬鲸 OBSERVE。附完整 collector.yaml、应用侧配置与生产环境建议。
直接给每个应用接入 OpenTelemetry SDK 当然可行,可一旦服务多起来问题就来了:每种语言都要维护一套 SDK 版本和一套导出配置,改个上报地址要动几十个服务;SDK 升级、采样策略调整,都要跟着每个应用重新发版。对运维和开发都是持续的负担。
Collector 把这些收口到一处——应用只负责把数据交给本机或集群内的 Collector,由它统一做接收、处理、导出。你改一次导出地址,所有应用跟着生效;想加字段过滤、脱敏、采样,也只在 Collector 里配一次。
对炬鲸 OBSERVE 来说,你只需要维护一个 Collector,所有应用的日志、指标、链路都从它汇入平台,接入面从「每个应用一份配置」变成「一份 Collector 配置」。
推荐每台主机跑一个 Agent 模式的 Collector 就近采集,再(可选)加一个 Gateway 做集中处理和转发。最小配置一个单文件即可:
receivers:
otlp:
protocols:
grpc: { endpoint: 0.0.0.0:4317 }
http: { endpoint: 0.0.0.0:4318 }
filelog:
include: [/var/log/app/*.log]
operators:
- type: json_parser
exporters:
otlphttp:
endpoint: https://ob.example.com/v1/otlp
headers: { Authorization: "Bearer <token>" }
service:
pipelines:
traces: { receivers: [otlp], exporters: [otlphttp] }
metrics: { receivers: [otlp], exporters: [otlphttp] }
logs: { receivers: [otlp, filelog], exporters: [otlphttp] }
关键点:三个 pipeline 复用同一个 otlphttp exporter,把日志、指标、链路一起推到炬鲸 OBSERVE,平台端按数据类型自动入库,你不需要在平台侧做任何分类配置。
应用不用关心导出细节,只用 SDK 把数据发到本机 Collector:
OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4317
OTEL_SERVICE_NAME=order-service
OTEL_RESOURCE_ATTRIBUTES=service.name=order-service,env=prod
Java 应用加 -javaagent:opentelemetry-javaagent.jar 自动埋点,Python 用 opentelemetry-instrument 包一层,Go 用 go.opentelemetry.io/otel 的默认导出器,都不用改业务代码。埋点范围建议先从 HTTP 入口、数据库访问、消息队列这三类开始,覆盖 80% 的常见故障。
Collector 的 processor 是接入层最值得挖的部分。三个高频用法:
processors:
attributes:
actions:
- key: env
value: prod
action: upsert
redaction:
allow_all_keys: true
blocked_values: ["\\d{11}", "\\d{17}[\\dXx]"]
batch:
timeout: 5s
send_batch_size: 1024
service:
pipelines:
logs:
receivers: [otlp, filelog]
processors: [attributes, redaction, batch]
exporters: [otlphttp]
脱敏一定要放在上报之前——敏感字段一旦落到平台存储里,再删就麻烦了。这也是为什么在 Collector 统一处理,比在每个应用里各写一份脱敏逻辑更可靠。
sending_queue 和 retry_on_failure,平台短暂不可用时不丢数据env、region、team 这些维度在 Collector 里统一注入,别让每个应用各写一套,否则检索时维度对不齐tail_sampling,只保留慢请求和出错请求,兼顾成本与覆盖接入后到控制台,用一条类 SQL 查询确认三类数据都到了:
SELECT * FROM logs WHERE service = 'order-service' LIMIT 10
再到「链路追踪」里按 trace id 串出完整调用链,确认 span 没有断层。日志、指标、链路三者时间对齐,排查时才不用来回翻页面。