切換選單
切換偏好設定選單
切換個人選單
尚未登入
若您做出任何編輯,會公開您的 IP 位址。
於 2026年3月4日 (三) 19:50 由 Aricch留言 | 貢獻 所做的修訂 (add category)
(差異) ←上個修訂 | 最新修訂 (差異) | 下個修訂→ (差異)

用 Docker / Docker Compose 部署「伺服器延時(Latency)監控」**的常用方案:Prometheus + Blackbox Exporter + Grafana。Blackbox Exporter 負責對目標做 HTTP / TCP / ICMP(Ping) 探測並產出 probe_* 指標,Prometheus 抓取,Grafana 展示。


1) 目錄結構

在一台「監控機」(能訪問你要監控的伺服器/埠的那台機器)上建目錄:

monitoring/
  docker-compose.yml
  prometheus/
    prometheus.yml
    rules/
      blackbox-alerts.yml        # 可选:告警规则
  blackbox/
    blackbox.yml
  grafana/
    provisioning/
      datasources/
        datasource.yml

2) docker-compose.yml

版本我這裡選用:

  • Prometheus prom/prometheus:v3.10.0(示例;該 tag 存在於 Docker Hub)(Docker Hub)
  • Blackbox Exporter prom/blackbox-exporter:v0.28.0(Docker Hub)
  • Grafana grafana/grafana:12.3-ubuntu(你也可換成 12.3 等)(Docker Hub)
  • Alertmanager 可選 prom/alertmanager:v0.31.1(Docker Hub)
services:
  prometheus:
    image: prom/prometheus:v3.10.0
    container_name: prometheus
    command:
      - --config.file=/etc/prometheus/prometheus.yml
      - --storage.tsdb.path=/prometheus
      - --web.enable-lifecycle
    volumes:
      - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml:ro
      - ./prometheus/rules:/etc/prometheus/rules:ro
      - prometheus_data:/prometheus
    ports:
      - "9090:9090"
    restart: unless-stopped
    networks: [monitor]

  blackbox-exporter:
    image: prom/blackbox-exporter:v0.28.0
    container_name: blackbox-exporter
    command:
      - --config.file=/etc/blackbox/blackbox.yml
    volumes:
      - ./blackbox/blackbox.yml:/etc/blackbox/blackbox.yml:ro
    # 建议:生产环境不对外暴露 9115;需要本机调试再开端口映射
    ports:
      - "9115:9115"
    restart: unless-stopped
    networks: [monitor]
    # ICMP(ping) 需要额外权限(二选一:cap_add 更推荐;privileged 更大)
    cap_add:
      - NET_RAW
    # privileged: true

  grafana:
    image: grafana/grafana:12.3-ubuntu
    container_name: grafana
    environment:
      - GF_SECURITY_ADMIN_USER=admin
      - GF_SECURITY_ADMIN_PASSWORD=admin  # 首次登录后务必修改
    volumes:
      - grafana_data:/var/lib/grafana
      - ./grafana/provisioning:/etc/grafana/provisioning:ro
    ports:
      - "3000:3000"
    restart: unless-stopped
    networks: [monitor]

  # 可选:Prometheus 规则触发后,用 Alertmanager 分发通知
  alertmanager:
    image: prom/alertmanager:v0.31.1
    container_name: alertmanager
    # 先用默认示例配置也能跑起来;要发通知再挂载你自己的 alertmanager.yml
    ports:
      - "9093:9093"
    restart: unless-stopped
    networks: [monitor]

networks:
  monitor:

volumes:
  prometheus_data:
  grafana_data:

3) blackbox.yml(探測模塊配置)

Blackbox Exporter 支持 HTTP/HTTPS、TCP、ICMP、DNS、gRPC 等探測。(GitHub)

先放最常用的 3 個模塊:HTTP 200、TCP 埠連通、ICMP ping。

blackbox/blackbox.yml

modules:
  http_2xx:
    prober: http
    timeout: 5s
    http:
      preferred_ip_protocol: "ip4"
      valid_http_versions: ["HTTP/1.1", "HTTP/2"]
      method: GET
      no_follow_redirects: false

  tcp_connect:
    prober: tcp
    timeout: 5s

  icmp:
    prober: icmp
    timeout: 3s
    icmp:
      preferred_ip_protocol: "ip4"

ICMP 權限提示(很關鍵):在 Linux 上,ICMP 探測需要 CAP_NET_RAW 或 root 等權限;Docker 里通常用 cap_add: NET_RAWprivileged 解決。(GitHub)


4) prometheus.yml(抓取 blackbox 探測結果)

Prometheus 抓取 Blackbox Exporter 通常用 multi-target exporter pattern:Prometheus 實際請求的是 blackbox 的 /probe,目標地址通過 target 參數傳遞,並通過 relabel 把目標寫到 instance 標籤。(Prometheus)

prometheus/prometheus.yml

global:
  scrape_interval: 15s
  scrape_timeout: 10s
  evaluation_interval: 15s

