iT邦幫忙

2025 iThome 鐵人賽

DAY 27
0

前言

欸,昨天 Day26 我們聊了 cAdvisor。那東西就是那種「你不會天天想它,但一爆掉就要命」的存在。今天換一個角度:我們不要只看裡面,要從外面戳戳看。

你總不能跟老闆說:

「嗯,我看應用內部健康檢查都是 OK 的呀。」

結果老闆一打開手機,API 回不來。這畫面就像你跟女朋友說:「我明明很愛妳啊」,但她回:「屁啦,你 Line 已讀不回三天。」

這時候就需要 Blackbox Exporter。它就是那種 站在外面偷窺你家有沒有燈亮的變態監控器。內部怎麼跑它不管,它只在乎:

  • 你有回應嗎?
  • 回應長什麼樣子?
  • 你是不是偷偷掛掉?

說白話一點:它是 黑箱探測器


1️⃣ Blackbox Exporter 是啥?

來,用一句話講清楚:

Blackbox Exporter = Prometheus 的外部探測代理人

  • Blackbox Exporter 會根據 module 配置執行 probe,檢查目標服務是否「可用」。

  • 重要特點:

    1. 外部觀察:不管服務內部程式如何運作,只看回應結果。
    2. 多協議支援:HTTP、TCP、ICMP、DNS。
    3. Prometheus 指標輸出:例如 probe_successprobe_duration_seconds

Blackbox Exporter 提供 probe 功能,它可以:

  • HTTP probe:丟個 GET/POST 看你回不回 200。
  • TCP probe:戳一下 port 看你還在不在。
  • ICMP probe:ping 你一下,確認你還沒跑路。
  • DNS:查個紀錄,看看你是不是搞丟網域。

聽起來簡單對吧?但靠它,你就能補齊「從用戶角度來看,服務到底活著沒」這件事。

就像醫院檢查:Node Exporter 看血壓,cAdvisor 看器官數據,而 Blackbox Exporter 是護士直接跑來問:
「欸,你還能講話嗎?你可以走兩步給我看嗎?」


2️⃣ probe = 健康檢查

探測(Probe)是什麼?

來,技術名詞時間:probe 就是探測。

它回答兩個問題:

  1. 系統活著嗎?
  2. 系統正常嗎?

比方說:

  • 你每天早上打開冰箱 → 還有沒有牛奶?(活著)
  • 倒一杯來喝 → 有沒有壞掉?(正常)

對 IT 系統來說:

  • 活著 = endpoint 會回應。
  • 正常 = 回應碼對,內容對,延遲不要爆。

如果 endpoint 是 200 → 恭喜活著。
如果 endpoint 回 502 → 活著,但智商低(就像剛睡醒的你)。
如果完全不回 → RIP。

probe 的種類

module 名稱 協議 作用 專案範例
http_2xx HTTP GET 檢查服務 endpoint 是否回傳 2xx /docs, /api/v1/health
http_post HTTP POST 檢查 POST API 回傳狀態碼 /api/v1/ask, /api/v1/stream
tcp_connect TCP 檢查 TCP 端口連線 DB、Redis、Qdrant、Storage

注意:Blackbox Exporter 底層不是單純 ping,它會根據 module 的定義執行不同類型的 probe,例如 GET、POST 請求或 TCP 連線。


3️⃣ module = 探測腳本

Blackbox 的厲害之處是 module 可以客製化。

舉例:

modules:
  http_2xx:
    prober: http
    timeout: 5s
    http:
      valid_http_versions: ["HTTP/1.1", "HTTP/2"]
      valid_status_codes: []
      method: GET
      fail_if_ssl: false
      fail_if_not_ssl: false
      preferred_ip_protocol: "ip4"
      fail_if_body_matches_regexp: []
      fail_if_body_not_matches_regexp: []

  http_post:
    prober: http
    timeout: 5s
    http:
      method: POST
      headers:
        Content-Type: "application/json"
      body: '{"key":"value"}'
      valid_status_codes: [200,201]
      fail_if_ssl: false
      fail_if_not_ssl: false
      preferred_ip_protocol: "ip4"

  tcp_connect:
    prober: tcp
    timeout: 5s
    tcp:
      preferred_ip_protocol: "ip4"

來翻譯:

  • http_2xx:最常見的健康檢查,用 GET 打 API,回應任何 2xx 就算過關。
    👉「丟個 GET,回 2xx 就好」
  • http_post:模擬應用發送 POST,驗證回應是否是 200 或 201。
    👉「丟個 POST 帶 JSON,回 200/201 就算成功」
  • tcp_connect:單純檢查 TCP port 能不能連,例如 DB 或 Redis。
    👉「戳戳 port,有回應就算活」
    這就像醫生開不同的檢查單:
  • 量血壓(GET)
  • 抽血(POST)
  • 敲膝蓋反射(TCP)

結果都放到 Prometheus 指標裡

這種「模組化設計」讓你能針對不同服務選不同的 probe,靈活監控 API、微服務、資料庫。


