如何使用 Blackbox Exporter 监控 URL?
前言
监控域名和 URL 是可观察性的一个重要方面,主要用于诊断可用性问题。接下来会详细介绍如何使用 Blackbox Exporter 和 Prometheus 在 Kubernetes 中实现 URL 监控。
Blackbox Exporter 简介
Blackbox Exporter 是 Prometheus 的一个可选组件,像其他 Exporter 一样, 主要用于将监控数据转换为 Prometheus 可理解的指标格式,即 Prometheus exposition format。
Endpoint 监控
Endpoint 监控是指监控内部和外部 Endpoint(HTTP/S、DNS、TCP、ICMP 和 grpc)的各种参数,包括 HTTP 响应时间、DNS 查询延迟、SSL 证书过期信息、TLS 版本等等。
在 Kubernetes 中,不仅仅是外部 Endpoint 需要被监控,内部 Endpoint 也需要被监控响应时间和其他参数。这些指标是基础设施的一个重要部分,以确保服务的连续性、可用性和符合一些安全认证。
白盒(WhiteBox)与黑盒(Blackbox)监控
白盒监控是指对系统内部的监控,包括应用 logging、handlers、tracing 和 metrics。与之相对,黑盒监控主要从外部发起探测,探测影响用户的行为,如服务器停机、页面不工作或网站性能下降。
Blackbox Exporter
Blackbox Exporter 用于探测 HTTPS、HTTP、TCP、DNS、ICMP 和 grpc 等 Endpoint。在你定义 Endpoint 后,Blackbox Exporter 会生成指标,可以使用 Grafana 等工具进行可视化。Blackbox Exporter 最重要的功能之一是测量 Endpoint 的可用性。
下图显示了 Blackbox Exporter 监控一个 Endpoint 的流程:

