Skip to main content

Command Palette

Search for a command to run...

12 個揭示真正瓶頸的 OpenTelemetry 儀表板

Updated
•13 min read•View as Markdown
12 個揭示真正瓶頸的 OpenTelemetry 儀表板

原文 :12 OpenTelemetry Dashboards That Surface Real Bottlenecks https://medium.com/@sparknp1/12-opentelemetry-dashboards-that-surface-real-bottlenecks-f81d36e043a4

「正確的儀表板感覺就像作弊程式碼」。遙測的目標並非擁有更多數據,而是要讓少數視圖清晰易讀,使你的下一步行動顯而易見。實用、簡潔的 OTel 視圖能將雜亂的噪音轉化為具體的解決方案。

前言

你把一切都可監測了。現在,圖表牆正在回望。哪些實際上可以幫助您解決結帳速度慢、API 不穩定或神秘的 p99 問題?

說實話:正確的儀表板感覺就像作弊程式碼。

以下是我使用(並調整過)的 12 個 OpenTelemetry 儀表板,它們一致地揭示了實際瓶頸和下一步行動。

┌─────────────────────────────────────────────────────────┐
│  OpenTelemetry 監控全景                                   │
│  ┌──────────┐  ┌──────────┐  ┌──────────┐              │
│  │   應用    │  │   服務    │  │  微服務   │              │
│  └─────┬────┘  └─────┬────┘  └─────┬────┘              │
│        │             │             │                    │
│        └─────────────┴─────────────┘                    │
│                      │                                  │
│                      ▼                                  │
│            ┌─────────────────┐                          │
│            │  OTel Collector │                          │
│            └────────┬────────┘                          │
│                     │                                   │
│         ┌───────────┼───────────┐                       │
│         ▼           ▼           ▼                       │
│    ┌────────┐  ┌───────┐  ┌────────┐                   │
│    │ Metrics│  │Traces │  │  Logs  │                   │
│    └────────┘  └───────┘  └────────┘                   │
│         │           │           │                       │
│         └───────────┴───────────┘                       │
│                     │                                   │
│                     ▼                                   │
│         📊 12 個關鍵儀表板                                │
└─────────────────────────────────────────────────────────┘

🎯 核心監控儀表板

1. RED for Every Critical Endpoint(每個關鍵端點的 RED 指標)

顯示內容:每條高價值路線的 Rate(速率)、Errors(錯誤)、Duration(持續時間)

為什麼有效:RED 三元組是快速故障檢測器和深入分析的指南針

如何構建:使用由 http.route 鍵入的跨度指標(持續時間直方圖 + 錯誤計數)

# 如何建立:使用由 http.route 鍵入的 span metrics
# OpenTelemetry Collector (span metrics)
processors:
  spanmetrics:
    metrics_exporter: prometheus
    dimensions:
      - name: http.route
      - name: http.method
    histogram:
      unit: "ms"
      explicit_buckets: [5, 10, 25, 50, 100, 250, 500, 1000, 2500]

service:
  pipelines:
    traces:
      processors: [spanmetrics]
┌────────────────────── RED 儀表板 ──────────────────────┐
│                                                        │
│  📈 Rate (請求速率)                                     │
│  ▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬                           │
│  /checkout    ████████████████░░  1,250 req/s         │
│  /login       ████████░░░░░░░░░░    450 req/s         │
│  /quote       ██████████████████  1,800 req/s         │
│                                                        │
│  ❌ Errors (錯誤率)                                     │
│  ▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬                           │
│  /checkout    ██░░░░░░░░░░░░░░░░    1.2%              │
│  /login       ░░░░░░░░░░░░░░░░░░    0.1%              │
│  /quote       ████░░░░░░░░░░░░░░    2.8% ⚠️           │
│                                                        │
│  ⏱️  Duration (回應時間)                                │
│  ▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬                           │
│  /checkout    p50: 120ms  p95: 450ms  p99: 890ms     │
│  /login       p50:  45ms  p95: 125ms  p99: 280ms     │
│  /quote       p50: 180ms  p95: 620ms  p99: 1.2s 🔥   │
└────────────────────────────────────────────────────────┘

要建立每個關鍵端點的 RED 指標,您需要使用 OpenTelemetry Collector 中的 spanmetrics 處理器。這是將追蹤 (Traces) 數據轉換為指標 (Metrics) 的核心步驟。

具體的 Collector 配置示例如下,它使用 http.route 和 http.method 作為維度鍵入跨度指標:

# 如何建立:使用由 http.route 鍵入的 span metrics [6]
processors:
  spanmetrics:
    metrics_exporter: prometheus
    dimensions:
      - name: http.route
      - name: http.method
    histogram:
      unit: "ms"
      # 設定明確的持續時間分桶,用於精確計算延遲百分位數(例如 p95, p99)
      explicit_buckets: [9-11] [5, 6]

