本文目录导读:

- 为什么 Python 应用适合用 Prometheus?
- Python 应用如何暴露指标给 Prometheus?
- 配置 Prometheus 抓取目标
- 配置告警(Alertmanager)
- 有没有更简单的替代工具?(非 Prometheus)
是的,Prometheus 是目前 Python 应用监控和告警最主流、最推荐的开源方案之一,它特别适合云原生、微服务架构以及需要灵活告警规则的场景。
下面我会从为什么选择 Prometheus、Python 如何接入、以及告警配置三个维度来说明。
为什么 Python 应用适合用 Prometheus?
- 成熟的标准:Prometheus 是 CNCF(云原生计算基金会)的毕业项目,已成为云原生监控的事实标准。
- Pull 模型:Prometheus 主动从你的 Python 应用暴露的 HTTP 端点拉取指标,非常适合动态变化的微服务环境(配合服务发现)。
- 强大的多维数据模型:指标带有标签(labels),可以按业务维度(如 endpoint、method、status)灵活聚合和查询。
- 告警能力:内置的 Alertmanager 组件可以处理复杂的告警逻辑(如分组、抑制、静默)。
Python 应用如何暴露指标给 Prometheus?
最核心的库是 prometheus_client(官方 Python 客户端)。
安装
pip install prometheus-client
核心步骤(以 Flask 为例)
from flask import Flask
from prometheus_client import Counter, Histogram, generate_latest, REGISTRY
import time
app = Flask(__name__)
# 1. 定义指标
REQUEST_COUNT = Counter('http_requests_total', 'Total HTTP requests', ['method', 'endpoint', 'status'])
REQUEST_DURATION = Histogram('http_request_duration_seconds', 'HTTP request duration', ['method', 'endpoint'])
@app.route('/api/items', methods=['GET'])
def get_items():
start_time = time.time()
# 模拟业务逻辑
time.sleep(0.1)
# 2. 在业务代码中记录指标
REQUEST_COUNT.labels(method='GET', endpoint='/api/items', status='200').inc()
REQUEST_DURATION.labels(method='GET', endpoint='/api/items').observe(time.time() - start_time)
return {'items': ['a', 'b']}
# 3. 暴露 /metrics 端点给 Prometheus 抓取
@app.route('/metrics')
def metrics():
return generate_latest(REGISTRY)
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8000)
关键指标类型
- Counter:只增不减(如请求数、错误数)
- Gauge:可增可减(如当前线程数、内存使用)
- Histogram:分桶统计(如请求延迟分布)
- Summary:分位数统计(如延迟的 P99)
配置 Prometheus 抓取目标
在 Prometheus 的配置文件 prometheus.yml 中添加你的 Python 应用地址:
scrape_configs:
- job_name: 'python-app'
static_configs:
- targets: ['localhost:8000'] # 你的应用暴露的 /metrics 端口
配置告警(Alertmanager)
Prometheus 本身不发送告警,它通过 Alertmanager 实现。
步骤 1:定义告警规则(alert.rules.yml)
groups:
- name: python_alerts
rules:
- alert: HighErrorRate
expr: (sum(rate(http_requests_total{status=~"5.."}[5m])) / sum(rate(http_requests_total[5m]))) > 0.05
for: 2m
labels:
severity: critical
annotations:
summary: "HTTP错误率超过5%"
description: "过去5分钟错误率 {{ $value | humanizePercentage }}"
- alert: HighRequestLatency
expr: histogram_quantile(0.99, sum(rate(http_request_duration_seconds_bucket[5m])) by (le)) > 1.0
for: 1m
labels:
severity: warning
annotations:
summary: "P99 延迟超过1秒"
步骤 2:配置 Alertmanager 通知(如钉钉、邮件、企业微信)
在 alertmanager.yml 中配置接收端点。
有没有更简单的替代工具?(非 Prometheus)
如果项目很小或你希望更快的上手速度,也可以考虑:
| 方案 | 特点 | 适用场景 |
|---|---|---|
| Prometheus | 最强大,可扩展性强,告警灵活 | 微服务、Kubernetes、需要长期留存数据和复杂查询 |
| Grafana + Prometheus | 可视化与监控一体化 | 绝大数生产环境标准组合 |
| Sentry | 专注重试、错误追踪、性能检测 | 你需要的是错误日志和堆栈,而非系统指标 |
| Datadog / New Relic | SaaS 服务,开箱即用,无需运维 | 预算充足,不想自建基础设施 |
watchdog + systemd |
简单的进程守护和健康检查 | 仅需检测应用是否存活,不关心性能和业务指标 |
- 推荐使用 Prometheus:如果应用是微服务、需要灵活的可视化(Grafana)、需要多维度告警(按 error rate / latency / QPS)。
- 必备库:
prometheus-client(官方)。 - 典型技术栈:Python 应用 -> 暴露
/metrics-> Prometheus Server 抓取 -> Grafana 展示 -> Alertmanager 告警。
如果你的项目不大,但希望测试 Prometheus 流程,可以先用一个单机 Flask 应用配合 prometheus.yml 体验一下,这个方案非常成熟。