部署搭建 Prometheus 和 Grafana教程
- 采用容器方式部署
- 包括Node Exporter 和 cAdvisor(收集容器数据)
- 部署机器是Ubuntu22.04
第一步:安装 Docker 和 Docker Compose
shell
sudo apt-get update
sudo apt-get install -y ca-certificates curl gnupg
# 添加GPG密钥和软件源
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo usermod -aG docker $USER #重新登录你的 SSH 会话或终端才能生效
docker --version
docker compose version
第二步: Docker Compose 配置文件和Prometheus配置文件
2.1创建 Prometheus 配置文件
shell
# 创建一个名为 monitoring 的目录,并在其中创建 prometheus 子目录
mkdir -p /data/docker-compose/prometheus
cd /data/docker-compose/prometheus
vim prometheus.yml # Prometheus的配置文件
global:
scrape_interval: 15s
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
- job_name: 'node-exporter'
static_configs:
- targets: ['node-exporter:9100']
- job_name: 'cadvisor'
static_configs:
- targets: ['cadvisor:8080']
这个配置告诉 Prometheus 去采集它自己、Node Exporter 和 cAdvisor 的指标数据。
2.2创建 Docker Compose 文件
shell
cd /data/docker-compose/prometheus
vim docker-compose.yml
services:
prometheus:
image: prom/prometheus:latest
container_name: prometheus
restart: unless-stopped
ports:
- "9090:9090"
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml:ro
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.path=/prometheus'
- '--web.enable-lifecycle'
networks:
- monitoring
grafana:
image: grafana/grafana:latest
container_name: grafana
restart: unless-stopped
ports:
- "3000:3000"
environment:
- GF_SECURITY_ADMIN_USER=admin
- GF_SECURITY_ADMIN_PASSWORD=admin
volumes:
- grafana-data:/var/lib/grafana
networks:
- monitoring
depends_on:
- prometheus
node-exporter:
image: prom/node-exporter:latest
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.sysfs=/host/sys'
- '--path.rootfs=/rootfs'
networks:
- monitoring
cadvisor:
image: gcr.nju.edu.cn/cadvisor/cadvisor:latest
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
networks:
- monitoring
networks:
monitoring:
driver: bridge
volumes:
grafana-data:
第三步:启动服务验证和访问
shell
docker compose up -d
docker compose ps
四个服务(prometheus, grafana, node-exporter, cadvisor)的状态都是 Up

Prometheus:浏览器访问 http://<你的服务器IP>:9090。可以点击 "Status" -> "Targets" 查看所有监控目标是否都为 "UP" 状态。

Grafana:浏览器访问 http://<你的服务器IP>:3000。使用我们在配置文件中设置的用户名 admin 和密码 admin 登录。

第四步:在 Grafana 中配置并使用
4.1 添加 Prometheus 数据源

点击 Add data source,然后选择 Prometheus
在 HTTP -> URL 字段中,输入 http://prometheus:9090

点击页面底部的 Save & Test,看到 "Data source is working" 的绿色提示即表示连接成功
4.2 导入预置仪表盘
Grafana 官网提供了大量社区贡献的仪表盘,可以直接导入使用。
常用模板ID
监控容器:14282 3146 8685 10000 8588 315
监控物理机-虚拟机(Linux):8919 9276
监控物理机-虚拟机(Windows):10467 10171
监控协议http/icmp/tcp/dns:9965


额外:
设置Granfa中文
登录到 Grafana 后,点击右上角的头像,进入 Profile 页面
在 Preferences 栏目下找到 Language 选项
从下拉菜单中选择 中文(简体),然后点击 Save 按钮保存设置

Prometheus的原理和基本概念
3个核心基本概念
时间序列数据:将数据按照时间排列收集的技术
指标:具体指CPU使用率和内存占用等信息,每一个具体的监控项都是一个指标
exporter:专门替promthues采集数据的工具,例如 Mysql Exporter Node Exporter等,负责吧系统各项指标收集好,提供给promthues。
等promthues抓取
核心原理
Prometheus Server :采用"拉取模式"主动采集数据,间隔默认15s,去Exporter拿取最新的数据
Time-Series Database (TSDB) :拿到的数据回存在自带的TSDB数据库,默认保留15天,防止爆满
**Prometheus Exporters:**就是报告员,将指标从特定系统转换为普罗米修斯可以理解的格式。它可以是系统指标,如 CPU、内存等,也可以是 Java JMX 指标、MySQL 指标等
Prometheus Pushgateway :Prometheus 默认使用 pull 方式来抓取指标。然而,有些场景需要将指标推送到 prometheus
Prometheus Alert Manager :Alertmanager 是 Prometheus 监控系统的关键部分。它的主要工作是根据 Prometheus 警报配置中设置的指标阈值发送警报;Alertmanager 对告警去重、抑制、静默、分组,最后使用各类通知媒介(电子邮件、slack 等)发出告警事件
PromQL:PromQL 是一种灵活的查询语言,可用于从 prometheus 查询时间序列指标
常用promql表达式
CPU 使用率:100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}5m)) * 100) CPU使用率 = 100% - CPU空闲率
内存使用率:(1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100 内存使用率 = 1 - (可用内存 / 总内存)
磁盘使用率:(1 - node_filesystem_free_bytes{fstype!="tmpfs"} / node_filesystem_size_bytes) * 100 磁盘使用率 = 1 - (剩余空间 / 总空间)