本文所指的web监控是指对某些访问地址或者说是接口进行监控。我们将通过一些实例,来介绍如何配置Prometheus 、black_exporter、grafana来监控站点的以下几个方面:
- 状态码
- 响应时间
- 证书过期时间
最终的效果图如下(图片建议在电脑端看):
Prometheus的web监控需要借助 blackbox_exporter
当然black_exporter 的功能远不止于监控web站点,它还能监控端口(TCP),DNS、UDP等,以下是官方给出的介绍
The blackbox exporter allows blackbox probing of endpoints over HTTP, HTTPS, DNS, TCP and ICMP.
我们这里只专注于web监控,其他监控不在本文介绍范围。
配置详情
配置大概分为以下几步:
- 安装black_exporter
- 配置监控目标地址
- 配置告警规则
- 配置grafana面板
安装配置black_expoter
我这里使用docker-compose进行部署(我的Prometheus、grafana、alertmanager等都定义在一个compose文件中,这里只列出black_exporter)
version: '3.7'
services:
blackbox_exporter:
container_name: blackbox_exporter
image: prom/blackbox-exporter:master
volumes:
- /data/monitor/blackbox_exporter/config/config.yml:/etc/blackbox_exporter/config.yml
ports:
- 9115:9115
配置文件/data/monitor/blackbox_exporter/config/config.yml 内容如下:
modules:
http_2xx: # 给模块取名,后面在Prometheus的配置文件中会用到该名称
prober: http # 探针类型,探针有多种类型如http、tcp、icmp、dns,不同的探针具有不同的功能
timeout: 5s # 探针检测超时时间
http:
valid_status_codes: [] # 有效的状态码,默认为200,也可以自己定义,比如你的站点304也可能是正常的
method: GET # http使用get请求
fail_if_body_not_matches_regexp: [] # 对返回结果进行正则匹配,如果未匹配成功则认为失败
tls_config:
insecure_skip_verify: true # 不安全的https跳过确认,如某些证书不合法或者过期,如果你在浏览器访问,那浏览器会让你确认是否继续,这里也是类似的意思。
配置Prometheus支持black_expoter
在prometheus.yml配置文件中加入以下内容:
- job_name: 'http_status' # 配置job名
metrics_path: /probe # 定义metric获取的路径
params:
module: [http_2xx] # 这里就是我们在black_exporter中定义的模块名
file_sd_configs: # 因需要监控的地址很多,我们这里将所有地址独立出来,后面会介绍该文件
- files:
- '/etc/prometheus/etc.d/job_web.yaml'
refresh_interval: 30s # 30秒刷新一次,当有新的监控地址时,会自动加载进来不需要重启
relabel_configs:
- source_labels: [__address__] # 当前target的访问地址,比如监控百度则为 https://baidu.com
target_label: __param_target # __param是默认参数前缀,target为参数,这里可以理解为把__address__ 的值赋给__param_target,若监控百度,则target=https://baidu.com
- source_labels: [__param_target]
target_label: instance # 可以理解为把__param_target的值赋给instance标签
- target_label: __address__
replacement: 172.33.0.33:9115 # web监控原本的target为站点的地址,但Prometheus不是直接去请求该地址,而是去请求black_exporter,故需要把目标地址替换为black_exporter的地址
job_web.yaml 样例
---
- targets:
- https://www.baidu.com/
labels:
env: pro
app: web
project: 百度
desc: 百度生产
- targets:
- https://blog.csdn.net/
labels:
env: test
app: web
project: CSDN
desc: 测试一下啦
not_200: yes # 这个自定义标签是为了标识某些地址在正常情况下不是返回200状态码
配置完成后,将在你的Prometheus看到类似以下的目标
我们找一个点击进去,可以看到最终跳转的地址类似如下:
http://172.33.0.33:9115/probe?module=http_2xx&target=https%3A%2F%2Fwww.baidu.com
配置告警规则
告警规则文件
groups:
- name: web
rules:
- alert: Web访问异常
expr: probe_http_status_code{not_200 != "yes" } != 200
for: 30s
annotations:
summary: Web 访问异常{{ $labels.instance }}
labels:
Severity: '严重'
- alert: Web访问响应响应时间>3s
expr: probe_duration_seconds >= 3
for: 30s
annotations:
summary: Web 响应异常{{ $labels.instance }}
labels:
Severity: '警告'
- alert: 证书过期时间<30天
expr: probe_ssl_earliest_cert_expiry-time()< 3600*24*30
annotations:
summary: Web 证书将在30天后过期 {{ $labels.instance }}
labels:
Severity: '提醒'
- alert: 证书过期时间<7天
expr: probe_ssl_earliest_cert_expiry-time()< 3600*24*7
annotations:
summary: Web 证书将在30天后过期 {{ $labels.instance }}
labels:
Severity: '严重'
- alert: 证书过期时间<1天
expr: probe_ssl_earliest_cert_expiry-time()< 3600*24*1
annotations:
summary: Web 证书将在30天后过期 {{ $labels.instance }}
labels:
Severity: '灾难'
配置grafana
grafana web监控我制作了2个面板,如上文中的截图。
- 站点可用性观测中心
- 站点可用性-单个站点
一个是所有站点的概览,另一个是单个站点的详情。
通过概览点击可以跳转到详情页。
grafana的配置较为繁琐,文中的面板已经开源,可以在grafana官网下载该面板 Web Monitor Center dashboard for Grafana | Grafana Labs
注意: 在笔者实际使用过程中,发现grafana的兼容性不是很好,从grafana下载下来的面板有很多不兼容,故此也可能出现兼容性问题,目前笔者grafana的版本为: v7.5.3
如果你觉得有收获,可以关注公众号。