流程

  1. Blackbox Exporter 根據 blackbox.yml 定義的 module 去 probe 目標
  2. 將結果轉成 Prometheus metric,例如:
    • probe_success → 成功 1 / 失敗 0
    • probe_duration_seconds → 探測延遲時間
  3. Prometheus 抓取 metric,rule.yml 判斷是否需要告警

4️⃣ Prometheus 配置怎麼寫?

HTTP GET probe

modules:
  http_2xx_health:
    prober: http
    http:
      method: GET
      valid_status_codes: [200]

  • 作用:檢查 /health endpoint 是否回傳 200
  • probe 成功 → probe_success = 1
  • probe 失敗 → probe_success = 0,可能觸發告警

HTTP POST probe

modules:
  http_post_ask:
    prober: http
    http:
      method: POST
      body: '{"text":"string","user_id":"string"}'

  • 模擬完整的 POST API 請求
  • 適合驗證「功能」是否正常,而不是單純「服務有沒有活著」

3.3 TCP probe

- job_name: 'blackbox-tcp'
  metrics_path: /probe
  params:
    module: [tcp_connect]
  static_configs:
    - targets:
        - 'note-db:5432'
        - 'redis:6379'
        - 'note-qdrant:6333'
        - 'note-storage:9000'
  relabel_configs:
    - source_labels: [__address__]
      target_label: __param_target
    - source_labels: [__param_target]
      target_label: instance
    - target_label: __address__
      replacement: blackbox-exporter:9115
  • 適合監控資料庫、Redis、向量 DB、物件儲存這類 TCP 服務
  • Prometheus 會收集「存活狀態」與「延遲時間」

5️⃣ Blackbox Exporter 工作流程

  1. Prometheus 每隔 scrape_interval/probe?target=<url>&module=<module> 請求給 Blackbox Exporter

  2. Blackbox Exporter 根據 module 設定:

    • HTTP GET → 發送 GET,檢查 status code、body、延遲
    • HTTP POST → 發送 POST,檢查 status code、body、延遲
    • TCP → 嘗試連線 TCP port
  3. 產生 metrics:

    • probe_success → 成功 1 / 失敗 0。你是生是死。
    • probe_duration_seconds → 整個探測花多久。反應快不快。
    • probe_http_status_code → API 回的狀態碼。有沒有亂回東西。
      有時候 probe_success = 1probe_http_status_code = 500
      「API 還活著,但回你一句:我壞掉了。」
      (就像女友還在你身邊,但已經不理你)
  4. Prometheus 收集 metrics,可做告警或 Grafana 可視化

簡單來說,它會「周期性 ping」你的 API 或服務,但 ping 的方式不限於 ICMP,而是根據 module 做不同類型的探測。


6️⃣ 實戰建議

其實黑箱探測就是一種「外部驗證」。

你不能只聽自己講「我很好」,要有人來戳你一下才算數。
就像感情關係,不能只有單方面覺得幸福,要對方也能感受到。

技術層面上,Blackbox Exporter 補足了:

  • Node Exporter → 看機器活不活。
  • cAdvisor → 看容器健不健康。
  • Blackbox → 站在外面驗證整個服務「能不能用」。

這三個湊齊,就像是 監控三重防護罩。

實戰小技巧:

  • 模組化管理:對不同類型服務使用不同 module
  • 告警設定probe_success == 0 可觸發服務下線告警
  • 延遲監控:透過 probe_duration_seconds 分析服務響應性能
  • 組合監控:HTTP probe + TCP probe,覆蓋應用層與服務層

小結

好啦,Day27 就到這邊。

Blackbox Exporter 說穿了不複雜,但就像那個永遠坐在角落的同事:
你平常覺得他有點詭異,但沒有他又覺得不安。

把今天重點濃縮一下:

  • 探測 = 系統健康檢查的動作
  • Blackbox Exporter → 負責做探測(GET、POST、TCP…)
  • Prometheus → 把探測結果收集成 metrics

👉 健康檢查大多數時候用 GET probe 就好,因為輕量快速。
👉 少數核心 API 才會配置 POST probe,但會嚴格控制 body / token 數量,避免洩露或額外負擔。
畢竟 Blackbox 叫「黑箱」,你要對得起它的名字,不是什麼都塞進去。

[Prometheus] 
     │
     ▼
[Blackbox Exporter]
     ├─ GET probe → 健康檢查 endpoints
     └─ POST probe → 核心 API endpoints (少量、含必要 body / token)
     │
     ▼
[Alertmanager] → 發送告警 (Slack / Email)

明天 Day28,我們來聊聊 Grafana Dashboard。
因為「有數據 ≠ 有洞察」,你還需要一雙能看懂數據的眼睛 👀。



上一篇
Day 26 | 容器怪獸現形!cAdvisor 幫你抓出資源怪
下一篇
Day28|生命線大公開!Grafana Dashboard 一眼看透系統健康
系列文
論文流浪記:我與AI 探索工具、組合流程、挑戰完整平台31
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言