Blackbox Exporter 安装和配置
使用 Helm 安装 Blackbox Exporter
Blackbox Exporter 的安装很简单,可以通过 Helm Chart 安装:
# 添加 repo
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
# Install chart
helm install [RELEASE_NAME] prometheus-community/prometheus-blackbox-exporter
Blackbox 基本配置
下面是 Blackbox Exporter 配置中定义的一个默认模块:
blackbox.yaml:
modules:
http_2xx:
prober: http
timeout: 15s
http:
fail_if_not_ssl: true
ip_protocol_fallback: false
method: GET
follow_redirects: true
preferred_ip_protocol: ip4
valid_http_versions:
- HTTP/1.1
- HTTP/2.0
valid_status_codes:
- 200
- 204
你可以相应地配置你自己的blackbox.yml,使探针 (probe) 根据你的配置返回成功/失败。以上面配置为例,详细说明下 module 和 http probe 的配置:
prober: 探测的协议(可以是:http, tcp, dns, icmp, grpc)。timeout: 探测超时时间。http: http probe
接下来是 http probe 的配置:
valid_status_codes: <int>, ... | default = 2xx: 该 Probe 可接受的状态码。默认为 2xx。建议使用默认值。valid_http_versions: 该 Probe 接受的 http 版本。可选值:HTTP/1.1HTTP/2.0method: <string> | default = "GET": probe 使用的 http methodheaders:probe 使用的 header, 比如可以加一些user-agent之类的 header 避免被 WAF 拦截body_size_limit: <size> | default = 0将被处理的最大未压缩的主体长度(字节)。值为 0 意味着没有限制。compression: 用于解压响应的压缩算法(gzip、br、deflate、ident)。follow_redirects: <boolean> | default = true: 是否 follow 重定向fail_if_ssl: 如果存在 SSL,则探测失败fail_if_not_ssl: 如果不存在 SSL, 则探测失败fail_if_body_matches_regexp: 如果返回的 body 匹配该正则则失败fail_if_body_not_matches_regexp: 如果返回的 body 不匹配该正则则失败fail_if_header_matches: 如果返回的 header 匹配该正则,则失败。对于有多个值的 header,如果至少有一个符合,则失败。fail_if_header_not_matches: 如果返回的 header 不匹配该正则,则失败。tls_config: HTTP probe 的 TLS 协议配置,常用于私人证书。basic_auth: 目标的 HTTP basic auth 凭证。bearer_token: <secret>: 模板的 bearer token.proxy_url用于连接到目标的 proxy server 的配置skip_resolve_phase_with_proxy当设置了 HTTP 代理(proxy_url)时,跳过 DNS 解析和 URL 变更。oauth2用于连接到模板的 OAuth 2.0 配置enable_http2是否启用 http2preferred_ip_protocolHTTP probe 的 IP 协议 (ip4, ip6)ip_protocol_fallbackbodyprobe 中使用的 HTTP 请求的主体。
你可以查看这个 example.yml 中的详细例子,了解更多情况。另外还需要在 Prometheus 做一些配置上的改变,Blackbox Exporter 才会发送与应用的配置相关的指标。
Prometheus 中的配置
需要在 Prometheus 里配置 scrape 的配置,以及 Blackbox 相关的 Alert Rules.
Blackbox 的 Prometheus Scrape 配置
示例如下:
scrape_configs:
- job_name: blackbox-exporter
params:
module:
- http_2xx
scrape_interval: 1m
scrape_timeout: 10s
metrics_path: /probe
scheme: http
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: prometheus-blackbox-exporter.monitoring:9115
action: replace
static_configs:
- targets:
- https://ewhisper.cn
- https://www.ewhisper.cn
- https://rancher.ewhisper.cn
labels:
domain: ewhisper
environment: test
cluster: home-k3s
这样直接改 Prometheus 的配置是比较容易出错的,如果你已经安装了 Prometheus Operator, 则可以直接通过 probe CRD 来配置,非常方便:
apiVersion: monitoring.coreos.com/v1
kind: Probe
metadata:
name: ewhisper
namespace: monitoring
spec:
jobName: http-get
interval: 60s
module: http_2xx
prober:
url: prometheus-blackbox-exporter.monitoring:9115
scheme: http
path: /probe
targets:
staticConfig:
static:
- targets:
- https://ewhisper.cn
- https://www.ewhisper.cn
- https://rancher.ewhisper.cn
labels:
domain: ewhisper
environment: test
cluster: home-k3s
Blackbox Exporter 探测场景
单论 URL, 总结起来,Blackbox Exporter 有以下探测场景:
- 探测外部 URL
- 探测 K8S 集群内部 service
- 探测 K8S 集群内部 Ingress
- 探测 K8S 集群内部 Pod
场景一:探测外部 URL
配置 上面 已经提过,这里就不在赘述。
场景二:探测 K8S 集群内部 service
在 Kubernetes 系统中,资源和 Endpoint 会随着时间的推移而出现和消失,可以非常有用的探测是对资源的动态探测,包括 pods、service 和 ingress。
在 Prometheus 中使用 Kubernetes 服务发现配置,我们可以实现 Endpoint 的动态探测。Kubernetes 服务发现配置允许从 Kubernetes 的 API 中获取刮削目标,并始终与集群状态保持同步。你可以在文档的 kubernetes_sd_config 部分找到可以配置为发现目标的可用角色列表。
kubernetes_sd_configs:
- role: service
metrics_path: /probe
params:
module:
- http_2xx
relabel_configs:
- action: keep
regex: true
source_labels:
- __meta_kubernetes_service_annotation_prometheus_io_probe
- source_labels:
- __address__
target_label: __param_target
- replacement: prometheus-blackbox-exporter.monitoring:9115
target_label: __address__
- source_labels:
- __param_target
target_label: instance
- action: labelmap
regex: __meta_kubernetes_service_label_(.+)
- source_labels:
- __meta_kubernetes_namespace
target_label: kubernetes_namespace
- source_labels:
- __meta_kubernetes_service_name
target_label: kubernetes_name
这里我们可以使用[__meta_kubernetes_service_annotation_prometheus_io_probe]来只检查那些有prometheus.io/probe = true注释的服务,示例如下:
➜ kubectl describe svc nginx
...
Annotations: prometheus.io/probe: true
...
场景三:探测 K8S 集群内部 Ingress
- job_name: "blackbox-kubernetes-ingresses"
metrics_path: /probe
params:
module: [http_2xx]
kubernetes_sd_configs:
- role: ingress
relabel_configs:
# 示例重新标记,只探测有 "prometheus.io/probe = true"注释的一些接入点。
# - source_labels: [__meta_kubernetes_ingess_annotation_prometheus_io_probe]
# action: keep
# regex: true
- source_labels:
[
__meta_kubernetes_ingress_scheme,
__address__,
__meta_kubernetes_ingress_path,
]
regex: (.+);(.+);(.+)
replacement: ${1}://${2}${3}
target_label: __param_target
- target_label: __address__
replacement: prometheus-blackbox-exporter.monitoring:9115
- source_labels: [__param_target]
target_label: instance
- action: labelmap
regex: __meta_kubernetes_ingress_label_(.+)
- source_labels: [__meta_kubernetes_namespace]
target_label: kubernetes_namespace
- source_labels: [__meta_kubernetes_ingress_name]
target_label: ingress_name
场景四:探测 K8S 集群内部 Pod
- job_name: "blackbox-kubernetes-pods"
metrics_path: /probe
params:
module: [http_2xx]
kubernetes_sd_configs:
- role: pod
relabel_configs:
# 示例重新标记,只探测有
# "prometheus.io/probe = true"注释的 pod。
# - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_probe]
# action: keep
# regex: true
- source_labels: [__address__]
target_label: __param_target
- target_label: __address__
replacement: prometheus-blackbox-exporter.monitoring:9115
- source_labels: [__param_target]
replacement: ${1}/health
target_label: instance
- action: labelmap
regex: __meta_kubernetes_pod_label_(.+)
- source_labels: [__meta_kubernetes_namespace]
target_label: kubernetes_namespace
- source_labels: [__meta_kubernetes_pod_name]
target_label: kubernetes_pod_name
在 Prometheus 验证生成的指标

