1. Prometheus 部署
Prometheus Server 通过服务发现(Service Discovery)或静态配置的方式获取监控目标(Target),并从目标节点上的 Exporter 抓取(Scrape)指标数据。
Prometheus 自带基于文件的时间序列数据库(TSDB),用于本地持久化存储监控数据,用户可以使用 PromQL 查询语言进行数据分析,也可配置告警规则并将告警信息发送至 Alertmanager 进行进一步通知处理。
对于生命周期较短、难以被定时抓取的任务,Prometheus 提供 Pushgateway,用于接收这些任务主动推送的指标,由 Server 定期拉取数据。
最终,Prometheus 会将采集的时间序列数据存储在本地磁盘中,并结合告警规则触发告警,通过 Alertmanager 推送到邮件、钉钉、企业微信等。
此外,Prometheus 自带简洁的 Web UI,可直接执行 PromQL 查询。若需更丰富的可视化体验,可借助 Grafana 接入 Prometheus 数据源,实现图形化监控展示。
1.1 Prometheus 下载
本文以 Windows 系统为例,采用官方提供的二进制文件方式安装。
下载后解压目录如下所示:
1.2 Prometheus 启动
在解压目录中双击运行 prometheus.exe
,默认监听端口为 9090
。
打开浏览器访问:http://localhost:9090
若页面正常显示 Prometheus 界面,说明启动成功。
2.1 下载与运行
Windows Exporter 下载地址:👉 https://github.com/prometheus-community/windows_exporter/releaseshttps://github.com/prometheus-community/windows_exporter/releases
下载 .exe
文件(如:windows_exporter-0.30.4-amd64.exe
),直接双击运行或者命令行启动
windows_exporter.exe --collectors.enabled "cpu,cs,logical_disk,net,os,service,system,textfile,process"
默认监听端口为 9182
,浏览器访问:
http://localhost:9182/metrics
若能正常访问即表示运行成功。
2.2 配置 Prometheus 拉取 Exporter 指标
打开 Prometheus 文件夹中的 prometheus.yml
文件,使用记事本或 VS Code 编辑。
在 scrape_configs
节点中添加如下配置(请替换为本机 IP):
scrape_configs:
- job_name: 'windows'
static_configs:
- targets: ['127.0.0.1:9182']
⚠️ 注意:YAML 文件对缩进要求严格,建议用 promtool
校验配置文件格式:
promtool check config prometheus.yml
修改完成后,重新运行 prometheus.exe
,即可采集来自 Windows Exporter 的指标数据。
3. 配置 Grafana
3.1 下载与运行 Grafana
下载并解压,进入 bin
目录,双击运行 grafana-server.exe
。
默认监听端口为 3000
,浏览器访问:
http://localhost:3000
首次登录默认用户名/密码为:admin/admin
,登录后需修改密码。
3.2 配置数据源
-
登录 Grafana 后点击左侧 “齿轮” 图标 →
Data Sources
-
点击 “Add data source”
-
选择
Prometheus
-
在
HTTP
区域的URL
填入:http://localhost:9090
-
点击
Save & Test
,若显示成功连接,即数据源配置完成
3.3 导入仪表盘
Grafana 提供大量开箱即用的仪表盘模板:
-
左侧菜单点击 “+” → “Import”
-
在 Dashboard ID 输入框搜索
windows
,或上传本地.json
文件模板 -
点击 “Load”,确认使用的 Prometheus 数据源
-
点击 “Import” 完成仪表盘导入
导入后,即可通过图形化界面查看主机 CPU、内存、磁盘、网络等关键指标。
4. 添加 Alertmanager 实现告警通知
Alertmanager 是 Prometheus 官方提供的告警管理组件,用于接收 Prometheus 触发的告警,并根据配置将其发送到邮箱、钉钉、企业微信、Slack 等通知渠道。它还支持告警分组、抑制、去重等功能。
4.1
下载并运行 Alertmanager下载地址:
👉 https://prometheus.io/download/#alertmanager
解压后目录如下:
双击 alertmanager.exe
运行,默认监听端口为 9093
。
浏览器访问:http://localhost:9093,若页面正常显示则启动成功。
4.2 配置 Alertmanager
使用文本编辑器打开 alertmanager.yml
,配置告警接收方式(如下为 Webhook 示例,可替换为邮件、企业微信等):
双击 alertmanager.exe
运行,默认监听端口为 9093
。
浏览器访问:http://localhost:9093,若页面正常显示则启动成功。
4.2 配置 Alertmanager
使用文本编辑器打开 alertmanager.yml
,配置告警接收方式(如下为 Webhook 示例,可替换为邮件、企业微信等):
route:
group_by: ['alertname'] # 将具有相同 alertname 的告警分为一组,合并发送
group_wait: 30s # 首次发现告警等待 30 秒,等待可能的同组告警一起发出
group_interval: 5m # 同组告警的重复告警最少间隔 5 分钟
repeat_interval: 1m # 已发送的告警如果仍然存在,1 分钟后可以再次发送
receiver: 'webhook_receiver' # 默认告警接收器(如没有匹配更具体的 route)
receivers:
- name: 'webhook_receiver' # 告警接收器名称(与 route 中引用的名称一致)
webhook_configs:
- url: 'http://127.0.0.1:5001/alertmanager_to_feishu' # Flask 应用提供的 Webhook 接口
send_resolved: true # 告警恢复时是否也发送通知,true 表示发送“恢复”通知
inhibit_rules:
- source_match:
severity: 'critical' # 高严重级别的告警
target_match:
severity: 'warning' # 抑制较低严重级别的告警
equal: ['alertname', 'dev', 'instance'] # 如果 alertname、dev、instance 三者都相同,
# 当存在 critical 告警时,会抑制对应的 warning 告警发送(防止重复)
配置完成后保存文件,重新运行 alertmanager.exe
。
4.3 配置 Prometheus 集成 Alertmanager
编辑 Prometheus 的 prometheus.yml
文件,在末尾添加 alerting
配置:
alerting:
alertmanagers:
- static_configs:
- targets: ['localhost:9093']
同时添加一个简单的告警规则文件(如:rules.yml
):
groups:
- name: python-script-alerts
rules:
- alert: PythonScriptMissing_auto_main
expr: absent(windows_process_info{cmdline=~".*auto_main.py.*"})
for: 1m
labels:
severity: warning
annotations:
summary: "auto_main.py 进程未运行"
description: "Python 脚本 auto_main.py 未检测到,可能已退出。"
- alert: PythonScriptMissing_rocket_helper
expr: absent(windows_process_info{cmdline=~".*rocket_helper.py.*"})
for: 1m
labels:
severity: warning
annotations:
summary: "rocket_helper.py 进程未运行"
description: "Python 脚本 rocket_helper.py 未检测到,可能已退出。"
- name: test
rules:
- alert: AlwaysFireTest
expr: vector(1)
for: 10s
labels:
severity: warning
annotations:
summary: "飞书测试告警"
description: "这是一条手动触发的告警,用于验证通知功能"
然后在 prometheus.yml
中引用该规则文件:
rule_files:
- "rules.yml"
保存配置后,重启 prometheus.exe
应用。
但实际使用时,飞书 webhook 不是直接兼容 Alertmanager webhook 格式的。
具体原因:
-
Alertmanager 发送的 webhook 是 Prometheus 自定义的 JSON 格式
-
飞书机器人的 webhook 接口要求的是特定格式 JSON,例如:
{ "msg_type": "text", "content": { "text": "你的消息内容" } }
-
Alertmanager 发送的格式跟这个不匹配,飞书机器人会拒绝或忽略消息,导致你“收不到飞书消息”
解决方案:
-
使用中转服务(推荐)
写一个小服务,将 Alertmanager 的 webhook 转成飞书需要的格式,再转发给飞书机器人。
-
或者使用已有的 Alertmanager 飞书通知插件
-
飞书官方机器人 webhook 不能直接用作 Alertmanager 的 webhook 接收地址
简单示例:配置 Alertmanager 发送给本地中转服务
receivers:
- name: 'feishu'
webhook_configs:
- url: 'http://localhost:5001/alertmanager_to_feishu'
send_resolved: true
然后自己写一个小程序把 Prometheus 发来的 JSON 转成飞书格式。
from flask import Flask, request, jsonify
import requests, time, hashlib, hmac, base64
app = Flask(__name__)
# 飞书签名信息(如果有加签需求)
FEISHU_SECRET = ""
FEISHU_WEBHOOK_URL = "https://open.feishu.cn/open-apis/bot/v2/hook/XXXXXXX"
def gen_sign(timestamp: int):
if not FEISHU_SECRET:
return ""
string_to_sign = f"{timestamp}\n{FEISHU_SECRET}"
h = hmac.new(FEISHU_SECRET.encode("utf-8"), string_to_sign.encode("utf-8"), digestmod=hashlib.sha256).digest()
return base64.b64encode(h).decode("utf-8")
def build_feishu_alert_card(alerts):
time_str = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())
elements = []
for alert in alerts:
labels = alert.get("labels", {})
annotations = alert.get("annotations", {})
status = alert.get("status", "").upper()
alertname = labels.get("alertname", "未知")
severity = labels.get("severity", "unknown")
summary = annotations.get("summary", "")
description = annotations.get("description", "")
start = alert.get("startsAt", "unknown")
content = f"""
**状态**:{status}
**告警名称**:{alertname}
**级别**:{severity}
**开始时间**:{start}
**摘要**:{summary}
**详情**:{description}
"""
elements.append({
"tag": "markdown",
"content": content.strip()
})
card = {
"timestamp": f"{int(time.time())}",
"sign": gen_sign(int(time.time())),
"msg_type": "interactive",
"card": {
"config": {
"wide_screen_mode": True
},
"header": {
"title": {
"tag": "plain_text",
"content": "🚨 Prometheus 告警通知"
},
"template": "red"
},
"elements": elements
}
}
return card
@app.route('/alertmanager_to_feishu', methods=['POST'])
def alertmanager_to_feishu():
data = request.json
if not data or "alerts" not in data:
return jsonify({"error": "invalid request"}), 400
feishu_payload = build_feishu_alert_card(data["alerts"])
headers = {"Content-Type": "application/json"}
resp = requests.post(FEISHU_WEBHOOK_URL, headers=headers, json=feishu_payload)
if resp.status_code != 200:
return jsonify({"error": "failed to send to feishu", "detail": resp.text}), 500
return jsonify({"status": "ok"}), 200
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5001)
4.4 告警效果验证
-
打开 http://localhost:9090/alerts 可查看当前告警状态;
-
打开 http://localhost:9093 可查看 Alertmanager 管理的告警;
-
若配置了 Webhook、邮件、钉钉、企业微信等渠道,触发后会自动收到通知消息。
5. Prometheus 与 Alertmanager 常用配置字段注释说明
🔧 prometheus.yml
文件注释
global:
scrape_interval: 15s # 全局抓取频率,默认 15 秒抓取一次
evaluation_interval: 15s # 告警规则评估频率,默认每 15 秒检查一次
alerting:
alertmanagers:
- static_configs:
- targets: ['localhost:9093'] # Alertmanager 地址,Prometheus 会将告警发送到这里
rule_files:
- "rules.yml" # 告警规则文件路径,可添加多个规则文件
scrape_configs:
- job_name: 'windows' # 抓取任务名称,可自定义标识
static_configs:
- targets: ['127.0.0.1:9182'] # 监控目标地址,即 exporter 地址
📢 rules.yml
告警规则文件注释
groups:
- name: windows_exporter_rules # 告警规则组名,可自定义
rules:
- alert: HighCPUUsage # 告警名称
expr: # PromQL 表达式,定义触发条件
100 - (avg by (instance) (irate(windows_cpu_time_total{mode="idle"}[1m])) * 100) > 80
for: 1m # 表达式持续成立时间,如超过 1 分钟才触发告警
labels:
severity: warning # 自定义标签,可用于告警分组或抑制
annotations:
summary: "CPU 使用率过高" # 简要描述
description: "主机 {{ $labels.instance }} 的 CPU 使用率持续高于 80%" # 告警详情,支持变量
🚨 alertmanager.yml
文件注释
global:
resolve_timeout: 5m # 告警恢复等待时间,表示在多久后发送恢复通知
route:
receiver: 'webhook_receiver' # 默认接收器名称
group_by: ['alertname'] # 分组依据(相同 alertname 会聚合在一起)
group_wait: 30s # 首次分组等待时间,等待更多告警合并
group_interval: 5m # 分组内新告警推送的最小时间间隔
repeat_interval: 1h # 重复告警推送的间隔时间(用于未恢复的告警)
receivers:
- name: 'webhook_receiver' # 接收器名称
webhook_configs:
- url: 'http://127.0.0.1:5001/alertmanager_to_feishu' # Webhook 地址,接收告警 JSON 数据
send_resolved: true # 是否发送“已恢复”的通知