service:
  pipelines:
    traces:
      processors: [spanmetrics] [6, 12]

💡 解讀技巧:p95 在流量沒有增長的情況下突然上升通常意味著飽和或下游依賴性問題。

2. Tail Latency Anatomy(尾部延遲剖析)

顯示內容:隨時間變化的 p50/p95/p99,加上差異面板 (p99–p50)

┌──────────────── 尾部延遲追蹤 ────────────────┐
│                                              │
│  延遲分佈 (ms)                                │
│  2000│                              ╱╲       │
│      │                            ╱    ╲     │
│  1500│                          ╱        ╲   │ p99
│      │                        ╱            ╲ │
│  1000│              ╱╲      ╱                │
│      │            ╱    ╲  ╱                  │ p95
│   500│      ╱╲  ╱        ╲                   │
│      │    ╱    ╲                             │ p50
│      │  ╱                                    │
│     0└──┴───┴───┴───┴───┴───┴───┴───┴───┴─  │
│       8:00 9:00 10:00 11:00 12:00 13:00     │
│                                              │
│  📊 差異分析 (p99 - p50)                      │
│  ▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬                  │
│  正常時段:  ~200ms                           │
│  高峰時段:  ~1,100ms ⚠️  (5.5x 差距)         │
│                                              │
│  💡 建議: 檢查 11:00 時段的依賴服務             │
└──────────────────────────────────────────────┘

為什麼有效:

  • p50 代表用戶幸福感

  • p99 代表執行壓力

  • 差距顯示長尾疼痛

🎯 專業提示:從追蹤中添加示例,直接從尖峰跳到有問題的跨度。

3. Saturation Heatmap by Resource(按資源劃分的飽和度熱圖)

顯示內容:按服務劃分的 CPU、內存、I/O 和線程池利用率,按剩餘空間排序

┌─────────────── 資源飽和度熱圖 ───────────────┐
│                                              │
│  服務名稱      CPU    Memory   I/O   Thread  │
│  ────────────────────────────────────────   │
│  api-gateway   ██░░   ███░░   █░░░   ████   │
│                52%     68%     18%     89% 🔥│
│                                              │
│  auth-service  ████   ████░   ██░░   ███░   │
│                89% 🔥  92% 🔥  42%     72%   │
│                                              │
│  payment-svc   █░░░   ██░░░   ████   ██░░   │
│                23%     48%     91% 🔥  45%   │
│                                              │
│  user-service  ██░░   ███░░   █░░░   ███░   │
│                55%     71%     25%     68%   │
│                                              │
│  ▓▓▓▓ > 80% (危險)  ███ 60-80%  ██ 40-60%   │
│  █ < 40% (健康)                              │
│                                              │
│  ⚠️  警報: auth-service CPU & Memory 接近飽和 │
│  💡 建議: 擴展 payment-svc I/O 容量           │
└──────────────────────────────────────────────┘

為什麼有效:如果當淨空下降到低於 ~20% 時 p95 上升,那麼您就發現了資源瓶頸

建議添加:

  • 限制標誌(CPU 限制計數、容器 OOM 終止)

  • 每個服務的隊列積壓

📊 依賴與性能追蹤

4. Queue Health: Depth × Age × Drains(隊列健康度)

當服務在高負載下,隊列成為了減震器,但同時也可能是問題的「犯罪現場」。在監控隊列健康度(深度、年齡、消耗率)時,應遵循以下分類規則:

• 分類規則:如果隊列深度 (Depth) 增加且最早的消息年齡 (Age) 攀升,而消費者消耗率 (Drains) 保持平坦,這表示瓶頸在於消費者數量不足,或者下游服務運行緩慢,應優先增加消費者或解決下游緩慢問題。

顯示內容:消息深度、最早的消息年齡以及每個隊列/主題的消費者消耗率

┌────────────── 隊列健康監控 ──────────────┐
│                                          │
│  📬 order-queue                          │
│  ┌────────────────────────────────────┐ │
│  │ 深度: 1,240 msgs  ████████░░░       │ │
│  │ 年齡: 8.5 min     ████████████░ 🔥  │ │
│  │ 消耗: 145 msg/s   ██████░░░░░░      │ │
│  └────────────────────────────────────┘ │
│                                          │
│  📬 notification-queue                   │
│  ┌────────────────────────────────────┐ │
│  │ 深度: 45 msgs     █░░░░░░░░░        │ │
│  │ 年齡: 1.2 min     ██░░░░░░░░        │ │
│  │ 消耗: 380 msg/s   ████████████      │ │
│  └────────────────────────────────────┘ │
│                                          │
│  📬 payment-queue                        │
│  ┌────────────────────────────────────┐ │
│  │ 深度: 3,890 msgs  ████████████░ ⚠️  │ │
│  │ 年齡: 15.3 min    ████████████████ 🔥│ │
│  │ 消耗: 62 msg/s    ███░░░░░░░░░      │ │
│  └────────────────────────────────────┘ │
│                                          │
│  ⚠️  payment-queue 積壓嚴重              │
│  💡 建議: 增加消費者或檢查下游服務         │
└──────────────────────────────────────────┘

