可观测性全景
可观测性三支柱
┌─────────────────────────────────────────────────────┐
│ 可观测性 │
│ │
│ 📊 Metrics(指标) │
│ 时序数据,聚合统计 │
│ 工具:Prometheus + Grafana │
│ │
│ 📝 Logs(日志) │
│ 结构化事件记录 │
│ 工具:EFK(Elasticsearch+Fluentd+Kibana) │
│ PLG(Promtail+Loki+Grafana) │
│ │
│ 🔍 Traces(链路追踪) │
│ 请求全链路追踪 │
│ 工具:Jaeger + OpenTelemetry │
└─────────────────────────────────────────────────────┘工具选型
| 场景 | 推荐方案 | 说明 |
|---|---|---|
| 指标监控 | Prometheus + Grafana | 事实标准 |
| 日志(小规模) | Loki + Grafana | 轻量,与 Grafana 集成好 |
| 日志(大规模) | Elasticsearch + Kibana | 功能强大,资源消耗大 |
| 链路追踪 | Jaeger / Tempo | 开源主流 |
| 全栈可观测 | OpenTelemetry | 统一标准,厂商中立 |
| 商业方案 | Datadog / New Relic | 功能完整,成本高 |
OpenTelemetry 统一标准
go
// 初始化 OTel SDK
import (
"go.opentelemetry.io/otel"
"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc"
"go.opentelemetry.io/otel/sdk/trace"
)
func initTracer() func() {
exporter, _ := otlptracegrpc.New(ctx,
otlptracegrpc.WithEndpoint("otel-collector:4317"),
otlptracegrpc.WithInsecure(),
)
tp := trace.NewTracerProvider(
trace.WithBatcher(exporter),
trace.WithResource(resource.NewWithAttributes(
semconv.SchemaURL,
semconv.ServiceName("my-service"),
semconv.ServiceVersion("v1.0"),
)),
)
otel.SetTracerProvider(tp)
return func() { tp.Shutdown(ctx) }
}
// 使用 Tracer
tracer := otel.Tracer("my-service")
ctx, span := tracer.Start(ctx, "处理请求")
defer span.End()
span.SetAttributes(
attribute.String("user.id", userID),
attribute.Int("items.count", count),
)Kubernetes 事件
bash
# 查看集群事件(按时间排序)
kubectl get events --sort-by='.lastTimestamp' -A
# 查看特定资源的事件
kubectl describe pod my-pod | grep -A20 Events
# 监听实时事件
kubectl get events -w -n production