【Prometheus+Grafana实战:搭建监控系统(含告警配置)】

Prometheus+Grafana搭建监控系统及告警配置
该文章已生成可运行项目,

什么是Prometheus和Grafana?

  • Prometheus:一款开源的监控告警工具,擅长时序数据存储和多维度查询(通过PromQL),采用Pull模型主动抓取目标指标。
  • Grafana:数据可视化平台,支持多种数据源(如Prometheus),通过丰富的仪表盘展示监控数据。
  • 核心协作流程
    • Exporters(如Node Exporter)采集指标 → Prometheus存储并计算 → Grafana可视化展示 → Alertmanager触发告警。

监控系统核心流程:

  1. 数据采集
    📥 Exporters(如 node_exportermysqld_exporter)从目标系统(主机、MySQL等)收集指标。
  2. 数据存储与计算
    🗃️ Prometheus 定期从 Exporters 拉取(Pull) 数据,存储为时序数据,并通过 PromQL 进行实时计算。
  3. 可视化展示
    📊 Grafana 从 Prometheus 读取数据,通过预定义仪表盘(如ID 1860)展示监控图表。
  4. 告警触发与通知
    🔔 Prometheus 根据告警规则(如CPU > 85%)触发告警 → Alertmanager 分组、路由告警 → 通过邮件/Slack通知用户。

与Zabbix的对比与优势

  • 数据模型:Prometheus的多维标签比Zabbix的扁平键值更灵活。
  • 扩展性:通过Exporters轻松集成新系统,无需定制脚本。
  • 云原生支持:天然适配Kubernetes,适合容器化环境。

建议从监控主机和现有Docker服务入手,逐步扩展至MySQL、Tomcat,最终实现全栈监控+告警闭环。

组件介绍

1、数据采集类(Exporters)

组件名称 核心功能 适用场景 官方文档
Node Exporter 采集主机基础指标(CPU、内存、磁盘、网络等) 监控物理机/虚拟机性能 GitHub
cAdvisor 采集容器资源使用指标(CPU、内存、网络、文件系统) 监控 Docker 容器 GitHub
MySQL Exporter 采集 MySQL 数据库性能指标(查询数、连接数等) 监控 MySQL 数据库状态 GitHub
JMX Exporter 将 Java 应用的 JMX 指标转换为 Prometheus 格式 监控 Tomcat、Kafka 等 Java 应用 GitHub
Blackbox Exporter 通过 HTTP/HTTPS、TCP、ICMP 探测服务可用性 监控网站可用性、端口存活状态 GitHub
SNMP Exporter 采集网络设备(交换机、路由器)的 SNMP 指标 监控网络设备性能 GitHub
  • cAdvisor google镜像gcr.io/cadvisor/cadvisor网络无法pull可使用bitnami/cadvisor:0.52.1

2、数据存储与处理类

组件名称 核心功能 适用场景
Prometheus Server 时序数据库,存储监控数据,支持 PromQL 查询 核心组件,必选
Thanos 提供 Prometheus 高可用、长期存储和全局查询 大规模监控集群数据聚合
VictoriaMetrics 高性能时序数据库,兼容 Prometheus 协议 替代 Prometheus TSDB,适合海量数据

3、可视化与告警类

组件名称 核心功能 适用场景
Grafana 可视化平台,支持多种数据源和仪表盘模板 数据展示,必选
Alertmanager 告警路由、去重、静默,支持邮件/Slack/Webhook 集中管理告警通知
Grafana Loki 日志聚合系统,与 Prometheus 指标联动 监控日志数据(需搭配 Promtail)

4、辅助工具类

组件名称 核心功能 适用场景
Pushgateway 接收短期任务(如批处理作业)的指标推送 监控 Cron 任务、一次性脚本
Prometheus Operator 在 Kubernetes 中自动化管理 Prometheus 配置 Kubernetes 环境监控部署
Grafana Tempo 分布式追踪系统,与 Prometheus 指标联动 链路追踪与性能分析

一、Server端配置

1. 配置文件目录结构

root@host4:/opt/monitor# tree
.
├── alertmanager.yml                 # Alertmanager配置
├── alert_rules.yml			    # 告警规则
├── docker-compose.yml		# Compose主文件
└── prometheus.yml			# Prometheus主配置
├── grafana-provisioning
│   ├── alerting			     #存储告警规则配置文件,用于预定义告警条件与通知策略
│   ├── dashboards			   #存放仪表板JSON配置文件,支持自动加载/更新仪表板(无需手动创建)
│   ├── datasources			    #配置数据源连接信息,支持多数据源并行配置(Prometheus/MySQL等)
│   │   └── prometheus.yml
│   ├── notifiers				#定义告警通知渠道(邮件/钉钉/Slack等),与alerting/目录规则联动实现告警推送
│   └── plugins				    #放置预安装插件(如可视化插件或数据源插件),容器启动时自动加载插件二进制文

2. 关键配置文件示例

docker-compose.yml - Compose主文件