為什麼有效:在負載情況下,隊列會成為您的減震器——或者成為您的犯罪現場

⚠️ 分類規則:如果深度增加且年齡增加,而排水管保持平坦 → 首先添加消費者或解決下游緩慢問題


5. Dependency Waterfall(依賴瀑布)

顯示內容:按 peer.service/db.system 聚合的跨度指標及對總延遲的貢獻

┌──────────────── 依賴瀑布分析 ────────────────┐
│                                              │
│  請求: GET /checkout (總時長: 1,240ms)        │
│  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━   │
│                                              │
│  ├─ API Gateway           45ms   ██         │
│  │                                          │
│  ├─ Auth Service          120ms  █████      │
│  │                                          │
│  ├─ User Service           85ms  ███        │
│  │                                          │
│  ├─ Inventory Check       180ms  ███████    │
│  │                                          │
│  ├─ Tax Calculator        680ms  ████████████████████ 🔥
│  │   (第三方 API)                            │
│  │                                          │
│  ├─ Payment Gateway       95ms   ████       │
│  │                                          │
│  └─ Order Creation        35ms   █          │
│                                              │
│  📊 延遲貢獻分析:                             │
│  ▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬                     │
│  Tax Calculator    54.8%  ████████████████  │
│  Inventory Check   14.5%  ████              │
│  Auth Service       9.7%  ███               │
│  其他              21.0%  ██████             │
│                                              │
│  🎯 優化目標: 優先處理 Tax Calculator         │
└──────────────────────────────────────────────┘

為什麼有效:快速指出罪魁禍首:數據庫、身份驗證、緩存、第三方 API

📝 真實案例:我發現 60% 的結帳延遲與隱藏在三層深處的「稅務計算器」跨度相關。這個視圖在五分鐘內就暴露了問題。


6. N+1 Query Detector(N+1 查詢檢測器)

N+1 查詢模式通常表現為部署後每個請求的跨度中值計數跳躍,隨之而來的是延遲攀升。

顯示內容:每個事務的請求與響應時間,以及每個路由跨度計數分佈

┌─────────────── N+1 查詢檢測 ───────────────┐
│                                            │
│  路由: /api/users/{id}/orders              │
│                                            │
│  部署前 (v1.2.3) │ 部署後 (v1.2.4)         │
│  ─────────────────────────────────────    │
│                                            │
│  每請求跨度數:                              │
│  ┌──────────┐  │  ┌──────────┐            │
│  │    8     │  │  │   156    │ 🔥         │
│  │  spans   │  │  │  spans   │            │
│  └──────────┘  │  └──────────┘            │
│                                            │
│  平均延遲:                                  │
│  ┌──────────┐  │  ┌──────────┐            │
│  │  245ms   │  │  │  3,840ms │ 🔥         │
│  └──────────┘  │  └──────────┘            │
│                                            │
│  🔍 檢測到的模式:                           │
│  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━         │
│  for order in orders:                     │
│    ├─ SELECT * FROM order_items           │
│    ├─ SELECT * FROM order_items           │
│    ├─ SELECT * FROM order_items           │
│    └─ ... (重複 150+ 次) ⚠️                │
│                                            │
│  💡 建議: 使用 JOIN 或批量查詢優化          │
└────────────────────────────────────────────┘

為什麼有效:如果在部署後每個請求的跨度中值計數跳躍並且延遲攀升,則您可能引入了 N+1 模式

🚨 簡單啟發式警報:當超過 15 分鐘的路由 spans_per_request p95 增加超過 25% 時,應發出警報,這極有可能表示引入了 N+1 模式。

🎯 SLO 與錯誤管理

7. Error Budget Burn(錯誤預算消耗)

顯示內容:服務 SLO(可用性/延遲)、當前錯誤預算和消耗率(1h & 6h 窗口)

