Go 微服务可观测性:trace + metrics + logs 三件套联动
可观测性是"系统健康监控"的根本。本文讲清三大支柱 + 实际联动做法。
一、可观测性三件套
- Metrics:定点采样,监控变化趋势
- Logs:事件记录
- Trace:请求链路追踪
三者结合 = 完整可观测性。
二、OTel 跨度
OTel span 包含:
- trace_id
- span_id
- parent_span
- attributes / events
三、Metrics 设计
| 维度 | 例子 | 类型 |
|---|---|---|
| Counter | http_requests_total | Counter |
| Gauge | queue_depth | Gauge |
| Histogram | http_duration | Histogram |
四、Logs 结构化
slog.Info("user login","user_id",42,"ip","1.1.1.1")五、关联起来
日志中带 trace_id:
slog.Info("user login","trace_id",trace.SpanFromContext(ctx).SpanContext().TraceID().String(),)Grafana Loki 支持{trace_id="xxx"}查询。
六、Metrics 触发 Trace
ifrequestCount.MustGet()>threshold{capture.Trace:=true}七、OTel + Prometheus
import("go.opentelemetry.io/otel/exporters/prometheus""go.opentelemetry.io/otel/sdk/metric")exp,_:=prometheus.New()meterProvider:=sdkmetric.NewMeterProvider(sdkmetric.WithReader(sdkmetric.NewPeriodicReader(exp)))otel.SetMeterProvider(meterProvider)八、OpenTelemetry SDK 概览
| 模块 | 作用 |
|---|---|
| otel | API |
| otel/sdk | SDK |
| otel/exporters/jaeger | Jaeger export |
| otel/exporters/otlp | OTLP grpc / http |
九、JAEGER 后端
Jaeger collector + ES 后端:
collector:receivers:[otlp]processors:[batch]exporters:[jaeger,kafka]十、Loki 收集日志
backend:lokilabels:[job,level,trace_id]十一、Prometheus labels 与 cardinality
requestCount.WithLabelValues("GET","/users","200").Inc()labels 不要过多,否则 cardinality 爆炸。
十二、Trace 与 Metrics 跨界
OTel 自动生成 R.E.D 指标:requests / errors / duration。
十三、企业实战:告警引擎
-alert:HighLatencyexpr:histogram_quantile(0.99,sum(rate(http_duration_seconds_bucket[5m])) by (le))>0.5labels:{severity:critical}十四、踩坑清单
- trace_id 不打印就关联不上
- cardinality 高导致 TSDB 内存爆
- metric 名随版本乱改
十五、未来
- eBPF 提供内核级 metrics
- AI 监控自动归因
十六、总结与展望
三件套不是孤立。Logs 给"事件",Metrics 给"信号",Trace 给"链路"。协同才能构成完整可观测。
十七、参考文献
- OpenTelemetry 文档
- Grafana 文档