services:
  # Prometheus核心服务
  prometheus:
    image: prom/prometheus:v3.4.0
    container_name: prometheus
    restart: unless-stopped
    networks:
      - monitor-net
    ports:
      - "9090:9090"
    volumes:
      - prometheus_data:/prometheus                # 时序数据库持久化存储
      - ./prometheus.yml:/etc/prometheus/prometheus.yml:ro  # 主配置文件注入
      - ./alert_rules.yml:/etc/prometheus/alert_rules.yml:ro # 告警规则注入
    command:
      - --config.file=/etc/prometheus/prometheus.yml
      - --storage.tsdb.retention.time=30d          # 数据保留30天
      - --web.enable-lifecycle                     # 启用配置热加载
    environment:
      - TZ=Asia/Shanghai                           # 时区设置
    deploy:
      resources:
        limits:
          cpus: '1.0'
          memory: 2G

  # Grafana可视化
  grafana:
    image: grafana/grafana:10.1.5
    container_name: grafana
    restart: unless-stopped
    networks:
      - monitor-net
    ports:
      - "3000:3000"
    volumes:
      - grafana_data:/var/lib/grafana              # 配置/仪表盘持久化
      - ./grafana-provisioning:/etc/grafana/provisioning # 预配置仪表盘
    environment:
      - GF_SECURITY_ADMIN_PASSWORD=L1L7WxZ443iyZd  #必须修改为复杂密码
#      - GF_SERVER_DOMAIN=monitor.yourcompany.com   # 生产域名,若没有域名可注释或删除此行
      - GF_SERVER_SERVE_FROM_SUB_PATH=true        # 强制使用IP访问(可选)
      - GF_SERVER_ENABLE_GZIP=true
      - GF_USERS_ALLOW_SIGN_UP=false               # 禁用公开注册
      - GF_AUTH_DISABLE_LOGIN_FORM=false            # SSO登录,需正确配置代理认证(需后端支持)
      - GF_AUTH_PROXY_ENABLED=false                 #代理认证
#      - GF_AUTH_PROXY_HEADER_NAME=X-WEBAUTH-USER   #代理认证
      - GF_PLUGINS_ALLOW_LOADING_UNSIGNED_PLUGINS=false
      - GF_DATABASE_TYPE=postgres
      - GF_DATABASE_HOST=postgres
      - GF_DATABASE_USER=grafana
      - GF_DATABASE_PASSWORD=L1L7WxZ443iyZd
      - GF_LIVE_ENABLED=false
      - GF_PLUGINS_DISABLE_AUTOLOAD=true  # 禁用插件自动加载
#      - GF_PATHS_PLUGINS=/var/lib/grafana/plugins  # 显式指定插件路径
#      - GF_DEFAULT_PLUGINS_PATH=/dev/null          # 禁用默认插件路径
    depends_on:
      postgres:
        condition: service_healthy  # 等待 PostgreSQL 健康检查通过
      prometheus:
        condition: service_started  # 确保 Prometheus 已启动
    deploy:
      resources:
        limits:
          cpus: '0.5'
          memory: 1G

  # Node Exporter示例 (按需部署到各主机)
  node-exporter:
    image: prom/node-exporter:v1.9.1
    container_name: node-exporter
    restart: unless-stopped
    networks:
      - monitor-net
    ports:
      - "9100:9100"
    volumes:
      - /proc:/host/proc:ro
      - /run/udev:/run/udev:ro #获取磁盘设备信息
      - /sys:/host/sys:ro
      - /:/rootfs:ro
    command:
      - --path.procfs=/host/proc
      - --path.sysfs=/host/sys
    deploy:
      resources:
        limits:
          cpus: '0.2'
          memory: 256M

  # 容器监控(可选)
  cadvisor:
    image: bitnami/cadvisor:0.52.1
#    image: google/cadvisor:v0.33.0
    user: "0:996"  # root 用户 + docker 组 GID
    container_name: cadvisor
    restart: unless-stopped
    networks:
      - monitor-net
    ports:
      - "8080:8080"
    volumes:
      - /:/rootfs:ro,rslave                       # 只读挂载防止篡改
      - /var/run:/var/run:ro,rslave
      - /sys:/sys:ro,rslave
      - /var/lib/docker:/var/lib/docker:ro,rslave #解决日志中 Failed to get system UUID 警告
      - /etc/machine-id:/etc/machine-id:ro  #挂载 /dev/disk:更精确的磁盘监控
      - /dev/disk:/dev/disk:ro
    privileged: true                               # 必须权限
#    command:
#      - --docker_only=true  #仅监控 Docker 容器(隐式禁用 CRI-O/Podman 检测)
#      - --disable_metrics=hugetlb,advtcp,udp  # 可选:禁用不常用指标(减少日志干扰)
    deploy:
      resources:
        limits:
          cpus: '0.5'
          memory: 1G

  postgres:
    image: postgres:15
    restart: always
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U grafana -d grafana || exit 1"]
      interval: 5s
      timeout: 5s
      retries: 10
    networks:
      - monitor-net
    environment:
      POSTGRES_USER: grafana
      POSTGRES_PASSWORD: L1L7WxZ443iyZd
      POSTGRES_DB: grafana
      POSTGRES_HOST_AUTH_METHOD: scram-sha-256  # 启用加密认证
      POSTGRES_INITDB_ARGS: "--auth-host=scram-sha-256 --auth-local=scram-sha-256" #安全加固
    volumes:
      - postgres_data:/var/lib/postgresql/data
    deploy:
      resources:
        limits:
          memory: 512M

# 自定义网络隔离监控系统流量
networks:
  monitor-net:
    driver: bridge
    attachable: true

volumes:
  prometheus_data: {
   
   }  # Prometheus时序数据持久化
  grafana_data: {
   
   }     # Grafana配置/仪表盘数据持久化
  postgres_data: 
本文章已经生成可运行项目
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值