使用 Prometheus + Grafana 搭建服务监控体系
2026年4月 · 约18分钟 · 标签:Prometheus · Grafana · 监控
服务上线之后,监控是保证稳定运行的关键一环。本文记录使用 Prometheus 采集指标、Grafana 可视化的完整搭建流程,以及日常运维中常用的告警规则配置。
一、整体架构
监控体系由以下几个组件组成:
- Prometheus Server:负责拉取和存储时序指标数据。
- Exporter:部署在被监控的服务或机器上,采集系统或应用的指标并通过 HTTP 暴露出来。常用的有 node_exporter(系统监控)、mysqld_exporter、redis_exporter 等。
- Grafana:读取 Prometheus 中的数据,展示为图表和 Dashboard。
- Alertmanager:处理 Prometheus 触发的告警,支持发送到钉钉、企业微信、邮件等渠道。
二、Prometheus 部署
使用 Docker 部署 Prometheus 是最快捷的方式。创建 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: 'spring-app'
metrics_path: '/actuator/prometheus'
static_configs:
- targets: ['app:8080']
Spring Boot 应用需要引入 micrometer-registry-prometheus 依赖才能暴露 Prometheus 格式的指标。
三、Grafana 配置与 Dashboard
同样使用 Docker 方式部署 Grafana,配置 Prometheus 作为数据源后,导入社区提供的 Dashboard 模板即可快速获得可视化面板。推荐几个常用的 Dashboard:
- Node Exporter Full(ID: 1860):系统级别的 CPU、内存、磁盘、网络监控。
- JVM (Micrometer)(ID: 4701):Java 应用的 JVM 堆内存、GC、线程等指标。
- Spring Boot Statistics(ID: 6756):Spring Boot 应用请求量、响应时间、错误率等。
导入模板后,可以根据实际需求调整面板的展示方式和指标筛选条件。建议将常用的关键指标放在一个总览 Dashboard 上:首页展示 CPU 使用率、内存占用、磁盘 IO、网络流量、请求 QPS 和 P99 响应时间。
四、告警规则配置
在 Prometheus 中配置告警规则,当某些指标异常时触发告警:
groups:
- name: node_alerts
rules:
- alert: HighCpuUsage
expr: (100 - avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80
for: 5m
labels:
severity: warning
annotations:
summary: "CPU 使用率超过 80%"
- name: app_alerts
rules:
- alert: HighErrorRate
expr: rate(http_server_requests_seconds_count{status=~"5.."}[5m]) / rate(http_server_requests_seconds_count[5m]) > 0.05
for: 3m
labels:
severity: critical
annotations:
summary: "接口错误率超过 5%"
for 参数表示指标持续异常多久才触发告警,可以避免因瞬时波动导致的误报。
五、告警通知集成
Alertmanager 配置通知路由。以钉钉为例,需要创建一个钉钉机器人,获取 Webhook 地址:
route:
receiver: 'dingtalk'
group_wait: 30s
group_interval: 5m
repeat_interval: 4h
receivers:
- name: 'dingtalk'
webhook_configs:
- url: 'https://oapi.dingtalk.com/robot/send?access_token=xxx'
send_resolved: true
group_interval 控制同一组告警的发送间隔,repeat_interval 控制重复告警的发送频率,默认 4 小时重发一次,避免告警轰炸。send_resolved 设为 true 后,问题恢复时也会发送通知,方便确认。
六、监控指标的解读思路
有了监控数据,关键是如何解读:
- CPU 使用率:持续超过 80% 需要考虑扩容或优化代码。注意区分用户态和 I/O 等待。
- 内存使用:关注 RSS 和可用内存,Java 应用特别关注堆内存和非堆内存的使用趋势。
- 磁盘空间:建议设置 80% 和 90% 两个阈值告警,给运维留出处理时间。
- 网络流量:结合带宽上限分析,如果接近上限需要升级带宽或优化流量。
- 接口响应时间:重点关注 P99 和 P95,平均值容易被少数慢请求拉高但不反映真实体验。
七、总结
Prometheus + Grafana 是开源监控领域的事实标准组合,社区生态丰富。搭建本身并不复杂,难点在于确定哪些指标需要监控、设置合理的阈值以及形成有效的告警响应流程。建议先监控最核心的系统和业务指标,逐步完善监控覆盖面,避免一开始就追求大而全导致维护成本过高。