┌──────────────── SLO 錯誤預算監控 ────────────────┐
│                                                  │
│  服務: payment-service                           │
│  SLO 目標: 99.9% (30 天)                         │
│                                                  │
│  📊 剩餘錯誤預算                                  │
│  ████████████████████░░░░░░░░  68.2% (19.5天)   │
│                                                  │
│  🔥 消耗率分析                                    │
│  ┌────────────────────────────────────────────┐ │
│  │ 時間窗口    消耗率      狀態                  │ │
│  ├────────────────────────────────────────────┤ │
│  │ 1 小時     2.8%/hr    🔴 高速消耗 (>2%)      │ │
│  │ 6 小時     1.2%/hr    🟡 中速消耗            │ │
│  │ 24 小時    0.6%/hr    🟢 正常                │ │
│  └────────────────────────────────────────────┘ │
│                                                  │
│  📈 消耗趨勢 (過去 24 小時)                       │
│   %│      ╱╲                    ╱╲              │
│  3 │    ╱    ╲                ╱    ╲            │
│  2 │  ╱        ╲            ╱        ╲          │
│  1 │╱            ╲        ╱            ╲        │
│  0 └──┴───┴───┴───┴───┴───┴───┴───┴───┴──      │
│    0   4   8  12  16  20  24 (小時)             │
│                                                  │
│  ⚠️  警報: 1小時消耗率超過閾值 (>2%)              │
│  🚨 行動: 立即調查並停止非關鍵部署                │
└──────────────────────────────────────────────────┘

為什麼有效:

  • 一小時內消耗 2% 的預算 = "停止一切"

  • 每週消耗 2% = "計劃修復"

# Example SLO label enrichment
processors:
  attributes:
    actions:
      - key: slo.target
        value: "0.99"
        action: insert

💡 儀表板提示:按預算跑道(剩餘天數)對服務進行分組,這是非常有效的聚焦工具。

⚙️ 運行時與資源優化

8. GC & Alloc Pressure(GC 和分配壓力)

對於使用 JVM、.NET、Go 的服務,GC(垃圾回收)暫停會佔用 CPU 時間並影響延遲。

顯示內容:GC 暫停時間百分位、分配率、使用中的堆和提升率

┌──────────────── JVM GC 壓力監控 ────────────────┐
│                                                 │
│  服務: order-processor-service (JVM)            │
│                                                 │
│  🗑️ GC 暫停時間分佈                              │
│  ms│                                            │
│ 500│                          ╱╲                │
│ 400│                        ╱    ╲              │
│ 300│              ╱╲      ╱        ╲            │
│ 200│      ╱╲    ╱    ╲  ╱            ╲          │
│ 100│    ╱    ╲╱        ╲                ╲       │
│   0└──┴───┴───┴───┴───┴───┴───┴───┴───┴──      │
│    8:00 9:00 10:00 11:00 12:00 13:00           │
│                                                 │
│  📊 關鍵指標                                     │
│  ┌───────────────────────────────────────────┐ │
│  │ GC 暫停 p99:  380ms  ████████████░  🔥    │ │
│  │ 分配率:       2.4GB/s ███████████████      │ │
│  │ 堆使用:       87%     ████████████████ 🔥  │ │
│  │ 提升率:       450MB/s ████████░░░░░        │ │
│  └───────────────────────────────────────────┘ │
│                                                 │
│  📈 GC vs 延遲相關性                             │
│      p95 延遲 (ms)                              │
│ 800│  ●                    ●                    │
│ 600│     ●              ●                       │
│ 400│        ●        ●         ●                │
│ 200│           ●  ●               ●             │
│   0└──┴───┴───┴───┴───┴───┴───┴───┴──          │
│      GC 暫停時間 (ms) →                         │
│                                                 │
│  💡 相關係數: 0.89 (強相關)                      │
│  🔧 建議: 調整堆大小或優化熱路徑對象分配          │
└─────────────────────────────────────────────────┘

為什麼有效:當 p95 因 GC 暫停而增加時,CPU 時間被內存攪動所佔用

🔧 行動模式:

  • • 流量高峰期間暫停峰值:應減少熱路徑上的分配或調整堆/GC 配置。

    • 部署後暫停峰值:應檢查物件生命週期和緩存更改,可能是新的程式碼導致記憶體攪動 (memory churn)。


9. Cold Starts & Autoscaling Granularity(冷啟動和自動縮放)

顯示內容:冷啟動跨度的計數和延遲、容器啟動率以及隨時間的擴展事件

