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