监控显示一切正常,可用户根本打不开网站——Blackbox Exporter帮我找到了真相(1)

前言

做过运维的人大概率都经历过一种特别崩溃的时刻。

Prometheus 面板一片绿色,CPU正常、内存正常、磁盘正常,服务进程也显示运行中。你刚准备安心喝口水,结果用户突然发来消息:

网站打不开了。

第一反应往往是不相信。

毕竟监控没有报警,服务也没挂,怎么可能打不开?

可等自己打开浏览器测试时才发现,用户说得没错。页面访问失败、接口返回异常、请求直接超时,而监控系统却像什么都没发生一样安静。

后来我才意识到一个问题:很多监控其实监控的是服务自己,而不是用户看到的服务。

Prometheus 擅长采集 CPU、内存、连接数和各种业务指标,但如果是 DNS 解析异常、网络链路故障、负载均衡配置错误,甚至服务虽然活着却已经无法对外提供访问,这些问题往往不会出现在传统指标里。

也正是在排查这些问题的过程中,我开始接触 Blackbox Exporter。相比监控服务内部状态,它更像一个真实用户,会主动去访问网站、请求接口、探测端口甚至执行 Ping 检查。当服务真的无法访问时,它会第一时间发现问题,而不是等用户来告诉你。

本文将带你快速上手 Blackbox Exporter,教你如何用 Prometheus 实现对网站、API、端口乃至整个链路的主动可用性监控,真正做到:服务是否在线,数据说了算,而不是用户投诉说了算。

1.ubuntu安装Blackbox_Exporter监控数据

通过以下命令创建一个用于存放Blackbox_Exporter的目录 /app:

shell 复制代码
mkdir /app

进入到/app目录下:

shell 复制代码
cd /app

从prometheus官网下载压缩文件:https://prometheus.io/download/

下载适用于Linux系统的文件。

下载完成后记住下载路径。

手动上传到/app下载好的Blackbox_Exporter文件。

上传成功后解压:

shell 复制代码
tar -zxvf blackbox_exporter-0.27.0.linux-arm64.tar.gz

改名方便记忆:

shell 复制代码
mv blackbox_exporter-0.27.0.linux-arm64 blackbox_exporter

将Altermanager配置为系统服务:

shell 复制代码
cd /usr/lib/systemd/system
shell 复制代码
vim blackbox_exporter.service
shell 复制代码
[Unit]
Description=https://prometheus.io

[Service]
Restart=on-failure
ExecStart=/app/alertmanager --config.file=/app/alertmanager.yml

[Install]                      
WantedBy=multi-user.target

加载system文件,启动alertmanager这个服务,并设置开机启动:

shell 复制代码
systemctl daemon-reload
systemctl start blackbox_exporter.service
systemctl enable blackbox_exporter.service

启动成功后,访问blackbox_exporter,ip+9115,默认端口为 9115。

2.配置prometheus监控Blackbox_Exporter指标

服务进程正常,用户却连不上?问题可能出在网络层。

通过 Prometheus + Blackbox Exporter 的 ping 探测,我们可以实时监控丢包率------一旦超过 50%,立即告警,提前发现链路异常,防患于未然。

跟我一起操作吧~

以防万一怕操作错误,先把原来的配置文件先备份,之后配置配置文件:

shell 复制代码
mv blackbox.yml blackbox.yml
vi blackbox.yml
shell 复制代码
modules:
  http_2xx:
    prober: http
  http_post_2xx:
    prober: http
    http:
      method: POST
  tcp_connect:
    prober: tcp
  pop3s_banner:
    prober: tcp
    tcp:
      query_response:
      - expect: "^+OK"
      tls: true
      tls_config:
        insecure_skip_verify: false
  ssh_banner:
    prober: tcp
    tcp:
      query_response:
      - expect: "^SSH-2.0-"
  irc_banner:
    prober: tcp
    tcp:
      query_response:
      - send: "NICK prober"
      - send: "USER prober prober prober :prober"
      - expect: "PING :([^ ]+)"
        send: "PONG ${1}"
      - expect: "^:[^ ]+ 001"
  icmp:
    prober: icmp
  icmp:
    prober: icmp
    timeout: 5s
    icmp:
      preferred_ip_protocol: "ip4"

重新启动black_exporter服务:

shell 复制代码
systemctl restart blackbox_exporter.service

修改prometheus配置文件:

shell 复制代码
vi prometheus.yml

添加告警配置(添加自己想监控的地址):

shell 复制代码
  - job_name: "http"
    metrics_path: /probe
    scrape_interval: 60s
    params:
      module: [http_2xx]
    static_configs:
      - targets:
        - http://192.168.50.134:9100/
    relabel_configs:
      - source_labels: [__address__]
        target_label: __param_target
      - source_labels: [__param_target]
        target_label: instance
      - target_label: __address
        replacement: 192.168.50.134:9115

  - job_name: 'ping_monitor'
    metrics_path: /probe
    params:
      module: [icmp]
    static_configs:
      - targets:
        - www.baidu.com
        - www.google.com
    relabel_configs:
      - source_labels: [__address__]
        target_label: __param_target
      - source_labels: [__param_target]
        target_label: instance
      - target_label: __address__
        replacement: 192.168.50.134:9115

重启prometheus服务后,可以查看到我们添加的指标;

配置告警规则:

