telemetry-operator 不是 go 微服务的直接依赖,它运行在集群层面统一管理 opentelemetry collector;go 服务只需通过 otlp 协议(grpc/http)将 trace/metric/logs 推送至 collector endpoint,无需引入 operator 或操作其 crd。

Telemetry-operator 不是 Go 微服务的直接依赖,它不参与你的 main.go 编码,也不跑在你的服务 Pod 里——它运行在 Kubernetes 集群层面,负责统一部署和管理 OpenTelemetry Collector 实例。你真正要做的,是让 Go 微服务“适配”它输出标准格式的指标/追踪数据,而不是“引入”它。
Go 服务只需暴露 OTLP endpoint,别碰 Telemetry-operator 的 CRD
Telemetry-operator 通过 Telemetry 和 OpenTelemetryCollector 这类自定义资源(CRD)控制 Collector 生命周期。你的 Go 服务完全不需要 import 它、调它的 API 或 watch 它的资源。唯一要做的事:确保你的服务能通过 OTLP 协议(grpc 或 http)把 trace/metric/logs 推给 Collector 的 endpoint。
- 用
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc发送 traces - 用
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc发送 metrics(注意:v1.20+ 才稳定支持 OTLP metrics) - endpoint 地址通常是
otel-collector.default.svc.cluster.local:4317(gRPC)或http://otel-collector.default.svc.cluster.local:4318/v1/traces(HTTP) - 不要硬编码 namespace;用 Downward API 或 configmap 注入 collector 地址,方便多环境切换
Telemetry-operator 要求 Collector 配置必须显式声明 receivers/exporters
如果你直接用 kubectl apply -f collector.yaml 部署 Collector,配置可能很简略;但 Telemetry-operator 管理的 Collector 实例,其配置由 CRD 中的 spec.config 字段生成,且 operator 会校验语法。常见失败原因是 receiver 没声明端口或 exporter 没配 endpoint。
使用 uber-go/dig 在 Golang 中实现依赖注入——基于反射容器,提供 Provide/Invoke、dig.In/dig.Out 参数与结果对象,支持命名依赖等
- receiver 必须显式写
otlp:块,并开启protocols:下的grpc和/或http - exporter 若指向后端(如 Prometheus remote_write、Jaeger、Loki),必须填完整地址,不能只写 service 名而不带 port
- operator 默认不会 merge config;
spec.config是最终配置,不是 patch - 验证方式:kubectl get otelcol -n default
your-collector-name-o yaml,检查 status.conditions 是否为 Ready
Go SDK 版本与 OTLP 协议版本必须对齐,否则 metrics 丢失静默失败
Go 的 OTel SDK 在 v1.20 之前对 OTLP metrics 支持不完整,而 Telemetry-operator 当前(v0.9.x)默认生成的 Collector 配置启用的是 OTLP v1.0.0 协议。若 SDK 版本太低,Counter、Histogram 等 metric 类型会无法序列化,日志里看不到错误,但 Prometheus 就收不到任何指标。
- 确认 SDK 版本:
go list -m go.opentelemetry.io/otel@latest,至少用v1.20.0+ - 确认 exporter 使用
otlpmetricgrpc.NewClient()而非已废弃的otlp.NewExporter() - 用
otel.ExporterOTLPWithEndpoint("otel-collector:4317")初始化时,确保 host 可解析、端口可连通(可用telnet或nc测试) - 加一个 debug exporter(如
stdout)对比输出,确认 metric 数据结构是否生成成功
最常被忽略的点:Telemetry-operator 不处理采样策略、资源属性注入或 span 名称规范——这些全靠你在 Go 代码里用 otel.Tracer 和 metric.Meter 显式控制。Operator 只管“管道有没有通”,不管“水里有没有杂质”。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










