2026年云原生监控实战:Prometheus + Grafana 搭建企业级监控体系


阿里云推广

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

启动后访问:

  • Prometheus: http://your-server-ip:9090
  • Grafana: http://your-server-ip:3000 (admin/admin123)
  • Alertmanager: http://your-server-ip:9093
  • 四、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 覆盖主流中间件监控

    这套方案的优势在于:

  • **开源免费**:无商业授权费用
  • **云原生原生**:与 K8s 生态无缝集成
  • **扩展性强**:丰富的 Exporter 生态
  • **社区活跃**:持续更新,文档完善
  • 建议从单机监控开始,逐步扩展到集群级别,最终构建起覆盖全栈的企业级监控体系。


    关于作者

    长期关注大模型应用落地与云服务器实战,专注技术在企业场景中的落地实践。

    个人博客:yunduancloud.icu —— 持续更新云计算、AI大模型实战教程,欢迎访问交流。

    发表评论