预约咨询 提交工单

使用Prometheus、Grafana和OpenTelemetry实现统一可观测性:实用应急手册

了解如何使用OpenTelemetry、Prometheus和Grafana关联指标、日志和追踪。本手册为SRE团队提供了实用命令、风险控制和回滚策略。

使用Prometheus、Grafana和OpenTelemetry实现统一可观测性:实用应急手册
Observability 9min 3 浏览 2026-08-12
KubernetesSRE

使用Prometheus、Grafana和OpenTelemetry实现统一可观测性:实用应急手册

场景

你的Kubernetes平台运行着数十个微服务,每个服务都会产生指标、日志和追踪。Prometheus抓取指标,Grafana可视化指标,但你混合使用了多种追踪工具。当事故发生时,你经常在仪表盘、日志查询和追踪视图之间切换,试图拼凑出发生了什么。这是典型的可观测性孤岛问题。

在本文中,我们将使用OpenTelemetry (OTel)进行仪器化和遥测数据收集,使用Prometheus存储指标,使用Grafana进行仪表盘和告警,构建一个统一的观测管道。我们还将使用exemplars(示例)直接从指标跳转到追踪,大幅缩短平均诊断时间(MTTD)。

症状

  • checkout服务的p99延迟超过500ms,违反SLO。
  • payments API的错误率攀升至2%,快速消耗错误预算。
  • CPU和内存仪表盘没有明显异常,但用户报告系统变慢。
  • 运维工程师手动跨日志和追踪关联时间戳,每次事故浪费30分钟。

诊断

首先使用PromQL定位问题。查询checkout服务的延迟直方图:

histogram_quantile(0.99,
  sum(rate(http_request_duration_seconds_bucket{service="checkout"}[5m])) by (le, route)
)

这将揭示哪些路由是慢的。假设/api/checkout是罪魁祸首。接下来,使用同一个直方图找到exemplar(示例)——一个具有代表性的trace ID。在Grafana中,在查询编辑器中启用exemplars。单击数据点上的火花图标,打开关联的追踪(例如Tempo)。

如果你还没有exemplars,仍可以通过时间戳关联追踪。但exemplars能让你快得多。

命令与配置

1. 部署OpenTelemetry Collector

OTel Collector是厂商中立的网关。创建ConfigMap:

apiVersion: v1
kind: ConfigMap
metadata:
  name: otel-collector-conf
  namespace: observability
data:
  otel-collector-config.yaml: |
    receivers:
      otlp:
        protocols:
          grpc:
          http:
    processors:
      batch:
        timeout: 5s
    exporters:
      prometheusremotewrite:
        endpoint: http://prometheus:9090/api/v1/write
        retry_on_failure:
          enabled: true
      otlp:
        endpoint: tempo:4317
        tls:
          insecure: true
    service:
      pipelines:
        metrics:
          receivers: [otlp]
          processors: [batch]
          exporters: [prometheusremotewrite]
        traces:
          receivers: [otlp]
          processors: [batch]
          exporters: [otlp]

应用配置:

kubectl create ns observability
kubectl apply -f otel-collector.yaml

同时,将collector作为DaemonSet部署,以收集节点级指标并接收来自服务的OTLP。为简单起见,我们使用单个Deployment。

2. 使用OpenTelemetry仪器化服务

使用OpenTelemetry Operator注入自动仪器化:

kubectl apply -f https://github.com/open-telemetry/opentelemetry-operator/releases/latest/download/opentelemetry-operator.yaml

然后给部署添加注释:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: checkout
  namespace: prod
spec:
  template:
    metadata:
      annotations:
        instrumentation.opentelemetry.io/inject-java: "true"

或者手动使用SDK。对于Python服务:

from opentelemetry import trace
from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor

trace.set_tracer_provider(TracerProvider())
trace.get_tracer_provider().add_span_processor(
    BatchSpanProcessor(OTLPSpanExporter(endpoint="otel-collector:4317"))
)

3. 配置Prometheus远程写入

启动Prometheus时启用远程写入接收器:

prometheus --web.enable-remote-write-receiver

在Prometheus配置中,确保有collector的抓取任务:

