2026年云原生监控实战:Prometheus + Grafana 搭建企业级监控体系
从 0 到 1 构建完整的云原生监控方案,覆盖指标采集、可视化、告警全链路
前言
在云原生时代,微服务架构和容器化部署已经成为主流。但随之而来的是系统复杂度的大幅提升——服务数量爆炸、调用链路复杂、故障定位困难。没有一套完善的监控体系,就像在黑暗中开车,根本不知道哪里会出问题。
今天这篇文章,我将手把手带你搭建一套基于 Prometheus + Grafana 的企业级监控体系。这套方案是我经过多个生产项目验证的,从指标采集到可视化,从告警配置到故障排查,完整覆盖监控全链路。
一、为什么选择 Prometheus + Grafana?
在选型之前,我们先来看看市面上主流的监控方案对比:
| 方案 | 数据采集 | 存储 | 可视化 | 告警 | 云原生支持 | 学习成本 |
|---|---|---|---|---|---|---|
| —— | ———- | —— | ——– | —— | ———— | ———- |
| **Prometheus + Grafana** | Pull 模式,自动发现 | 内置 TSDB | Grafana 专业美观 | Alertmanager | ⭐⭐⭐⭐⭐ | 中等 |
| Zabbix | Push 模式 | MySQL/PostgreSQL | 内置,一般 | 内置 | ⭐⭐ | 较高 |
| Nagios | Push 模式 | 文件 | 插件扩展 | 内置 | ⭐ | 高 |
| ELK Stack | Beats/Logstash | Elasticsearch | Kibana | Watcher | ⭐⭐⭐ | 高 |
| 云厂商监控 | Agent | 托管 | 控制台 | 内置 | ⭐⭐⭐⭐ | 低 |
Prometheus 的核心优势:
1. 云原生原生支持:Kubernetes 官方推荐,与容器生态无缝集成
2. 多维数据模型:支持标签(Label)维度查询,灵活强大
3. PromQL 查询语言:专为时序数据设计,表达能力极强
4. 自动服务发现:K8s、Consul、EC2 等自动发现目标
5. 生态丰富:Exporter 众多,几乎所有中间件都有对应采集器
二、架构设计与核心组件
2.1 整体架构图
┌─────────────────────────────────────────────────────────────────┐
│ 监控目标层 │
├─────────────┬─────────────┬─────────────┬─────────────┬─────────┤
│ Node │ MySQL │ Redis │ Nginx │ App │
│ Exporter │ Exporter │ Exporter │ Exporter │ Metrics │
└──────┬──────┴──────┬──────┴──────┬──────┴──────┬──────┴────┬────┘
│ │ │ │ │
└─────────────┴─────────────┴─────────────┴───────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ Prometheus Server │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────────────┐ │
│ │ Retrieval │ │ TSDB │ │ PromQL Engine │ │
│ └──────────────┘ └──────────────┘ └──────────────────────┘ │
└──────────────────────────────┬──────────────────────────────────┘
│
┌────────────────┼────────────────┐
▼ ▼ ▼
┌─────────────────┐ ┌──────────┐ ┌──────────────────┐
│ Grafana │ │Alertmanager│ │ Long-term │
│ (可视化) │ │ (告警) │ │ Storage │
└─────────────────┘ └──────────┘ └──────────────────┘
2.2 核心组件说明
| 组件 | 功能 | 部署方式 |
|---|---|---|
| —— | —— | ———- |
| **Prometheus Server** | 数据采集、存储、查询 | Docker/K8s/二进制 |
| **Grafana** | 数据可视化、仪表盘 | Docker/K8s/二进制 |
| **Alertmanager** | 告警管理、路由、去重 | Docker/K8s/二进制 |
| **Node Exporter** | 主机指标采集(CPU/内存/磁盘/网络) | DaemonSet/二进制 |
| **cAdvisor** | 容器指标采集 | DaemonSet |
| **Kube-state-metrics** | K8s 资源对象状态采集 | Deployment |
| **Blackbox Exporter** | 黑盒监控(HTTP/TCP/ICMP) | Deployment |
三、实战部署:从零开始搭建
3.1 环境准备
我使用一台 4C8G 的云服务器作为演示环境,操作系统为 Ubuntu 22.04。你也可以在本地或 K8s 集群中部署。
# 创建工作目录
mkdir -p ~/monitoring/{prometheus,grafana,alertmanager}
cd ~/monitoring
3.2 Docker Compose 一键部署
创建 docker-compose.yml 文件:
version: '3.8'
services:
prometheus:
image: prom/prometheus:v2.51.0
container_name: prometheus
restart: unless-stopped
ports:
- "9090:9090"
volumes:
- ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
- ./prometheus/rules:/etc/prometheus/rules
- prometheus_data:/prometheus
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.path=/prometheus'
- '--storage.tsdb.retention.time=15d'
- '--web.console.libraries=/etc/prometheus/console_libraries'
- '--web.console.templates=/etc/prometheus/consoles'
- '--web.enable-lifecycle'
networks:
- monitoring
grafana:
image: grafana/grafana:10.4.1
container_name: grafana
restart: unless-stopped
ports:
- "3000:3000"
volumes:
- grafana_data:/var/lib/grafana
- ./grafana/provisioning:/etc/grafana/provisioning
environment:
- GF_SECURITY_ADMIN_USER=admin
- GF_SECURITY_ADMIN_PASSWORD=admin123
- GF_USERS_ALLOW_SIGN_UP=false
networks:
- monitoring
alertmanager:
image: prom/alertmanager:v0.27.0
container_name: alertmanager
restart: unless-stopped
ports:
- "9093:9093"
volumes:
- ./alertmanager/alertmanager.yml:/etc/alertmanager/alertmanager.yml
- alertmanager_data:/alertmanager
command:
- '--config.file=/etc/alertmanager/alertmanager.yml'
- '--storage.path=/alertmanager'
networks:
- monitoring
node-exporter:
image: prom/node-exporter:v1.7.0
container_name: node-exporter
restart: unless-stopped
ports:
- "9100:9100"
volumes:
- /proc:/host/proc:ro
- /sys:/host/sys:ro
- /:/rootfs:ro
command:
- '--path.procfs=/host/proc'
- '--path.rootfs=/rootfs'
- '--path.sysfs=/host/sys'
- '--collector.filesystem.mount-points-exclude=^/(sys|proc|dev|host|etc)($$|/)'
networks:
- monitoring
cadvisor:
image: gcr.io/cadvisor/cadvisor:v0.49.1
container_name: cadvisor
restart: unless-stopped
ports:
- "8080:8080"
volumes:
- /:/rootfs:ro
- /var/run:/var/run:ro
- /sys:/sys:ro
- /var/lib/docker/:/var/lib/docker:ro
- /dev/disk/:/dev/disk:ro
privileged: true
networks:
- monitoring
volumes:
prometheus_data:
grafana_data:
alertmanager_data:
networks:
monitoring:
driver: bridge
3.3 Prometheus 配置文件
创建 prometheus/prometheus.yml:
global:
scrape_interval: 15s
evaluation_interval: 15s
external_labels:
cluster: 'production'
replica: '{{.ExternalURL}}'
# 告警规则文件
rule_files:
- '/etc/prometheus/rules/*.yml'
# 告警配置
alerting:
alertmanagers:
- static_configs:
- targets: ['alertmanager:9093']
# 采集目标
scrape_configs:
# Prometheus 自身监控
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
labels:
instance: 'prometheus-server'
# Node Exporter - 主机监控
- job_name: 'node-exporter'
static_configs:
- targets: ['node-exporter:9100']
labels:
instance: 'monitoring-server'
# cAdvisor - 容器监控
- job_name: 'cadvisor'
static_configs:
- targets: ['cadvisor:8080']
labels:
instance: 'docker-host'
# 自定义应用监控示例
- job_name: 'my-app'
static_configs:
- targets: ['app:8080']
metrics_path: '/actuator/prometheus'
scrape_interval: 5s
3.4 告警规则配置
创建 prometheus/rules/node-alerts.yml:
groups:
- name: node_alerts
rules:
# CPU 使用率告警
- alert: HighCPUUsage
expr: 100 - (avg by(instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80
for: 5m
labels:
severity: warning
annotations:
summary: "High CPU usage detected"
description: "CPU usage is above 80% for more than 5 minutes on {{ $labels.instance }}"
# 内存使用率告警
- alert: HighMemoryUsage
expr: (node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) / node_memory_MemTotal_bytes * 100 > 85
for: 5m
labels:
severity: warning
annotations:
summary: "High memory usage detected"
description: "Memory usage is above 85% for more than 5 minutes on {{ $labels.instance }}"
# 磁盘使用率告警
- alert: HighDiskUsage
expr: (node_filesystem_size_bytes{mountpoint="/"} - node_filesystem_avail_bytes{mountpoint="/"}) / node_filesystem_size_bytes{mountpoint="/"} * 100 > 90
for: 5m
labels:
severity: critical
annotations:
summary: "High disk usage detected"
description: "Disk usage is above 90% for more than 5 minutes on {{ $labels.instance }}"
# 服务宕机告警
- alert: InstanceDown
expr: up == 0
for: 1m
labels:
severity: critical
annotations:
summary: "Instance {{ $labels.instance }} down"
description: "{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 1 minute"
3.5 Alertmanager 配置
创建 alertmanager/alertmanager.yml:
global:
smtp_smarthost: 'smtp.qq.com:587'
smtp_from: 'your-email@qq.com'
smtp_auth_username: 'your-email@qq.com'
smtp_auth_password: 'your-auth-code'
# 路由配置
templates:
- '/etc/alertmanager/template/*.tmpl'
route:
group_by: ['alertname', 'cluster', 'service']
group_wait: 30s
group_interval: 5m
repeat_interval: 12h
receiver: 'default'
routes:
# 严重级别告警单独处理
- match:
severity: critical
receiver: 'critical'
continue: true
# 警告级别告警
- match:
severity: warning
receiver: 'warning'
# 接收器配置
receivers:
- name: 'default'
email_configs:
- to: 'ops@example.com'
subject: '【Prometheus告警】{{ .GroupLabels.alertname }}'
body: |
{{ range .Alerts }}
告警名称: {{ .Annotations.summary }}
告警详情: {{ .Annotations.description }}
告警时间: {{ .StartsAt.Format "2006-01-02 15:04:05" }}
{{ end }}
- name: 'critical'
email_configs:
- to: 'sre@example.com'
webhook_configs:
- url: 'http://dingtalk-webhook:8060/dingtalk/send'
send_resolved: true
- name: 'warning'
email_configs:
- to: 'dev@example.com'
# 抑制规则(避免告警风暴)
inhibit_rules:
- source_match:
severity: 'critical'
target_match:
severity: 'warning'
equal: ['alertname', 'dev', 'instance']
3.6 启动服务
# 创建必要的目录
mkdir -p prometheus/rules alertmanager grafana/provisioning/{dashboards,datasources}
# 启动所有服务
docker-compose up -d
# 查看状态
docker-compose ps
# 查看日志
docker-compose logs -f prometheus
启动后访问:
四、Grafana 仪表盘配置
4.1 添加 Prometheus 数据源
1. 登录 Grafana → Configuration → Data Sources
2. 点击 “Add data source” → 选择 “Prometheus”
3. URL 填写: http://prometheus:9090
4. 点击 “Save & Test”
4.2 导入官方仪表盘
Grafana 官方提供了大量开箱即用的仪表盘,推荐导入以下几个:
| 仪表盘名称 | ID | 用途 |
|---|---|---|
| ———– | —– | —— |
| Node Exporter Full | 1860 | 主机监控 |
| Docker and System Monitoring | 893 | 容器监控 |
| Kubernetes cluster monitoring | 7249 | K8s 集群监控 |
| MySQL Overview | 7362 | MySQL 监控 |
| Redis Dashboard | 763 | Redis 监控 |
导入方式:Create → Import → 输入 Dashboard ID → Load
4.3 常用 PromQL 查询示例
# CPU 使用率
100 - (avg by(instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)
# 内存使用率
(node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) / node_memory_MemTotal_bytes * 100
# 磁盘使用率
(node_filesystem_size_bytes{mountpoint="/"} - node_filesystem_avail_bytes{mountpoint="/"}) / node_filesystem_size_bytes{mountpoint="/"} * 100
# 网络流量(入站)
irate(node_network_receive_bytes_total[5m])
# 容器 CPU 使用率
rate(container_cpu_usage_seconds_total{name=~".+"}[5m])
# HTTP 请求速率
rate(http_requests_total[5m])
# 95分位延迟
histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m]))
五、生产环境最佳实践
5.1 高可用架构
对于生产环境,建议采用以下架构:
┌─────────────────┐
│ Load Balancer │
└────────┬────────┘
│
┌─────────────────┼─────────────────┐
▼ ▼ ▼
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ Prometheus │ │ Prometheus │ │ Prometheus │
│ (Shard 1) │ │ (Shard 2) │ │ (Shard 3) │
└──────┬──────┘ └──────┬──────┘ └──────┬──────┘
│ │ │
└─────────────────┼─────────────────┘
▼
┌─────────────────┐
│ Thanos/Cortex │
│ (全局查询/存储) │
└────────┬────────┘
▼
┌─────────────────┐
│ Grafana │
└─────────────────┘
5.2 性能优化建议
| 优化项 | 建议 |
|---|---|
| ——– | —— |
| 采集间隔 | 普通指标 15s,关键指标 5s,低频指标 60s |
| 存储时长 | 本地 15 天,长期存储使用 Thanos/Cortex/对象存储 |
| 数据分片 | 按业务/环境分片,单个 Prometheus 不超过 100w 时间序列 |
| 标签设计 | 避免高基数标签(如 user_id、request_id) |
| 告警优化 | 设置合理的 for 持续时间,避免误报 |
5.3 告警分级策略
┌─────────────┬─────────────────────────────────────────────────┐ │ 级别 │ 处理策略 │ ├─────────────┼─────────────────────────────────────────────────┤ │ Critical │ 立即电话/短信通知,5分钟内响应,影响核心业务 │ │ Warning │ 企业微信/钉钉通知,30分钟内响应,需要关注 │ │ Info │ 仅记录,工作时间内处理,一般性提示 │ └─────────────┴─────────────────────────────────────────────────┘
六、常见问题与排查
6.1 Prometheus 启动失败
# 检查配置文件语法 docker exec prometheus promtool check config /etc/prometheus/prometheus.yml # 检查规则文件语法 docker exec prometheus promtool check rules /etc/prometheus/rules/*.yml
6.2 目标显示 DOWN
1. 检查网络连通性:curl http://target:port/metrics
2. 检查防火墙规则
3. 确认 exporter 正常运行
6.3 告警不触发
1. 在 Prometheus UI 的 “Alerts” 页面查看告警状态
2. 使用 Expression Browser 验证 PromQL 表达式
3. 检查 Alertmanager 配置和日志
七、总结
通过本文的实战部署,你已经搭建起了一套完整的云原生监控体系:
✅ Prometheus 负责指标采集和存储
✅ Grafana 提供专业的可视化能力
✅ Alertmanager 实现告警管理和通知
✅ 各类 Exporter 覆盖主流中间件监控
这套方案的优势在于:
建议从单机监控开始,逐步扩展到集群级别,最终构建起覆盖全栈的企业级监控体系。
关于作者
长期关注大模型应用落地与云服务器实战,专注技术在企业场景中的落地实践。
个人博客:yunduancloud.icu —— 持续更新云计算、AI大模型实战教程,欢迎访问交流。