rule_files:
  - /etc/prometheus/rules/*.yml

scrape_configs:
  # 1) 抓 blackbox-exporter 自身 /metrics(白盒)
  - job_name: blackbox_exporter
    static_configs:
      - targets: ["blackbox-exporter:9115"]

  # 2) HTTP 延时(从监控机到目标 HTTP 服务的响应耗时)
  - job_name: blackbox_http
    metrics_path: /probe
    params:
      module: [http_2xx]
    static_configs:
      - targets:
          - https://example.com
          - https://api.example.com/health
        labels:
          group: web
    relabel_configs:
      - source_labels: [__address__]
        target_label: __param_target
      - source_labels: [__param_target]
        target_label: instance
      - target_label: __address__
        replacement: blackbox-exporter:9115

  # 3) TCP 端口连通 + 连接延时(适合 SSH/DB/Redis 等)
  - job_name: blackbox_tcp
    metrics_path: /probe
    params:
      module: [tcp_connect]
    static_configs:
      - targets:
          - 10.0.0.10:22
          - 10.0.0.11:5432
        labels:
          group: tcp
    relabel_configs:
      - source_labels: [__address__]
        target_label: __param_target
      - source_labels: [__param_target]
        target_label: instance
      - target_label: __address__
        replacement: blackbox-exporter:9115

  # 4) ICMP ping 延时(需要 NET_RAW 权限)
  - job_name: blackbox_icmp
    metrics_path: /probe
    params:
      module: [icmp]
    static_configs:
      - targets:
          - 10.0.0.10
          - 10.0.0.11
        labels:
          group: icmp
    relabel_configs:
      - source_labels: [__address__]
        target_label: __param_target
      - source_labels: [__param_target]
        target_label: instance
      - target_label: __address__
        replacement: blackbox-exporter:9115

想把「不同模塊、不同 targets」合併到一個 job 里也可以(用 labels: module: xxx + __param_module 注入),Prometheus 官方指南里有示例。(Prometheus)


5) Grafana:自動配置 Prometheus 數據源

Grafana 支持通過 provisioning 文件自動創建數據源。(Grafana Labs)

grafana/provisioning/datasources/datasource.yml

apiVersion: 1

datasources:
  - name: Prometheus
    type: prometheus
    access: proxy
    url: http://prometheus:9090
    isDefault: true
    editable: false

6) 啟動

monitoring/ 目錄執行:

docker compose up -d

打開:

  • Prometheus:http://<监控机IP>:9090
  • Grafana:http://<监控机IP>:3000(帳號密碼你在 compose 里設的 admin/admin)

7) 快速驗證(建議你先做這一步排錯)

7.1 直接訪問 blackbox /probe 看輸出

Blackbox Exporter 支持直接訪問 /probe?target=...&module=... 獲取指標輸出,probe_success 會告訴你探測是否成功。(GitHub)

例如(在監控機上):

  • http://localhost:9115/probe?target=prometheus.io&module=http_2xx
  • http://localhost:9115/probe?target=10.0.0.10&module=icmp

7.2 Prometheus Targets 頁面

Prometheus UI → Status → Targets

blackbox_http / blackbox_tcp / blackbox_icmp 是否 UP


8) 在 Grafana 里看「延時」看哪些指標

最常用的兩個:

  • 是否可達probe_success(1=成功,0=失敗)(Prometheus)
  • 探測總耗時probe_duration_seconds(你要的「延時/Latency」核心指標)(Prometheus)

PromQL 示例(Grafana 面板里直接用):

  • 某組目標最近 5 分鐘平均延時:
avg_over_time(probe_duration_seconds{job="blackbox_icmp"}[5m])
  • 最近 5 分鐘最大延時(看尖刺):
max_over_time(probe_duration_seconds{job="blackbox_http"}[5m])
  • 可用率(過去 10 分鐘內成功率):
avg_over_time(probe_success{job="blackbox_http"}[10m]) * 100

想拆解 HTTP 延時(DNS/連接/TLS/傳輸)

Blackbox Exporter 還會給出 probe_http_duration_seconds{phase="resolve|connect|tls|processing|transfer"} 這種分階段指標;這些 phase 含義在社區裡有明確解釋:resolve=DNS、connect=TCP 建連、tls=TLS 握手、processing=等待首字節、transfer=傳輸響應。(Google Groups)


9) 直接套用的 Grafana Dashboard

Grafana 官方儀錶盤庫里有現成的 Prometheus Blackbox Exporter dashboard(例如 ID:7587)。你在 Grafana → Dashboards → Import,輸入 7587,然後選擇 Prometheus 數據源即可。(Grafana Labs)


10) 可選:Prometheus 告警規則(延時過高 / 探測失敗)

prometheus/rules/blackbox-alerts.yml

groups:
- name: blackbox
  rules:
  - alert: BlackboxProbeFailed
    expr: probe_success == 0
    for: 2m
    labels:
      severity: critical
    annotations:
      summary: "探测失败: {{ $labels.instance }}"
      description: "job={{ $labels.job }} 连续 2 分钟探测失败"

  - alert: BlackboxHighLatency
    expr: probe_duration_seconds > 0.5
    for: 5m
    labels:
      severity: warning
    annotations:
      summary: "延时过高: {{ $labels.instance }}"
      description: "job={{ $labels.job }} 延时 > 0.5s 持续 5 分钟"

Alertmanager 的作用是對 Prometheus 產生的告警做去重/分組/路由到郵件、PagerDuty、Webhook 等。(Prometheus) 如果你想我給你一份「發到企業微信/釘釘/飛書/Telegram/Webhook」的 alertmanager.yml,我也可以直接給模板。


11) 常見坑(你大概率會遇到)

  1. ICMP 全部失敗 大概率是權限問題:Linux 下 ICMP 需要 CAP_NET_RAW / root / 或配置 ping_group_range;Docker 里通常加 cap_add: NET_RAW。(GitHub)
  2. HTTP 探測失敗但瀏覽器能打開 常見是:目標需要特定 Host/SNI、重定向、證書問題、內網 DNS 不通。可以先用 /probe?...&debug=true 看詳細原因(blackbox 支持 debug 參數)。(GitHub)
  3. Grafana 連不上 Prometheus 確認 datasource URL 用的是 Docker 網絡內的 http://prometheus:9090(而不是 localhost)。
  4. 不建議把 9115 暴露到公網 Blackbox 會幫你去探測任意目標;暴露公網相當於給別人一個「探測器」。生產建議去掉 ports: "9115:9115" 或加防火牆/反代鑒權。