shell 复制代码
groups:
  - name: icmp-loss-alerts
    rules:
      - alert: HighPingLossRate
        expr: |
          1 - avg_over_time(probe_success{job="ping_monitor"}[5m]) > 0.5
        for: 2m
        labels:
          severity: warning
        annotations:
          summary: "高 Ping 丢包率 (实例: {{ $labels.instance }})"
          description: "目标 {{ $labels.instance }} 在过去 5 分钟内的 Ping 丢包率超过 50%(当前丢包率: {{ $value | printf \"%.2f\" }})"

重启prometheus服务:

shell 复制代码
systemctl restart prometheus

重启后就可以看到我们配置好的告警啦!

想随时随地查看监控数据?只要给 Prometheus 配一个公网地址,在家也能轻松访问!

接下来,跟我一起用 cpolar 快速实现内网穿透,几条命令搞定远程监控~

3.安装cpolar实现随时随地开发

cpolar 可以将你本地电脑中的服务(如 SSH、Web、数据库)映射到公网。即使你在家里或外出时,也可以通过公网地址连接回本地运行的开发环境。

❤️以下是安装cpolar步骤:

使用一键脚本安装命令:

shell 复制代码
sudo curl https://get.cpolar.sh | sh

安装完成后,执行下方命令查看cpolar服务状态:(如图所示即为正常启动)

shell 复制代码
sudo systemctl status cpolar

Cpolar安装和成功启动服务后,在浏览器上输入虚拟机主机IP加9200端口即:【http://ip:9200】访问Cpolar管理界面,使用Cpolar官网注册的账号登录,登录后即可看到cpolar web 配置界面,接下来在web 界面配置即可:

4.配置公网地址

打开浏览器访问本地9200端口,使用cpolar账户密码登录即可,登录后即可对隧道进行管理。

登录cpolar web UI管理界面后,点击左侧仪表盘的隧道管理------创建隧道:

隧道名称:可自定义,本例使用了:prometheus,注意不要与已有的隧道名称重复

协议:http

本地地址:9090

域名类型:随机域名

地区:选择China Top

点击创建:

创建成功后,打开左侧在线隧道列表,可以看到刚刚通过创建隧道生成了公网地址,接下来就可以在其他电脑或者移动端设备(异地)上,使用地址访问。

访问成功。

5.保留固定公网地址

使用cpolar为其配置二级子域名,该地址为固定地址,不会随机变化。

点击左侧的预留,选择保留二级子域名,地区选择china top,然后设置一个二级子域名名称,我这里演示使用的是prometheus,大家可以自定义。填写备注信息,点击保留。

登录cpolar web UI管理界面,点击左侧仪表盘的隧道管理------隧道列表,找到所要配置的隧道prometheus,点击右侧的编辑

修改隧道信息,将保留成功的二级子域名配置到隧道中

域名类型:选择二级子域名

Sub Domain:填写保留成功的二级子域名

地区: China Top

点击更新

更新完成后,打开在线隧道列表,此时可以看到随机的公网地址已经发生变化,地址名称也变成了保留和固定的二级子域名名称。

最后,我们使用固定的公网地址在任意设备的浏览器中访问,可以看到成功访问本地部署的prometheus页面,这样一个永久不会变化的二级子域名公网网址即设置好了。

这样,我们就可以随时随地监控,不用担心,在家无法监控设备!

总结

体验下来,Blackbox Exporter 最大的价值并不是增加了几个监控指标,而是补上了传统监控最容易忽略的一块拼图。

以前很多监控系统关注的是:

复制代码
服务器是否正常
服务是否运行
资源是否充足

但用户真正关心的只有一件事:

复制代码
能不能访问

而 Blackbox Exporter 恰好站在用户视角思考问题。通过 HTTP、TCP、ICMP、DNS 等主动探测方式,它能够持续验证服务是否真正可达,而不是仅仅确认进程还活着。

尤其是在接入 Prometheus 和 Alertmanager 之后,整个监控体系会变得更加完整。内部指标负责发现性能问题,Blackbox 负责验证服务可用性,两者结合才能真正构建一套可靠的可观测体系。

再结合 cpolar 提供的公网访问能力后,即使人在家里、出差途中或者节假日休息时,也能够随时查看监控状态和告警信息,不再局限于公司网络环境。

这些年我越来越认同一句话:

服务是否正常,不是服务器说了算,也不是监控面板说了算。

真正有资格回答这个问题的,永远是用户。

而 Blackbox Exporter 做的事情,就是提前站在用户的位置替你验证答案。

相关推荐
Scott9999HH8 小时前
【IIoT流量实战】蒸汽管道阀门全关却仍有流量?用 Python 实现涡街信号 FFT 频谱分析与温压全补偿积算网关,深度拆解靠谱的涡街流量计厂家硬核技术标准
开发语言·python
码智社9 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
AI云海9 小时前
python 列表、元组、集合和字典
开发语言·python
萧瑟余晖10 小时前
JDK 26 新特性详解
java·开发语言
马优晨10 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
人邮异步社区12 小时前
怎么把C语言学到精通?
c语言·开发语言
心平气和量大福大13 小时前
C#-WPF-控件-TextBox 数据绑定
开发语言·c#·wpf
ttwuai13 小时前
Cursor 生成 CRUD 后,Go 后台接口别只测 200:JWT、RBAC 和 tenant_id 怎么验
开发语言·后端·golang
এ慕ོ冬℘゜13 小时前
前端基础:什么是时间戳?JS获取时间戳三种方法与实战用途
开发语言·前端·javascript
执明wa13 小时前
LayoutInflater详解: XML是如何变成View的?
android·xml·开发语言·android studio