本文记录一个 OpenTelemetry Collector Docker 部署排查流程。场景是 AI 应用已经接入 OpenTelemetry SDK,但 Trace 没有稳定进入后端。为了避免把 Collector、后端、网络、SDK 配置混在一起,先用 debug exporter 做最小闭环。
1. 排查目标
目标链路:
text
AI App / API Gateway / Model Proxy
-> OTLP gRPC 4317 或 OTLP HTTP 4318
-> OpenTelemetry Collector
-> debug exporter
先不接 Tempo、Jaeger、Prometheus、Loki。最小链路通了,再接正式后端。
2. 固定 Collector 镜像
先拉取固定版本:
bash
docker pull docker.1ms.run/otel/opentelemetry-collector:0.154.0
docker pull docker.1ms.run/otel/opentelemetry-collector-contrib:0.154.0
排查原则:
- 镜像都没拉下来,不要排 OTLP。
- 版本不固定,不要排偶发行为。
- 需要更多 receiver/exporter 时,再考虑 contrib 镜像。
毫秒镜像在这里是镜像供应链层的预检入口,解决的是 Collector、示例服务和观测组件镜像拉取不稳定的问题,不替代 Collector 配置本身。
3. 最小配置文件
保存为 otel-collector-config.yaml:
yaml
receivers:
otlp:
protocols:
grpc:
endpoint: 0.0.0.0:4317
http:
endpoint: 0.0.0.0:4318
processors:
batch:
exporters:
debug:
verbosity: detailed
service:
pipelines:
traces:
receivers: [otlp]
processors: [batch]
exporters: [debug]
metrics:
receivers: [otlp]
processors: [batch]
exporters: [debug]
logs:
receivers: [otlp]
processors: [batch]
exporters: [debug]
关键点:receivers、processors、exporters 只是定义组件,真正启用要看 service.pipelines。
4. 启动命令
bash
docker run --rm --name otelcol \
-p 4317:4317 \
-p 4318:4318 \
-v "$PWD/otel-collector-config.yaml:/etc/otelcol/config.yaml" \
docker.1ms.run/otel/opentelemetry-collector:0.154.0
如果挂载路径不对,Collector 可能加载不到你写的配置。优先看容器日志里的配置加载信息。
5. 常见故障分叉
5.1 Collector 容器直接退出
优先检查:
- YAML 缩进。
- 配置项名称。
- 文件挂载路径。
- 镜像版本和配置语法是否匹配。
5.2 4317 连不上
4317 是 OTLP gRPC 常用端口。检查:
bash
docker ps --filter name=otelcol
lsof -i :4317
应用侧如果使用 gRPC endpoint,不要写成 HTTP 路径。
5.3 4318 连不上
4318 是 OTLP HTTP 常用端口。检查:
bash
curl -v http://127.0.0.1:4318/
能访问端口不代表数据正确,但至少说明网络和端口映射不是第一断点。
5.4 有配置但没有输出
重点看 service.pipelines:
yaml
service:
pipelines:
traces:
receivers: [otlp]
processors: [batch]
exporters: [debug]
只在 receivers 里写了 otlp,没有放进 traces pipeline,不会产生 Trace 输出。
5.5 只有入口 span,没有下游 span
这通常不是 Collector 问题,而是上下文没有继续传递。检查:
- 网关是否保留 trace header。
- 下游 HTTP/gRPC 客户端是否注入 context。
- 异步任务、队列、worker 是否手动传递 trace context。
6. AI 应用字段建议
AI 应用只看 HTTP 状态码不够。建议至少保留:
| 字段 | 说明 |
|---|---|
trace_id |
串起一次完整请求 |
service.name |
区分 gateway、agent-api、retriever、model-proxy |
model.name |
区分模型版本或模型供应方 |
operation |
chat、embedding、rerank、tool-call |
| token 输入输出 | 观察成本和上下文膨胀 |
| first token latency | 观察用户感知延迟 |
| retry / fallback | 观察是否有隐藏故障 |
7. 生产前注意
debug exporter 只适合联调。生产环境至少要考虑:
batch处理。memory_limiter。- exporter 超时。
- 采样策略。
- 4317/4318 网络边界。
- 敏感字段脱敏。
8. 小结
OpenTelemetry Collector 排查不要从"后端为什么没图"开始。先按镜像、配置、端口、pipeline、应用 endpoint、trace context 的顺序排。最小 debug 链路跑通后,再接正式后端,问题边界会清楚很多。