怎么用黑盒探测监控 HTTP/TCP/ICMP 可用性?
更新时间:2026-09-19。短答页。最常用的是 Prometheus 生态的 blackbox-exporter:它从外部对目标发起协议级探测并把结果暴露成指标,弥补应用内部指标(白盒)看不到「入口是否可达」的盲区。
一句话回答
部署 blackbox-exporter,在 Prometheus 里用 metrics_path: /probe + module 指定探测协议(http_2xx/tcp_connect/icmp/dns),通过 relabel 把目标地址传成 __param_target,再对结果指标 probe_success 配告警即可。
四种常用模块
| module | 探测内容 | 适用 |
|---|---|---|
http_2xx / http_2xx_post | HTTP(S) 状态码、重定向、TLS 握手、可选响应体匹配 | 网站/API/健康检查 |
tcp_connect | 能否完成 TCP 三次握手 | 数据库端口、任意 TCP 服务 |
icmp | ping 可达性与 RTT | 主机/网络设备存活 |
dns | DNS 查询是否成功、解析是否符合预期 | 域名解析可用性 |
关键配置
yaml
scrape_configs:
- job_name: blackbox-http
metrics_path: /probe
params: { module: [http_2xx] }
static_configs:
- targets: ['https://example.com/health', 'https://api.example.com/ready']
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: blackbox-exporter:9115 # 探测器地址(Prometheus 实际访问它)换协议只改 module:TCP 用 tcp_connect 配 host:port 目标;ICMP 需要给 blackbox-exporter 相应权限(容器加 --privileged 或合适的 cap)。
看哪些指标 / 怎么告警
promql
probe_success == 0 # 探测失败(0=失败,1=成功)
probe_http_status_code # 返回状态码
probe_duration_seconds # 端到端时延(含 DNS/TCP/TLS/TTFB)
probe_ssl_earliest_cert_expiry - time() # SSL 证书剩余秒数(< 7*86400 告警)
probe_dns_lookup_time_seconds # DNS 解析耗时告警建议用「连续多次失败」而不是一次失败,避免网络抖动误报;可用 min_over_time(probe_success[5m]) == 0 表示 5 分钟内持续失败。
两个关键纪律
- 探测器放在系统外部:从独立网络/不同可用区甚至公网探测,否则探不到入口、防火墙、跨网问题;只在本机探自己没有黑盒意义。
- 探关键事务而非只探 200:根路径 200 不代表下单可用,可对只读的就绪/合成接口探测,覆盖端到端链路。
坑
- 探测器和目标在同一主机/同一网络,入口故障全盲。
- 只探
/返回 200,依赖(DB/缓存)已挂却仍显示健康。 - 不配 TLS 证书过期指标,证书到期导致全站不可用才发现。
- 单次失败即告警,跨网抖动造成误报风暴。
总结
用 blackbox-exporter 做黑盒监控时,Prometheus 通过 /probe 端点和 module 参数发起 http_2xx、tcp_connect、icmp 或 dns 探测,并用 relabel 把目标地址传给探测器;核心结果是 probe_success、probe_duration_seconds 和 SSL 证书到期时间,告警按持续失败去抖、并单独监控证书有效期;最重要的是探测器必须部署在被监控系统外部、探测覆盖真实关键事务,才能发现白盒内部指标看不到的入口、网络和证书类可用性问题。