使用 Docker Compose 运行 OpenTelemetry Collector
从挂载的配置文件启动 Collector,向它发送测试数据,并在 debug exporter 中查看。
本指南从一个 YAML 文件在本地运行 Collector,向它发送一条追踪和一个指标,并打印它收到的内容。没有任何东西是在 UI 中配置的:Collector 没有 UI,一切都在一个文件里。你需要安装了 Compose 插件的 Docker 和 curl。
选择镜像
项目发布了几种 Collector 发行版。核心镜像(otel/opentelemetry-collector)拥有一小组组件。contrib 镜像(otel/opentelemetry-collector-contrib)包含庞大的社区组件集合,而面向 Kubernetes 的镜像(otel/opentelemetry-collector-k8s)包含监控集群所需的组件。本系列后面用到的许多组件,比如 filelog 或 tail_sampling,不在核心镜像中。为了学习,请使用 contrib。在真实使用中请固定一个具体的版本,如这些示例所示,并把版本替换为你想要的发布版本。
项目布局
otel-demo/
├── compose.yaml
└── otel-collector-config.yaml
Collector 配置
otel-collector-config.yaml:
receivers:
otlp:
protocols:
grpc:
endpoint: 0.0.0.0:4317
http:
endpoint: 0.0.0.0:4318
processors:
batch:
exporters:
debug:
verbosity: detailed
extensions:
health_check:
endpoint: 0.0.0.0:13133
service:
extensions: [health_check]
pipelines:
traces:
receivers: [otlp]
processors: [batch]
exporters: [debug]
metrics:
receivers: [otlp]
processors: [batch]
exporters: [debug]
logs:
receivers: [otlp]
processors: [batch]
exporters: [debug]
自上而下阅读:
receivers定义数据如何进入。otlp在 4317 上监听 gRPC,在 4318 上监听 HTTP。processors在传输途中更改数据。batch将条目分组,使导出更高效。exporters将数据发送出去。debug把它打印到 Collector 自己的日志中,这正是你在学习时想要的。extensions在管线旁边添加能力。health_check提供一个健康端点。service把东西打开。定义一个组件本身什么也不做,直到它被列在这里,并且每种信号都有自己的管线。
端点使用 0.0.0.0,使容器可以从外部访问。Collector 的默认值是 localhost,当所有发送方都在本地时这更安全,所以只在你需要的地方才绑定到 0.0.0.0。
compose 文件
compose.yaml:
services:
otel-collector:
image: otel/opentelemetry-collector-contrib:0.163.0 # pin a version you have tested
command: ["--config=/etc/otelcol/config.yaml"]
volumes:
- ./otel-collector-config.yaml:/etc/otelcol/config.yaml:ro
ports:
- "4317:4317" # OTLP gRPC
- "4318:4318" # OTLP HTTP
- "13133:13133" # health_check
- "8888:8888" # the Collector's own metrics
配置路径 /etc/otelcol/config.yaml 是官方镜像默认查找的位置。你可能遇到的其他端口有:用于 zpages 扩展的 55679,以及用于 Prometheus exporter 的 8889。
启动之前先验证
Collector 可以在不运行的情况下检查配置:
docker run --rm -v $(pwd)/otel-collector-config.yaml:/etc/otelcol/config.yaml:ro \
otel/opentelemetry-collector-contrib:0.163.0 validate --config=/etc/otelcol/config.yaml
干净地退出意味着文件能被解析,并且每个被引用的组件都存在于这个发行版中。也请在 CI 中运行它。一个常见的失败是使用了不在你所选镜像中的组件。
启动并检查健康
docker compose up -d
curl -s http://localhost:13133
docker compose logs otel-collector | tail -n 20
健康端点返回一个小的 JSON 状态,日志应当显示 Collector 启动它的管线并在 4317 和 4318 上监听。
发送测试遥测数据
使用纯 curl 通过 HTTP 发送 OTLP。发送一个 span:
curl -s -X POST http://localhost:4318/v1/traces \
-H 'Content-Type: application/json' \
-d '{
"resourceSpans": [{
"resource": { "attributes": [{ "key": "service.name", "value": { "stringValue": "demo" } }] },
"scopeSpans": [{
"spans": [{
"traceId": "5b8efff798038103d269b633813fc60c",
"spanId": "eee19b7ec3c1b174",
"name": "hello",
"kind": 1,
"startTimeUnixNano": "1700000000000000000",
"endTimeUnixNano": "1700000001000000000"
}]
}]
}]
}'
响应中为空的 JSON 对象表示它已被接受。现在查看 Collector 的日志:
docker compose logs otel-collector | grep -A8 'hello'
debug exporter 会打印该 span、它的资源(service.name: demo)及其耗时。你已经有了一条可用的管线。
修改配置并重新加载
Collector 在启动时读取它的文件。编辑之后:
docker compose restart otel-collector
请把这个文件夹保存在 Git 中。后面的指南会用真实的 exporter 取代 debug,并向同一个文件添加 processor 和 extension。
清理
docker compose down 热门指南
-
OpenTelemetry 详解:SDK、OTLP 与 Collector 在编写任何 YAML 之前,先了解各个活动部件以及配置所在的三个位置。 -
Collector 配置模型:组件、管线与 Provider 了解 Collector YAML 的规则:命名、管线、connector、合并文件和环境变量。 -
使用 OTEL_* 环境变量配置 SDK 使用标准变量为任何语言设置服务名称、exporter、采样和限制。 -
无需修改代码即可为应用插桩:Java、Python 和 Node.js 仅通过环境变量和命令行参数附加 OpenTelemetry agent。 -
让 Collector 达到生产就绪:内存限制、批处理与重试 配置 processor、队列和持久化存储,使遥测数据在过载和故障中存活。 -
使用 Helm 在 Kubernetes 上部署 Collector 安装官方 chart,使用 preset 处理日志和指标,并通过 values 文件覆盖配置。 -
排查 Collector 与 SDK 的问题 当遥测数据没有到达时的系统化检查清单:debug exporter、健康检查、内部指标和常见错误。