一旦更改被 apply,Blackbox Exporter 的资源被部署,我们可以在 Prometheus 中验证目标的状态。我们可以通过跳转到状态选项卡,然后在 Prometheus UI 中选择 targets,来检查 Blackbox Exporter 是否与注册的目标一起启动。
在这里你可以看到我们使用https://rancher.ewhisper.cn作为外部目标来参考,其状态是 404。我们还可以通过寻找以probe_开头的指标来检查指标是否被收集。

在这里你可以看到一些生成的probe_ 的指标列表。
| 指标名 | 功能 |
|---|---|
probe_duration_seconds |
返回探针完成的时间(秒)。 |
probe_http_status_code |
响应 HTTP 状态代码 |
probe_http_version |
返回探针响应的 HTTP 版本 |
probe_success |
显示探测是否成功 |
probe_dns_lookup_time_seconds |
返回探测 DNS 的时间,单位是秒。 |
probe_ip_protocol |
指定探针 IP 协议是 IP4 还是 IP6 |
probe_ssl_earliest_cert_expiry metric |
返回以 unixtime 为单位的最早的 SSL 证书到期时间 |
probe_tls_version_info |
包含所使用的 TLS 版本 |
probe_failed_due_to_regex |
表示探测是否因 regex 匹配而失败 |
probe_http_content_length |
HTTP 内容响应的长度 |
使用 Grafana 监控配置的 URL
可以直接复用 Grafana 上的一些 Dashboard, 查看 URL 的指标:


点这里Blackbox Grafana 搜索和下载对应的 Grafana Dashboard.
Blackbox 的优势梳理
- 开源免费的 Blackbox Endpoint 监控工具;
- 除了 HTTP/S, 还支持 DNS、TCP、ICMP 和** grpc**
- 丰富的 HTTP 黑盒监控配置,如 Header、认证、代理、正则匹配等。
- 利用 Prometheus + Kubernetes 的 kubernetes_sd_config 功能动态地产生指标,并可用于动态 Endpoint 监控。
- 可以监控证书过期时间。
Blackbox Exporter 的行业应用场景
为什么需要 Blackbox Exporter?
以我所熟悉的保险行业为例,大中型保险公司,都是采用类似:
- 总部
- 省级分公司
- 中心支公司
- 中公司
- 营业部
这样的组织形式。分支机构往往是通过专线和总部连接,并使用总部提供的各类保险业务系统。
虽然国内外有各种工具和服务可用于监控域名和 URL, 如 听云、Dynatrace 等。但是
- 一方面,服务是按探测次数收费的,如果探测频率、探测 URL 过多,价格不低的;
- 另一方面,这些商业化服务可能无法覆盖保险行业这种近乎内网的网络架构。
在这种情况下,Blackbox Exporter 是现有解决方案的一个开源替代品,由 Prometheus 社区维护。
而且,Prometheus + Blackbox Exporter + Kubernetes 动态发现,可以大大减少人工配置大量 URL 探测的工作。
另外,针对上面提到的情况, 也可以使用 Prometheus + Blackbox Exporter + 轻量级 K8s 解决方案如 K3s, 将 probe 节点部署到各个分支机构,实现和分支机构员工完全相同的访问路径。分支-总部各系统网络可用性一目了然,及时发现分支-总部各系统网络问题。
总结
通过本文,我们讨论了:
- 什么是 Blackbox Exporter
- 如何安装和配置它
- 几种典型的配置场景,特别是利用 Prometheus + Blackbox Exporter + Kubernetes 动态发现
- Blackbox Exporter 优势
- Blackbox Exporter 的行业应用场景
希望对各位读者有所帮助。
️ Reference
- How to Monitor Endpoints in Kubernetes using Blackbox Exporter (infracloud.io)
- prometheus/blackbox_exporter: Blackbox prober exporter (github.com)
- Probing Endpoints with Blackbox-Exporter. How ? Why ? | by Yasintahaerol | Trendyol Tech | Medium
如何使用 Blackbox Exporter 监控 URL?的更多相关文章
- Docker实现GPA+Exporter监控告警系统
Docker实现GPA+Exporter监控告警系统 1.搭建grafana,prometheus,blackbox_exporter环境 # docker run -d -p 9090:9090 - ...
- python实现监控URL的一个值小于规定的值--邮件报警
监控URL的一个值小于规定的值--邮件报警 #!/usr/bin/env python #-*- coding:utf-8 -*- __author__ = 'liudong' import urll ...
- zabbix自动发现监控url
1.在监控客户机上 web_site_code_status.sh: #!/bin/bash UrlFile="/opt/scripts/WEB.txt" IFS=$'\n' we ...
- shell脚本监控URL并自动发邮件
1.安装sendmail:yum install -y sendmail 2.安装mail:yum install -y mail 3.安装mutt:yum install -y mutt 4.启动s ...
- 用Blackbox Exporter to Monitor web和端口
1.按照exporter .wget https://github.com/prometheus/blackbox_exporter/releases/download/v0.12.0/blackbo ...
- 使用JMX Exporter监控Rainbond上的Java应用
场景 Prometheus 社区开发了 JMX Exporter 用于导出 JVM 的监控指标,以便使用 Prometheus 来采集监控数据.当您的 Java 应用部署在Rainbond上后 可通过 ...
- zabbix监控URL
选在相应主机,并添加Web监控 按照方式新建Web场景 注意: 名称统一规则:web_check_相应的域名 应用集:新建一个,名称为“web状态” 更新间隔:改为30s,默认为1m 尝试次数:改为2 ...
- zabbix通过Web场景监控URL
选择主机添加应用集 添加Web监控 选在相应主机,并添加Web监控 按照方式新建Web场景 注意: 名称统一规则:相应的域名 应用集:选择之前创建的 或者 新建一个,名称为“URL 告警” ...
- Node Exporter监控指标
访问http://localhost:9100/metrics,可以看到当前node exporter获取到的当前主机的所有监控数据,如下所示: 每一个监控指标之前都会有一段类似于如下形式的信息: # ...
- Prometheus 自定义exporter 监控key
当Prometheus的node_exporter中没有我们需要的一些监控项时,就可以如zabbix一样定制一些key,让其支持我们所需要的监控项. 例如,我要根据 逻辑cpu核数 来确定load的告 ...
随机推荐
- 微信电脑版DAT文件转图片工具
一键批量将微信聊天接受到的加密存储DAT图片文件转化为普通图片. 通过查看转化后的图片,您可以: (1)清理无用的历史图片,节省电脑硬盘存储空间. (2)恢复寻找重要照片资料. 下载地址:点此下载 微 ...
- Azure DevOps Pipelines部署.Net Core 应用到Kubernetes
一. 先决条件 1.Azure Repos Git/Git和项目上传 把本地的Net Core项目上传至Azure Repos Git/Git 2.Docker Registry Service ...
- DevOps|高效能敏捷交付组织:特性团队(FeatureTeam)+Scrum
这是<研发效能组织能力建设>的第三篇.特性团队和Scrum,这两个定义我们在之前的文章中都详细介绍了.这两个组织模式或者说管理实践,我都用过所以有些时候特别有感触.书本上纯粹的模式很容易理 ...
- 《Java并发编程的艺术》读书笔记:二、Java并发机制的底层实现原理
二.Java并发机制底层实现原理 这里是我的<Java并发编程的艺术>读书笔记的第二篇,对前文有兴趣的朋友可以去这里看第一篇:一.并发编程的目的与挑战 有兴趣讨论的朋友可以给我留言! 1. ...
- 学习ASP.NET Core Blazor编程系列八——数据校验
学习ASP.NET Core Blazor编程系列一--综述 学习ASP.NET Core Blazor编程系列二--第一个Blazor应用程序(上) 学习ASP.NET Core Blazor编程系 ...
- awk变量
awk变量 awk参数 参数 解释 -F 指定分割字段符 -v 定义或修改一个awk内部的变量 -f 从脚本文件中读取awk命令 对于awk而言,变量分为 内置变量 自定义变量 内置变量 解释 FS ...
- 小样本利器4. 正则化+数据增强 Mixup Family代码实现
前三章我们陆续介绍了半监督和对抗训练的方案来提高模型在样本外的泛化能力,这一章我们介绍一种嵌入模型的数据增强方案.之前没太重视这种方案,实在是方法过于朴实...不过在最近用的几个数据集上mixup的表 ...
- 云原生之旅 - 6)不能错过的一款 Kubernetes 应用编排管理神器 Kustomize
前言 相信经过前一篇文章的学习,大家已经对Helm有所了解,本篇文章介绍另一款工具 Kustomize,为什么Helm如此流行,还会出现 Kustomize?而且 Kustomize 自 kubect ...
- FlinkSql之TableAPI详解
一.FlinkSql的概念 核心概念 Flink 的 Table API 和 SQL 是流批统一的 API. 这意味着 Table API & SQL 在无论有限的批式输入还是无限的流式输入下 ...
- threejs三维地图大屏项目分享
这是最近公司的一个项目.客户的需求是基于总公司和子公司的数据,开发一个数据展示大屏. 大屏两边都是一些图表展示数据,中间部分是一个三维中国地图,点击中国地图的某个省份,可以下钻到省份地图的展示. 地图 ...