Skip to content

可观测性全景

可观测性三支柱

┌─────────────────────────────────────────────────────┐
│                   可观测性                            │
│                                                      │
│  📊 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

本站内容由 褚成志 整理编写,仅供学习参考