用途
Prometheus 与 Grafana 组合用于采集指标并可视化系统性能。本技能适用于以下场景:搭建指标采集基础设施、创建监控仪表盘、编写 PromQL 查询进行分析、配置告警规则、监控 Kubernetes 集群。
前置条件
- 用于部署的 Docker 或 Kubernetes 环境
- 对被监控目标的网络访问权限
- 对指标概念的基本理解
Prometheus 部署
Docker 部署
通过 docker-compose.yml 定义 prometheus 与 grafana 两个服务。Prometheus 使用镜像 prom/prometheus:v2.48.0,映射端口 9090,挂载配置文件、规则目录与数据卷,启动命令指定配置文件路径、存储路径与 15 天保留时间。Grafana 使用镜像 grafana/grafana:10.2.0,映射端口 3000,挂载数据卷,并通过环境变量设置管理员密码。
配置
prometheus.yml 中设置全局抓取间隔与评估间隔均为 15s,配置 alertmanager 地址、规则文件路径,以及多个抓取任务:prometheus 自身、node-exporter 节点指标、以及通过 /metrics 路径抓取的应用。
Kubernetes 部署
使用 Helm 添加 Prometheus 社区仓库并安装 kube-prometheus-stack,指定命名空间与 Grafana 管理员密码。通过 ServiceMonitor 自定义资源定义抓取目标,设置选择器、端口、间隔与路径。
PromQL 查询
基础查询示例包括:当前 CPU 使用率、每秒 HTTP 请求速率、平均响应时间、内存使用百分比。
聚合查询示例包括:按状态码汇总请求、按实例计算平均 CPU、请求数前 5 的端点、95 分位延迟。
时间相关查询示例包括:与 1 小时前对比、预测 4 小时后的磁盘空间、最近 5 分钟的变化、24 小时平均值。
告警规则
在 rules/alerts.yml 中定义告警组,示例规则包括:高错误率(5xx 请求占比超过 5% 持续 5 分钟)、服务宕机(up == 0 持续 1 分钟)、高内存使用(超过 90% 持续 5 分钟)、磁盘空间不足(根分区可用空间低于 10% 持续 5 分钟)。每条规则包含表达式、持续时间、标签与注解。
Alertmanager
alertmanager.yml 配置全局解析超时与 Slack API 地址,定义路由规则(按告警名与严重级别分组,设置分组等待、间隔与重复间隔),以及接收器:Slack 通知与 PagerDuty。
Grafana 仪表盘
仪表盘以 JSON 结构定义,包含标题与面板数组。每个面板包含标题、类型、目标查询表达式、图例格式与网格位置。示例面板包括请求速率图与延迟 P95 仪表。
通过 provisioning 配置仪表盘提供者与数据源,数据源指向 Prometheus 服务地址并设为默认。
记录规则
在 rules/recording.yml 中定义聚合记录规则,例如按 job 汇总的请求速率、按实例的平均 CPU 速率、按 job 的 P95 延迟。
应用埋点
Go 应用使用 prometheus/client_golang 库创建 CounterVec 并注册,通过 promhttp.Handler() 暴露 /metrics 端点。
Node.js 应用使用 prom-client 库创建 Counter,通过中间件在响应完成时递增计数,并暴露 /metrics 端点。
常见问题
- 目标未被发现:检查网络连通性,验证目标标签
- 内存占用过高:减少保留时间,使用记录规则,限制基数
- 查询缓慢:使用记录规则,限制时间范围,优化查询
- 数据点缺失:检查抓取间隔,验证目标可用性
最佳实践
- 对常用查询使用记录规则
- 限制标签基数以防止内存问题
- 根据存储容量设置适当的保留时间
- 使用直方图指标测量延迟
- 实现合理的告警阈值
- 将仪表盘作为代码进行版本控制
- 大规模部署使用联邦
- 定期审查并清理未使用的指标
相关技能
alerting-oncall(告警管理)、loki-logging(日志聚合)、kubernetes-ops(K8s 监控)。