Prometheus 是一个开源的系统监控和告警工具包,最初由 SoundCloud 开发。它现在是继 Kubernetes 之后的第二个加入 CNCF(Cloud Native Computing Foundation)的项目。本教程将帮助你深入了解 Prometheus 的核心概念和使用方法。
Prometheus 核心概念
数据模型
Prometheus 采用时间序列数据库(TSDB)存储数据,每个时间序列由以下部分组成:
- 指标名称:描述监控指标的名称
- 标签(Labels):键值对形式的元数据
- 时间戳:数据采集的时间点
- 值:实际的度量值
示例:
http_requests_total{method="POST", endpoint="/api/users"} 23 1608825600
数据类型
Prometheus 支持四种核心的数据类型:
- Counter(计数器):只增不减的计数器
- Gauge(仪表盘):可增可减的数值
- Histogram(直方图):对数据进行分组统计
- Summary(摘要):类似 Histogram,提供分位数统计
安装和配置
使用 Docker 安装
- 创建 Prometheus 配置文件
prometheus.yml
:
global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
- 运行 Prometheus 容器:
docker run -d \
--name prometheus \
-p 9090:9090 \
-v $(pwd)/prometheus.yml:/etc/prometheus/prometheus.yml \
prom/prometheus
基础配置说明
prometheus.yml 的主要配置项:
global:
scrape_interval: 15s # 抓取间隔
evaluation_interval: 15s # 规则评估间隔
# 告警管理器配置
alerting:
alertmanagers:
- static_configs:
- targets: ['localhost:9093']
# 规则文件
rule_files:
- "rules/*.yml"
# 抓取配置
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
PromQL 查询语言
基础查询
- 即时查询:
http_requests_total
- 范围查询:
http_requests_total[5m]
- 聚合操作:
sum(http_requests_total) by (endpoint)
常用操作符
- 算术运算符:
node_memory_free_bytes / (1024 * 1024) # 转换为 MB
- 比较运算符:
http_requests_total > 100
- 聚合运算符:
avg_over_time(node_cpu_seconds_total[5m])
监控目标配置
静态配置
scrape_configs:
- job_name: 'node-exporter'
static_configs:
- targets: ['localhost:9100']
labels:
environment: 'production'
服务发现
scrape_configs:
- job_name: 'kubernetes-pods'
kubernetes_sd_configs:
- role: pod
告警配置
告警规则
创建告警规则文件 alert.rules.yml
:
groups:
- name: example
rules:
- alert: HighRequestLatency
expr: http_request_duration_seconds > 1
for: 10m
labels:
severity: warning
annotations:
summary: "High request latency on {{ $labels.instance }}"
description: "Request latency is above 1s (current value: {{ $value }}s)"
配置 Alertmanager
创建 Alertmanager 配置文件 alertmanager.yml
:
global:
resolve_timeout: 5m
route:
group_by: ['alertname']
group_wait: 10s
group_interval: 10s
repeat_interval: 1h
receiver: 'web.hook'
receivers:
- name: 'web.hook'
webhook_configs:
- url: 'http://127.0.0.1:5001/'
与 Grafana 集成
添加数据源
- 登录 Grafana
- 配置 > Data Sources > Add data source
- 选择 Prometheus
- 配置 URL:
http://localhost:9090
- 点击 "Save & Test"
创建仪表板
- 创建新的仪表板
- 添加面板
- 使用 PromQL 查询,例如:
rate(http_requests_total[5m])
最佳实践
命名规范
- 使用有意义的指标名称
- 遵循命名约定:
<namespace>_<name>_<unit>_<type>
- 标签名使用小写字母和下划线
示例:
http_request_duration_seconds_bucket
性能优化
-
合理的抓取间隔:
- 通常设置为 15-60 秒
- 根据实际需求和资源调整
-
查询优化:
- 避免使用过多的聚合操作
- 合理使用时间范围
- 优化标签选择器
-
存储优化:
- 合理设置数据保留时间
- 使用适当的压缩设置
常见问题排查
1. 抓取失败
检查以下几点:
- 目标服务是否正常运行
- 网络连接是否正常
- 防火墙配置是否正确
2. 查询超时
可能的解决方案:
- 优化查询语句
- 增加查询超时时间
- 减少时间范围
3. 高内存使用
处理方法:
- 减少时间序列数量
- 优化标签使用
- 调整抓取间隔
总结
Prometheus 是一个强大的监控系统,它提供了:
- 灵活的数据模型
- 强大的查询语言
- 可靠的告警机制
- 丰富的集成选项
通过本教程,你应该已经掌握了:
- Prometheus 的基本概念和架构
- 安装和配置方法
- PromQL 查询语言的使用
- 告警配置
- 与 Grafana 的集成
- 最佳实践和问题排查方法
建议从小规模部署开始,逐步扩展监控范围,不断优化配置和查询,以建立一个高效可靠的监控系统。