1. 项目概述
在企业IT运维工作中,网站可用性监控是保障业务连续性的基础环节。传统的人工巡检方式效率低下,而市面上的SaaS监控服务又往往存在价格昂贵、数据隐私等问题。本文将分享一套基于开源工具Prometheus的网站监控方案,实现从探测到告警的全自动化流程,特别适合中小型技术团队使用。
这套方案的核心价值在于:
- 完全自主可控,所有组件均可部署在内网环境
- 支持同时监控数百个网站/API接口
- 告警信息直接推送到企业微信群,确保及时响应
- 提供从部署到维护的完整工具链
2. 架构设计解析
2.1 技术选型理由
选择Prometheus生态链主要基于以下考量:
Blackbox Exporter:专为黑盒监控设计的探针,支持HTTP/HTTPS/TCP等多种协议,内置丰富的指标采集能力。相比自写爬虫脚本,它具有以下优势:
- 内置重试机制和超时控制
- 自动记录SSL证书信息
- 提供响应时间直方图数据
Alertmanager:作为告警中枢,支持:
- 多级告警路由(区分严重/普通事件)
- 告警聚合与抑制
- 多种通知渠道集成
企业微信机器人:选择企业微信而非其他IM工具的原因是:
- 国内访问稳定可靠
- 支持Markdown格式消息
- 可@特定成员或全体人员
2.2 数据流向说明
整个监控流程的数据流转如下图所示:
[网站集群] │ ↓ (HTTP探测) [Blackbox Exporter] → 生成指标(probe_success, probe_duration等) │ ↓ (抓取) [Prometheus] → 评估告警规则 │ ↓ (推送告警) [Alertmanager] → 渲染消息模板 │ ↓ (Webhook) [企业微信机器人]3. 环境部署详解
3.1 目录结构规划
建议采用以下目录规范,便于后期维护:
website-monitoring/ ├── bin/ # 二进制文件 ├── config/ # 配置文件 │ ├── alert_rules.yml │ ├── alertmanager.yml │ ├── blackbox.yml │ └── prometheus.yml ├── data/ # 数据存储 ├── logs/ # 日志文件 ├── templates/ # 消息模板 └── scripts/ # 维护脚本3.2 组件安装指南
获取最新稳定版组件的推荐方法:
# 使用GitHub API获取最新版本号 get_latest_release() { curl -s "https://api.github.com/repos/$1/releases/latest" | grep '"tag_name":' | sed -E 's/.*"([^"]+)".*/\1/' } BLACKBOX_VER=$(get_latest_release "prometheus/blackbox_exporter") PROM_VER=$(get_latest_release "prometheus/prometheus") ALERT_VER=$(get_latest_release "prometheus/alertmanager") # 下载并解压到bin目录 wget -qO- https://github.com/prometheus/blackbox_exporter/releases/download/${BLACKBOX_VER}/blackbox_exporter-${BLACKBOX_VER:1}.linux-amd64.tar.gz | tar xz -C bin --strip-components=1 --wildcards '*/blackbox_exporter'注意:生产环境建议固定版本号而非使用latest,避免自动升级导致兼容性问题
4. 配置深度解析
4.1 Blackbox高级配置
在blackbox.yml中,我们可以针对不同网站类型设置差异化探测参数:
modules: ecommerce_healthcheck: prober: http timeout: 15s http: method: POST headers: Content-Type: application/json body: '{"action": "healthcheck"}' fail_if_body_not_matches_regexp: - '"status":"ok"' tls_config: insecure_skip_verify: false server_name: "shop.example.com" api_endpoint: prober: http http: valid_status_codes: [200, 401] # 允许未授权状态 fail_if_ssl: false # 允许HTTP协议关键参数说明:
fail_if_body_not_matches_regexp:验证响应内容server_name:指定TLS SNIfail_if_ssl:强制HTTPS检查
4.2 Prometheus告警规则优化
精细化告警规则示例:
- alert: APISLAViolation expr: | ( avg_over_time(probe_duration_seconds{job="website_availability"}[5m]) > 1.5 and rate(probe_failed_due_to_regex{job="website_availability"}[5m]) == 0 ) or ( probe_http_status_code{job="website_availability"} >= 500 and probe_success == 1 ) for: 5m labels: severity: warning annotations: impact: "API响应时间超过SLA阈值或出现5xx错误"这个规则实现了:
- 5分钟内平均响应时间>1.5秒且无正则匹配失败
- 或服务器返回5xx状态码但探测本身成功
5. 企业微信集成实战
5.1 机器人创建步骤
在企业微信PC端:
- 右键点击目标群 → 选择「添加群机器人」
- 设置机器人名称如「网站监控助手」
- 记录生成的Webhook URL
建议创建两个机器人:
- 常规告警:用于性能劣化等普通事件
- 关键告警:配置@all通知,仅用于完全不可用场景
5.2 消息模板进阶技巧
改进后的消息模板wechat.tmpl:
{{ define "wechat.message" }} {{ range .Alerts }} {{ if eq .Status "firing" }} 📌 [{{ .Labels.severity | upper }}] {{ .Annotations.summary }} 🕒 {{ .StartsAt.Format "15:04:05" }} 触发 {{ if eq .Labels.severity "critical" }}<@all>{{ end }} {{ if .Annotations.description }}🔍 {{ .Annotations.description }}{{ end }} {{ if .Annotations.runbook }}📖 应急手册: {{ .Annotations.runbook }}{{ end }} ━━━━━━━━━━━━ {{ else }} ✅ [恢复] {{ .Annotations.summary }} ⏱ 故障时长: {{ humanizeDuration .Duration }} 🕒 {{ .EndsAt.Format "15:04:05" }} 恢复 ━━━━━━━━━━━━ {{ end }} {{ end }} {{ end }}特色功能:
- 根据严重程度自动@相关人员
- 支持关联应急手册链接
- 精简显示格式,提高移动端可读性
6. 运维管理脚本集
6.1 网站批量管理工具
扩展add-website.sh支持CSV文件批量导入:
#!/bin/bash # 单网站添加模式 if [ $# -eq 1 ]; then URL=$1 # ...原有逻辑... elif [ -f "$1" ]; then # CSV批量导入模式 CSV_FILE=$1 TOTAL=0 SUCCESS=0 while IFS=, read -r url module; do if grep -q "$url" "$CONFIG"; then echo "跳过已存在: $url" continue fi # 在对应job下添加target sed -i "/job_name: '$module'/,/- targets:/s/- targets:.*/&\n - $url/" $CONFIG ((SUCCESS++)) ((TOTAL++)) done < <(tail -n +2 "$CSV_FILE") # 跳过CSV头行 echo "批量导入完成: $SUCCESS/$TOTAL" curl -X POST http://localhost:9090/-/reload fiCSV格式示例:
url,module https://api1.example.com,website_availability https://shop.example.com,ecommerce_healthcheck7. 性能调优指南
7.1 大规模部署建议
当监控目标超过100个时,建议:
分片部署Blackbox:
# prometheus.yml - job_name: 'blackbox_asia' static_configs: - targets: ['blackbox-asia:9115'] - job_name: 'blackbox_eu' static_configs: - targets: ['blackbox-eu:9115']调整Prometheus参数:
# 启动参数 --storage.tsdb.retention.time=7d \ --query.max-concurrency=20 \ --web.max-connections=50优化抓取配置:
scrape_configs: - job_name: 'high_freq' scrape_interval: 15s scrape_timeout: 10s static_configs: [...] - job_name: 'low_freq' scrape_interval: 60s static_configs: [...]
8. 故障排查手册
8.1 常见问题诊断表
| 现象 | 检查步骤 | 解决方案 |
|---|---|---|
| 所有网站显示不可达 | 1. 检查Blackbox日志 2. 测试 curl localhost:9115/metrics3. 验证网络连通性 | 1. 重启Blackbox 2. 检查防火墙规则 3. 验证DNS配置 |
| 告警重复发送 | 1. 检查Alertmanager日志 2. 验证 group_interval设置3. 查看告警历史 | 1. 调整repeat_interval2. 配置抑制规则 |
| 企业微信消息格式错乱 | 1. 检查模板语法 2. 测试简单消息 3. 验证Markdown格式 | 1. 转义特殊字符 2. 简化模板内容 |
8.2 日志分析技巧
通过PromQL快速定位问题:
# 查找响应最慢的10个网站 topk(10, avg_over_time(probe_duration_seconds[1h]) ) # 统计各状态码出现次数 count by (probe_http_status_code) ( probe_http_status_code{job="website_availability"} ) # 检测证书过期情况 (probe_ssl_earliest_cert_expiry - time()) / 86400 < 309. 方案扩展方向
9.1 与Grafana集成
推荐仪表盘配置:
全局状态看板:
- 各区域可用率地图
- 响应时间热力图
- 最近告警事件流
单站详情页:
- 可用性趋势图
- 状态码分布饼图
- 证书有效期倒计时
9.2 多维度监控增强
前端性能指标:
modules: web_perf: prober: http http: preferred_ip_protocol: "ip4" fail_if_body_not_matches_regexp: - "window.performance.timing.loadEventEnd"API功能测试:
modules: payment_api: prober: http http: method: POST headers: Authorization: "Bearer ${API_KEY}" body: '{"amount": 1, "currency": "CNY"}' valid_status_codes: [200] fail_if_not_matches_regexp: - '"status":"success"'
这套监控方案经过多个生产环境验证,在日均百万级探测请求下仍能稳定运行。关键在于根据实际业务需求灵活调整配置,并建立完善的告警分级机制。对于需要更高可用性的场景,可以考虑部署Prometheus高可用集群和Alertmanager集群模式。