┌────────── 冷啟動與自動縮放監控 ──────────┐
│                                          │
│  服務: lambda-image-processor            │
│                                          │
│  ❄️ 冷啟動統計 (過去 1 小時)              │
│  ┌────────────────────────────────────┐ │
│  │ 冷啟動次數:    47 次                │ │
│  │ 冷啟動率:      23.5%  ⚠️            │ │
│  │ 平均延遲:      2,340ms              │ │
│  │ 暖啟動延遲:    145ms                │ │
│  │ 延遲差距:      16.1x  🔥            │ │
│  └────────────────────────────────────┘ │
│                                          │
│  📊 啟動類型分佈                          │
│  ┌────────────────────────────────────┐ │
│  │ ❄️ 冷啟動  ████████░░░░░░░░  47     │ │
│  │ 🔥 暖啟動  ████████████████  153    │ │
│  └────────────────────────────────────┘ │
│                                          │
│  ⚡ 擴展事件時間線                        │
│  實例數                                   │
│   20│        ┌───┐      ┌───┐          │
│   15│    ┌───┤   ├───┐  │   │          │
│   10│  ┌─┤   │   │   ├──┤   ├─┐        │
│    5│──┤ │   │   │   │  │   │ ├──      │
│    0└──┴─┴───┴───┴───┴──┴───┴─┴──      │
│      8  9  10  11  12  13  14 (時)      │
│       ↑冷啟動峰值                        │
│                                          │
│  💡 優化建議:                             │
│  • 設置最小實例數: 3 → 5                  │
│  • 預熱關鍵依賴 (DB 連接、配置)            │
│  • 延遲加載非關鍵模組                     │
└──────────────────────────────────────────┘

為什麼有效:Serverless 和 k8s 自動縮放會帶來突發懲罰,此儀表板將其量化

🔧 修復路徑:預熱、調整最小實例或將重初始化從冷路徑轉移到穩定狀態


10. Retry/Timeout Feedback Loop(重試/超時反饋循環)

顯示內容:重試計數、超時率以及由此產生的下游 QPS

┌─────────── 重試與超時反饋循環 ───────────┐
│                                          │
│  🔄 重試模式分析                          │
│                                          │
│  原始請求 vs 實際請求 (包含重試)           │
│  QPS │                                   │
│  800 │              ╱╲                   │
│  600 │            ╱    ╲   ╱╲            │
│  400 │          ╱        ╲╱  ╲           │
│  200 │    ────╱                ╲────     │
│      │  ══════════════════════════════   │
│    0 └──┴───┴───┴───┴───┴───┴───┴──     │
│       8   9   10  11  12  13  14 (時)    │
│       ── 原始  ══ 實際 (含重試)           │
│                                          │
│  📊 放大倍數                              │
│  ┌────────────────────────────────────┐ │
│  │ 時間      原始QPS  實際QPS  倍數     │ │
│  ├────────────────────────────────────┤ │
│  │ 10:00    200      580      2.9x    │ │
│  │ 11:00    250      750      3.0x 🔥 │ │
│  │ 12:00    180      520      2.9x    │ │
│  └────────────────────────────────────┘ │
│                                          │
│  ⚠️ 重試風暴分析                          │
│  ┌────────────────────────────────────┐ │
│  │ 原始錯誤:  2.5%                     │ │
│  │ 重試策略:  指數退避 (3 次最大)       │ │
│  │ 結果影響:  下游流量 +190%           │ │
│  │           延遲增加 +340%            │ │
│  └────────────────────────────────────┘ │
│                                          │
│  🔧 建議修復:                             │
│  • 添加 jitter 避免重試同步              │
│  • 降低最大重試次數: 3 → 2               │
│  • 實施斷路器保護下游                    │
└──────────────────────────────────────────┘

為什麼有效:積極的重試會將微小的信號變成交通風暴,您會看到「迴聲」

⚖️ 經驗法則:

  • 錯誤是暫時的且短暫的 → 在抖動情況下限制重試

  • 錯誤持續存在 → 快速失敗並減輕負載以保護核心


11. Cache Efficacy & Eviction Storms(緩存效率和驅逐風暴)

顯示內容:命中率(按鍵空間)、獲取/設置延遲、驅逐和連接池統計

