什么是Prometheus和Grafana?
- Prometheus:一款开源的监控告警工具,擅长时序数据存储和多维度查询(通过PromQL),采用Pull模型主动抓取目标指标。
- Grafana:数据可视化平台,支持多种数据源(如Prometheus),通过丰富的仪表盘展示监控数据。
- 核心协作流程:
- Exporters(如Node Exporter)采集指标 → Prometheus存储并计算 → Grafana可视化展示 → Alertmanager触发告警。
监控系统核心流程:
- 数据采集
📥 Exporters(如node_exporter、mysqld_exporter)从目标系统(主机、MySQL等)收集指标。 - 数据存储与计算
🗃️ Prometheus 定期从 Exporters 拉取(Pull) 数据,存储为时序数据,并通过 PromQL 进行实时计算。 - 可视化展示
📊 Grafana 从 Prometheus 读取数据,通过预定义仪表盘(如ID 1860)展示监控图表。 - 告警触发与通知
🔔 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:
Prometheus+Grafana搭建监控系统及告警配置

最低0.47元/天 解锁文章
1550

被折叠的 条评论
为什么被折叠?



