Prometheus client_golang vs OpenTelemetry: Go 服务指标埋点
给 Go 服务加指标(比如「查一次词花了多少毫秒」),代码里要选一个埋点库。常见的两个选择是 Prometheus 官方的 client_golang 和 OpenTelemetry 的 Go SDK。两者都能产出同样的 Prometheus 指标,差别在覆盖范围、配置量和对后端的绑定程度。 采集、存储、展示这一层(Alloy、Prometheus、Loki、Grafana)的对比见 可观测性工具对比。本文只讲应用代码里的埋点这一层。 埋点库在哪一层 graph LR A["应用代码埋点库:client_golang 或 OTel SDK"] --> B["采集Prometheus 抓取 / Alloy / OTel Collector"] B --> C["存储Prometheus / Mimir / Grafana Cloud"] C --> D["展示Grafana"] 埋点库决定两件事:代码里怎么记录一个数字,以及这个数字以什么格式交出去(Prometheus 的 /metrics 文本格式,或者 OTLP 协议)。它不决定数据最后存在哪。 Prometheus client_golang github.com/prometheus/client_golang 是 Prometheus 项目的官方 Go 客户端,只做指标。 工作方式是拉(pull):应用在内存里维护计数器和直方图,通过 HTTP 暴露一个 /metrics 端点,Prometheus(或 Alloy)定期来抓。应用不知道谁来读,也不主动往外发。 四种指标类型: 类型 用途 例子 Counter 只增不减的计数 请求总数、错误总数 Gauge 可增可减的当前值 正在处理的请求数、队列长度 Histogram 按桶统计分布,服务端可算分位数 请求耗时,用来算 p95/p99 Summary 客户端直接算分位数 很少用;分位数无法跨实例聚合,一般用 Histogram 最小示例: ...