┌──────────── 緩存效率監控 ────────────┐
│                                      │
│  🎯 緩存命中率趨勢                    │
│   %│                                 │
│ 100│ ─────────────╲                  │
│  80│               ╲   ╱─────       │
│  60│                ╲╱        ⚠️     │
│  40│                                │
│  20│                                │
│   0└──┴───┴───┴───┴───┴───┴──      │
│     8   9   10  11  12  13 (時)     │
│          ↑ 驅逐風暴開始               │
│                                      │
│  📊 詳細指標                          │
│  ┌──────────────────────────────┐   │
│  │ 命中率:    62%  ████████░░   │   │
│  │ 未命中率:  38%  █████░░░░░   │   │
│  │ 驅逐/分:   1,240 ████████████│🔥 │
│  │ 平均延遲:  8ms  ███░░░░░░░   │   │
│  └──────────────────────────────┘   │
│                                      │
│  🔥 驅逐風暴分析                      │
│  驅逐/分                              │
│ 2000│          ╱╲                    │
│ 1500│        ╱    ╲                  │
│ 1000│      ╱        ╲╱╲              │
│  500│  ──╱              ╲──          │
│    0└──┴───┴───┴───┴───┴──          │
│      10:00 10:15 10:30 10:45        │
│                                      │
│  💡 根本原因: TTL 同步到期             │
│  ┌──────────────────────────────┐   │
│  │ 90% 的緩存鍵在 10:30 同時到期 │   │
│  │ 導致驚群效應 (thundering herd) │   │
│  └──────────────────────────────┘   │
│                                      │
│  🔧 優化方案:                         │
│  • TTL 添加隨機抖動 (±10%)            │
│  • 熱鍵實施請求合併                   │
│  • 增加緩存容量 20%                   │
└──────────────────────────────────────┘

為什麼有效:

  • 80% 命中率 → 快樂

  • 隨著驅逐次數增加降至 60% → 驚群效應或糟糕的 TTL

🔧 真正的修復:為熱鍵添加請求合併並錯開 TTL,以避免同步到期懸崖


12. Golden Signals × Release Overlay(黃金信號 × 釋放覆蓋)

顯示內容:延遲、流量、錯誤、飽和度,搭配部署標記和功能標記切換

┌─────────────── 黃金信號 + 部署關聯 ───────────────┐
│                                                   │
│  📊 延遲 (Latency)                                │
│  ms│                    ┃                         │
│ 800│                    ┃  ╱╲                     │
│ 600│            ╱╲      ┃╱    ╲                   │
│ 400│          ╱    ╲    ┃       ╲                 │
│ 200│    ────╱        ╲──┃         ╲────           │
│   0└──┴───┴───┴───┴───┃───┴───┴───┴──            │
│     8   9   10  11  12┃13  14  15  16 (時)       │
│                       ┃                           │
│  📈 流量 (Traffic)    ┃v104-25%                   │
│ QPS│                  ┃                           │
│ 500│  ════════════════┃════════════               │
│ 400│                  ┃                           │
│                       ┃                           │
│  ❌ 錯誤率 (Errors)   ┃                           │
│   %│                  ┃  ╱╲                       │
│  5 │                  ┃╱    ╲                     │
│  3 │                  ┃       ╲                   │
│  1 │  ────────────────┃─────────────              │
│                       ┃                           │
│  🔥 飽和度 (Saturation) ┃                         │
│   %│                  ┃    ╱────╲                 │
│ 80 │                  ┃  ╱        ╲               │
│ 60 │  ──────────────╱ ┃╱            ╲──           │
│                       ┃                           │
│  ┃ = 部署標記: v104 rollout 25%                   │
│                                                   │
│  🎯 爆炸半徑分析                                   │
│  ┌───────────────────────────────────────────┐   │
│  │ 服務名稱          指標變化    Σ 偏差       │   │
│  ├───────────────────────────────────────────┤   │
│  │ payment-svc      +340% 延遲   4.2σ  🔥   │   │
│  │ order-processor  +180% 錯誤   3.8σ  🔥   │   │
│  │ auth-service     +45% 延遲    2.1σ  ⚠️   │   │
│  │ user-service     +12% 延遲    0.8σ  ✓    │   │
│  └───────────────────────────────────────────┘   │
│                                                   │
│  🚨 建議: 回滾 v104 並調查 payment-svc 變更        │
└───────────────────────────────────────────────────┘

為什麼有效:無需猜測即可關聯。「v104-rollout-25%」後五分鐘出現峰值?現在你知道在哪裡挖掘了

🎁 獎勵:添加「爆炸半徑」面板,列出自部署以來指標變化 ≥2σ 的服務


🏗️ 架構流程

[App / Services] --OTLP--> [OTel Collector]
      | traces,metrics,logs         |
      |                             +--> [Time-Series DB] 
      |                             |    └─> RED, Tail, Saturation, Queue
      |                             |
      |                             +--> [Trace Store]
      |                             |    └─> Waterfall, N+1, Exemplars
      |                             |
      |                             +--> [Log Store]
      |                                  └─> Errors, Retries, Cold Starts
      |
[Feature Flags / CI-CD] ---------> [Deploy Markers] 
                                    └─> Overlays on all dashboards

核心思想:

  • 一個 Collector,多個管道

  • 跨度指標為 RED/尾部圖表提供支持

  • 範例將尖峰與原始追蹤連接起來

  • 部署標記將因果關係縫合到視覺效果中

🔍 查詢片段範例

