Prometheus 监控入门
什么是 Prometheus
Prometheus 是一个开源的系统监控和告警工具包,最初由 SoundCloud 开发,现为 CNCF 毕业项目。它以 Pull 方式采集时间序列数据,提供强大的查询语言 PromQL。
核心特性
- 多维数据模型:指标名称 + Key/Value 标签
- PromQL 查询语言:灵活的数据聚合和分析
- Pull 采集模式:主动拉取目标暴露的指标
- 服务发现:自动发现监控目标
- 告警管理:灵活的告警规则和通知
架构概览
+-------------+ +-------------+
| Node | | App |
| Exporter | | Metrics |
+------+------+ +------+------+
| |
+---------+---------+
|
Pull /metrics
|
+--------v--------+
| Prometheus |
| Server |
+--------+--------+
|
+-----------+-----------+
| |
+----v----+ +------v------+
| Alert | | Grafana |
| Manager | | (可视化) |
+---------+ +-------------+
安装与启动
Docker 方式
# docker-compose.yml
version: '3.8'
services:
prometheus:
image: prom/prometheus:latest
ports:
- "9090:9090"
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
- prometheus_data:/prometheus
volumes:
prometheus_data:
配置文件
# prometheus.yml
global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
- job_name: 'node'
static_configs:
- targets: ['node-exporter:9100']
- job_name: 'api'
metrics_path: '/metrics'
static_configs:
- targets: ['api:8080']
指标类型
| 类型 | 说明 | 示例 |
|---|---|---|
| Counter | 只增不减的计数器 | 请求总数、错误总数 |
| Gauge | 可增可减的测量值 | CPU 使用率、内存使用量 |
| Histogram | 直方图,观测值的分布 | 请求延迟分布 |
| Summary | 摘要,计算分位数 | 请求延迟的 P99 |
Histogram 和 Summary 的区别
- Histogram:在客户端分桶,服务端计算分位数,可聚合
- Summary:在客户端计算分位数,不可聚合
PromQL 入门
基础查询
# 直接查询指标
http_requests_total
# 带标签过滤
http_requests_total{status="500", method="GET"}
# 范围向量(过去 5 分钟)
http_requests_total[5m]
聚合操作
# 求和
sum(http_requests_total)
# 按标签分组
sum by (status) (http_requests_total)
# 计算速率
rate(http_requests_total[5m])
# 增长量
increase(http_requests_total[1h])
常用查询示例
# CPU 使用率
100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)
# 内存使用率
(1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100
# 磁盘使用率
(node_filesystem_size_bytes{mountpoint="/"} - node_filesystem_free_bytes{mountpoint="/"}) / node_filesystem_size_bytes{mountpoint="/"} * 100
# 请求错误率
sum(rate(http_requests_total{status=~"5.."}[5m])) / sum(rate(http_requests_total[5m])) * 100
# P99 延迟
histogram_quantile(0.99, sum(rate(http_request_duration_seconds_bucket[5m])) by (le))
告警配置
告警规则
# alerts.yml
groups:
- name: node_alerts
rules:
- alert: NodeDown
expr: up{job="node"} == 0
for: 5m
labels:
severity: critical
annotations:
summary: "Node {{ $labels.instance }} is down"
- alert: HighCPUUsage
expr: node_cpu_utilization > 0.9
for: 10m
labels:
severity: warning
annotations:
summary: "High CPU usage on {{ $labels.instance }}"
Alertmanager 配置
# alertmanager.yml
route:
receiver: team-email
group_by: [alertname]
group_wait: 30s
group_interval: 5m
repeat_interval: 4h
receivers:
- name: team-email
email_configs:
- to: team@example.com
服务发现
Kubernetes 服务发现
scrape_configs:
- job_name: 'kubernetes-pods'
kubernetes_sd_configs:
- role: pod
relabel_configs:
- source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]
action: keep
regex: true
- source_labels: [__address__, __meta_kubernetes_pod_annotation_prometheus_io_port]
action: replace
regex: (.+):(?:\d+);(\d+)
replacement: $1:$2
target_label: __address__
最佳实践
指标命名规范
- 使用下划线分隔单词:
http_requests_total - 使用基础单位:
seconds、bytes、requests - 使用后缀表示类型:
_total、_count、_sum、_bucket - 包含足够但不过多的标签
避免的高基数标签
- 不要使用
user_id、email、IP等取值无限的标签 - 高基数标签会导致性能问题
可视化建议
- 展示速率而非累计值(用
rate()) - 合理设置时间范围
- 使用 Grafana 面板模板
总结
Prometheus 是一个强大而简洁的监控系统,配合 Grafana 和 Alertmanager 可以构建完整的监控体系。从核心指标采集开始,逐步添加告警规则和可视化面板,最终实现全方位的系统可观测性。