6.9 KiB
6.9 KiB
OpenTelemetry Collector
OpenTelemetry Collector 是一个与供应商无关的服务,用于接收、处理和导出遥测数据(追踪、指标和日志)。它支持多种协议,可以将数据发送到各种后端系统。
功能特性
- 协议支持:OTLP、Jaeger、Zipkin、Prometheus 等
- 灵活处理:过滤、转换和丰富遥测数据
- 多种导出器:将数据发送到各种可观测性后端
- 高性能:高效的数据处理,开销低
- 可扩展:丰富的接收器、处理器和导出器生态系统
- 供应商中立:与任何兼容 OpenTelemetry 的后端配合使用
快速开始
-
复制环境文件并根据需要调整:
cp .env.example .env -
创建配置文件
config.yaml:# 参见下面的示例或使用提供的模板 -
启动收集器:
docker compose up -d
默认端口
| 协议 | 端口 | 描述 |
|---|---|---|
| OTLP gRPC | 4317 | 基于 gRPC 的 OpenTelemetry 协议 |
| OTLP HTTP | 4318 | 基于 HTTP 的 OpenTelemetry 协议 |
| Jaeger gRPC | 14250 | Jaeger gRPC 接收器 |
| Jaeger Thrift HTTP | 14268 | Jaeger Thrift HTTP 接收器 |
| Zipkin | 9411 | Zipkin HTTP 接收器 |
| Prometheus | 8888 | 内部指标端点 |
| Health Check | 13133 | 健康检查端点 |
配置说明
环境变量
主要环境变量(完整列表请查看 .env.example):
OTEL_COLLECTOR_VERSION:收集器版本(默认:0.115.1)OTEL_COLLECTOR_OTLP_GRPC_PORT_OVERRIDE:OTLP gRPC 端口(默认:4317)OTEL_COLLECTOR_OTLP_HTTP_PORT_OVERRIDE:OTLP HTTP 端口(默认:4318)OTEL_COLLECTOR_GOMEMLIMIT:收集器的 Go 内存限制
配置文件
创建 config.yaml 文件来定义收集器管道。以下是一个最小示例:
receivers:
otlp:
protocols:
grpc:
endpoint: 0.0.0.0:4317
http:
endpoint: 0.0.0.0:4318
processors:
batch:
timeout: 10s
send_batch_size: 1024
exporters:
logging:
loglevel: info
# 示例:导出到 Jaeger
# otlp/jaeger:
# endpoint: jaeger:4317
# tls:
# insecure: true
# 示例:导出到 Prometheus
# prometheusremotewrite:
# endpoint: http://prometheus:9090/api/v1/write
extensions:
health_check:
endpoint: 0.0.0.0:13133
pprof:
endpoint: 0.0.0.0:1777
service:
extensions: [health_check, pprof]
pipelines:
traces:
receivers: [otlp]
processors: [batch]
exporters: [logging]
metrics:
receivers: [otlp]
processors: [batch]
exporters: [logging]
logs:
receivers: [otlp]
processors: [batch]
exporters: [logging]
对于生产环境,请为您的可观测性后端配置适当的导出器(例如 Jaeger、Prometheus、Grafana Tempo、DataDog 等)。
常用接收器
- OTLP:原生 OpenTelemetry 协议(gRPC 和 HTTP)
- Jaeger:Jaeger 原生格式
- Zipkin:Zipkin JSON 格式
- Prometheus:Prometheus 抓取
- Kafka:从 Kafka 主题接收
常用处理器
- Batch:在导出前批处理遥测数据
- Memory Limiter:防止内存溢出情况
- Resource Detection:自动检测资源属性
- Attributes:修改遥测数据的属性
- Sampling:基于各种策略对追踪进行采样
常用导出器
- OTLP:发送到兼容 OTLP 的后端
- Jaeger:导出到 Jaeger
- Zipkin:导出到 Zipkin
- Prometheus:公开指标供 Prometheus 抓取
- Prometheus Remote Write:推送指标到 Prometheus
- Logging:将遥测数据记录到控制台(用于调试)
向收集器发送数据
使用 OpenTelemetry SDK
配置您的应用程序将数据发送到收集器:
环境变量:
export OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4317
export OTEL_EXPORTER_OTLP_PROTOCOL=grpc
Python 示例:
from opentelemetry import trace
from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor
provider = TracerProvider()
processor = BatchSpanProcessor(OTLPSpanExporter(endpoint="localhost:4317", insecure=True))
provider.add_span_processor(processor)
trace.set_tracer_provider(provider)
Node.js 示例:
const { OTLPTraceExporter } = require('@opentelemetry/exporter-trace-otlp-grpc')
const { NodeTracerProvider } = require('@opentelemetry/sdk-trace-node')
const provider = new NodeTracerProvider()
const exporter = new OTLPTraceExporter({
url: 'http://localhost:4317',
})
provider.addSpanProcessor(new BatchSpanProcessor(exporter))
provider.register()
资源需求
最低推荐资源:
- CPU:0.5 核
- 内存:1GB RAM
对于高吞吐量环境,请相应增加资源。
数据持久化
收集器本身是无状态的。数据持久化取决于配置的导出器和后端系统。
安全注意事项
- 生产部署时配置 TLS
- 在可用时使用身份验证(例如 API 密钥、mTLS)
- 限制对必要端口的网络访问
- 考虑使用
memory_limiter处理器防止 OOM - 检查并最小化暴露的端口
- 对敏感配置使用密钥管理
健康检查
收集器在端口 13133 上公开健康检查端点:
http://localhost:13133/- 整体健康状态
监控收集器
收集器在 Prometheus 指标端点(默认端口 8888)上公开自己的指标:
http://localhost:8888/metrics
需要监控的关键指标:
otelcol_receiver_accepted_spans:接受的 span 数量otelcol_receiver_refused_spans:拒绝的 span 数量otelcol_exporter_sent_spans:发送的 span 数量otelcol_processor_batch_batch_send_size:批处理大小
故障排查
- 未接收到数据:检查接收器配置和端口绑定
- 内存使用过高:配置
memory_limiter处理器 - 处理速度慢:调整批处理器设置
- 导出失败:检查导出器配置和后端连接性
性能调优
- 使用
batch处理器提高效率 - 配置
memory_limiter防止 OOM - 根据吞吐量要求调整队列大小
- 对高容量追踪数据使用采样处理器
- 监控收集器指标以发现瓶颈
许可证
OpenTelemetry Collector 采用 Apache 2.0 许可证。详情请参阅 官方仓库。