p95 延遲(按路由)

histogram_quantile(
  0.95,
  sum by (le, http_route) (rate(traces_span_duration_bucket[5m]))
)

每項服務的重試率

sum by (service_name) (rate(traces_span_events_total{event="retry"}[5m]))
/
sum by (service_name) (rate(traces_span_total[5m]))

每個請求的跨度計數

sum by (http_route) (rate(spans_per_request_total[5m])) 
/ clamp_min(sum by (http_route) (rate(requests_total[5m])), 1)

這些儀表板不僅僅是圖表,它們是從混亂的資料中提取行動信號的工具。

1. 橋接數據:從指標到追蹤的連貫性

在儀表板設計中,最關鍵的步驟是建立數據之間的橋樑。

• 核心思想:單一的 OTel Collector 可以處理追蹤、指標和日誌。

• 實現連貫性:範例 (Exemplars) 扮演著關鍵角色。它們能夠將尾部延遲圖表等指標中的尖峰,直接連結到造成該尖峰的原始追蹤 (raw traces),使你能夠「直接從尖峰跳到有問題的跨度」。

2. 聚焦:部署標記縫合因果關係

當延遲或錯誤率發生變化時,工程師經常需要猜測是否與最近的部署有關。

• 黃金信號 × 釋放覆蓋 (Golden Signals × Release Overlay) 儀表板解決了這個問題。

• 通過 CI/CD 將部署標記 (service.version 和發布標記) 疊加到所有儀表板上,你可以無需猜測即可關聯問題。例如,在「v104-rollout-25%」後五分鐘出現的峰值,會立即指引調查方向。

• 同時,「爆炸半徑」面板能列出部署後指標變化超過 2σ 的服務,極大地縮小了調查範圍。

3. 行動性:保持警報的精準與安靜

設置過多的警報會產生疲勞。為了確保警報真正代表了業務風險並需要緊急行動,來源建議僅設置 3 個關鍵警報,保持警報的精準與安靜 (Keep it quiet, keep it crisp):

1. 快速燃燒:在 1 小時內消耗的錯誤預算超過 SLO 的 14 倍。

2. 隊列年齡:隊列中最老的消息年齡超過 SLO 設定時間的一半。

3. 長尾差距:p99 與 p50 的差距超過您的用戶容忍度。

🚀 10 分鐘推出計劃

  1. ✅ 在 Collector 中啟用跨度指標,運送到指標存儲

  2. ✅ 添加示例,使尾部圖在點擊時鏈接到追蹤

  3. ✅ 通過 CI 使用 service.version 和發布標記標記部署

  4. ✅ 從四個板開始:每條路線的 RED、尾部延遲、依賴瀑布、錯誤預算消耗

  5. ✅ 隨著模式出現擴展到其餘部分(隊列、GC、重試、緩存、自動縮放)

  6. ✅ 僅設置 3 個警報:

    • 快速燃燒(1 小時內 >14x SLO)

    • 隊列年齡 > SLO/2

    • p99 與 p50 的差距超出用戶容忍度

┌────────────── 實施路線圖 ──────────────┐
│                                        │
│  ✅ 階段 1: 基礎設置 (2 分鐘)           │
│     └─ 在 Collector 中啟用 spanmetrics │
│                                        │
│  ✅ 階段 2: 追蹤增強 (2 分鐘)           │
│     └─ 添加 exemplars 連結             │
│                                        │
│  ✅ 階段 3: 部署標記 (1 分鐘)           │
│     └─ CI 整合 service.version         │
│                                        │
│  ✅ 階段 4: 核心儀表板 (3 分鐘)         │
│     ├─ RED (每條路線)                  │
│     ├─ 尾部延遲                        │
│     ├─ 依賴瀑布                        │
│     └─ 錯誤預算消耗                    │
│                                        │
│  ✅ 階段 5: 擴展監控 (2 分鐘)           │
│     ├─ 隊列健康                        │
│     ├─ GC 壓力                         │
│     ├─ 重試循環                        │
│     └─ 緩存效率                        │
│                                        │
│  🔔 階段 6: 關鍵警報 (僅 3 個!)         │
│     ├─ 快速消耗 (>14x SLO/1h)          │
│     ├─ 隊列年齡 > SLO/2                │
│     └─ p99-p50 差距超過容忍度          │
│                                        │
└────────────────────────────────────────┘

📖 真實案例故事

一家金融科技 API 在 /quote 端點上看到間歇性的 p99 峰值。

調查過程:

  • ✓ RED 平均看起來不錯

  • ✓ 尾部延遲板顯示 p99-p50 差距僅在市場開放期間擴大

  • ✓ 依賴瀑布指出第三方定價跨度

  • ✓ 重試/超時視圖顯示指數重試將每個信號點的流量乘以 3 倍