scrape_configs:
  - job_name: 'otel-collector'
    static_configs:
      - targets: ['otel-collector:8888']

4. 设置Grafana数据源和Exemplars

在Grafana中,添加Prometheus和Tempo作为数据源。对于Prometheus,在数据源设置中启用“Exemplars”,并添加一个派生字段用于trace ID查找:

  • TraceID字段: traceID
  • 数据源: Tempo
  • 查询: {traceID="${__value.raw}"}

现在,你可以在任何Prometheus图表中点击exemplar打开完整追踪。

5. 构建仪表盘和告警

创建仪表盘,包含延迟、错误率和饱和度面板(USE方法)。对于告警,定义Prometheus规则:

groups:
  - name: checkout-slo
    rules:
      - alert: CheckoutP99High
        expr: |
          histogram_quantile(0.99,
            sum(rate(http_request_duration_seconds_bucket{service="checkout"}[5m]))
            by (le, route)
          ) > 0.5
        for: 10m
        annotations:
          summary: "Checkout服务p99延迟过高"

风险控制

  • 金丝雀发布collector: 先启动一个实例,监控资源使用情况。
  • 设置资源限制: 为collector设置内存和CPU限制,避免干扰其他服务。
  • 限制远程写入速率: 使用queue_sizeretry_on_failure避免淹没Prometheus。
  • 备份配置: 在上线前将Prometheus、Grafana和OTel配置存储在Git中。
  • 生产环境启用TLS,使用商业证书或mTLS保护OTLP端点。

回滚

如果OTel collector导致不稳定,可以快速回滚:

kubectl delete deployment otel-collector -n observability

这将停止所有OTLP摄取。Prometheus仍会查询现有的抓取目标。对于自动仪器化,从部署中移除注释:

kubectl annotate deployment checkout instrumentation.opentelemetry.io/inject-java-

对于Prometheus配置更改,使用之前的配置文件:

cp prometheus.yml.bak prometheus.yml
kill -HUP $(pidof prometheus)

验证

部署后,验证每一层:

  1. Collector: 检查日志是否有错误:kubectl logs <otel-collector-pod>
  2. Prometheus: 查询仅通过OTLP远程写入存在的指标,如otelcol_exporter_sent_metric_points
  3. Grafana: 打开仪表盘,确认新数据出现。
  4. Exemplars: 在Grafana Explore中,运行PromQL查询,悬停数据点,点击“Exemplar”打开追踪。
  5. 告警: 使用curl生成高延迟,验证10分钟内触发告警。

何时提交OpsGlobal工单

如果出现以下情况,你应该考虑聘请OpsGlobal:

  • 团队每周花费超过10小时维护观测栈。
  • 你需要为不支持OTel的传统服务提供高级仪器化。
  • 你想要对观测基础设施本身进行7x24小时监控。
  • 你即将迁移到服务网格,需要集成遥测数据的帮助。

OpsGlobal的远程SRE可以设计、部署和运维你的Prometheus、Grafana和OpenTelemetry栈,确保你达成SLO并获得所需的可见性。

适用场景

适合正在处理 Observability、Kubernetes, SRE 相关问题的团队,用于快速建立排查路径和交付标准。

问题背景

了解如何使用OpenTelemetry、Prometheus和Grafana关联指标、日志和追踪。本手册为SRE团队提供了实用命令、风险控制和回滚策略。

排查步骤

先确认影响范围和最近变更,再收集日志、配置、指标和链路数据,最后按风险从低到高执行修复。

命令示例

示例命令请替换为你的真实资源名,并使用环境变量保存账号、密码、token 等敏感信息。

风险说明

生产环境操作前需要确认备份、权限边界、变更窗口和回滚路径,避免扩大故障影响。

回滚方案

保留原配置和发布版本;如修复后指标异常,立即回退配置、镜像或数据库变更并复核日志。

交付清单

问题定位记录、关键命令、修复步骤、验证结果、后续优化建议。

!

遇到类似技术问题?

如果你的服务器、K8s、Docker、CI/CD、数据库或监控系统出现类似问题,可以提交日志和配置文件,我们帮你远程诊断。

工单 WhatsApp 联系 咨询