修復方案:

  1. 限制重試並加入抖動

  2. 為「熱門符號」添加 100 ms 緩存

  3. 在開盤前預熱實例

結果:p99 次日下跌 47%,值班人員安靜了。

┌────────────── 金融科技 API 案例 ──────────────┐
│                                              │
│  🏦 背景                                      │
│  服務: /quote API (股票報價)                  │
│  問題: 間歇性 p99 延遲峰值                     │
│                                              │
│  🔍 調查過程                                  │
│  ┌──────────────────────────────────────┐   │
│  │ 步驟 1: RED 儀表板                    │   │
│  │  ✓ 平均值看起來正常                   │   │
│  │  ✗ p99 有異常峰值                    │   │
│  └──────────────────────────────────────┘   │
│  ┌──────────────────────────────────────┐   │
│  │ 步驟 2: 尾部延遲分析                  │   │
│  │  ✓ p99-p50 差距僅在市場開盤時擴大     │   │
│  │  📊 差距: 正常 200ms → 高峰 1,100ms  │   │
│  └──────────────────────────────────────┘   │
│  ┌──────────────────────────────────────┐   │
│  │ 步驟 3: 依賴瀑布                      │   │
│  │  🎯 發現: 第三方定價 API 佔 60% 延遲  │   │
│  └──────────────────────────────────────┘   │
│  ┌──────────────────────────────────────┐   │
│  │ 步驟 4: 重試/超時分析                 │   │
│  │  🔥 指數重試將流量放大 3 倍           │   │
│  └──────────────────────────────────────┘   │
│                                              │
│  🔧 修復方案                                  │
│  1️⃣ 限制重試次數並加入 jitter               │
│  2️⃣ 為「熱門股票」添加 100ms 緩存            │
│  3️⃣ 開盤前 5 分鐘預熱實例                    │
│                                              │
│  📊 結果                                      │
│  ┌────────────────────────────────┐         │
│  │ Before │  After  │  改善       │         │
│  ├────────────────────────────────┤         │
│  │ p99: 1,240ms │ 658ms │ -47% ✅│         │
│  │ 值班警報:  8/天 │  0.5/天 │ -94% ✅│   │
│  └────────────────────────────────┘         │
│                                              │
│  ⏱️ 從發現到修復: 4 小時                      │
└──────────────────────────────────────────────┘

💡 總結

遙測並不是要擁有更多數據,而是讓少數視圖清晰易讀,使你的下一步行動顯而易見。

這 12 個儀表板能將詭異的圖表轉化為具體的解決方案。

一張資訊圖表說明四個 OpenTelemetry 儀表板,用於核心服務健康度、延遲分析、根因分析和錯誤預算消耗的監控。

如果您的監控系統是一棟佈滿傳感器的複雜大樓,那麼 OpenTelemetry 的 12 個關鍵儀表板就像是電力控制室裡的一組精準的斷路器和壓力表。您不需要看著幾百盞小燈閃爍,只需看著少數幾個儀表(RED、尾部差距、錯誤預算)就能迅速判斷故障點,並透過部署標記直接找出是哪個新安裝的設備(部署)造成了短路。這讓您能夠從「猜測問題」轉向「鎖定並修復問題」。

More from this blog

AI 時代下的系統可理解性問題

GAI 的時代下,近一年很流行 Vibe-coding,幾乎人人都在草率地使用 Vibe-coding 一詞來指一系列的軟體工程實踐。它指的是一種開發者不親自手打 coding,而是僅透過自然語言向 AI 描述需求(給出「方向」或「感覺」),完全放手讓 AI 代理去自動生成、拼湊出整個應用程式的開發風格。 然而,在專業的軟體工程領域,這股看似美好的「Vibe」背後,隱藏著極高的安全隱患與系統崩潰危

Aug 24, 20263 min read234
AI 時代下的系統可理解性問題

Get Your Hands Dirty on Clean Architecture CH5 Use Case

書本連結 前言 會挑這本書看的人,應該都是關心自己負責專案的軟體架構的人。不只希望開發的軟體能滿足客戶的明確需求,也希望能滿足可維護性(maintainability)的隱性需求,以及自己對結構與美觀習慣的要求。 要能滿足上述這些要求很難,因為專案通常不會按照計畫進行。可能變因有 deadline,最後的 API 與承諾的不同,又或者我們的設計無法很好的貼合需求的變化所需。。因此完美的架構只有在一

Jul 2, 20264 min read149
Get Your Hands Dirty on Clean Architecture CH5 Use Case
M

MicroFIRE

75 posts