Prometheus、Cadvisor和Grafana体系完整学习手册

一、部署基础信息(核心参数汇总)

1. 目录规划(数据与程序分离)

  • 根目录:/data(建议挂载独立磁盘,便于扩容)

  • 子目录创建命令:

    复制代码
    mkdir -p /data/{prometheus,grafana,alertmanager,node_exporter,blackbox_exporter,mysqld_exporter}
  • 目录用途:所有组件的安装文件、配置、数据均存储在对应子目录,权限统一归属prometheus用户。不再列举每个service都要创建用户,也可以不创建都用root用户执行

2. 核心组件版本与下载地址

组件名称 版本号 下载地址 默认端口 核心功能
Prometheus 2.53.4 https://github.com/prometheu​​​​​​s/prometheus/releases/downloa d/v2.53.4/prometheus-2.53.4.li nux-amd64.tar.gz 9090 核心监控引擎(拉取 / 存储 / 分析指标)
Grafana(企业版) 11.5.3 https://dl.grafana.com/enterpris e/release/grafana-enterprise-1 1.5.3.linux-amd64.tar.gz 3000 可视化面板
Alertmanager 0.28.1 ​​​​​​https://github.com/prometheus/ alertmanager/releases/download/v0.28.1/alertmanager-0.28.1.linux-amd64.tar.gz 9093 告警管理(分发 / 聚合 / 抑制)
node_exporter 1.9.0 https://github.com/prometheus/node_exporter/releases/download/v1.9.0/node_exporter-1.9.0.linux-amd64.tar.gz 9100 主机指标采集(CPU / 内存 / 磁盘)
cadvisor v0.47.0 无需手动下载(Docker 部署:google/cadvisor:v0.47.0 8080 容器指标采集
blackbox_exporter 0.25.0 https://github.com/prometheus/blackbox_exporter/releases/download/v0.25.0/blackbox_exporter-0.25.0.linux-amd64.tar.gz 9115 黑盒监控(HTTP/TCP/ICMP)
mysqld_exporter 0.15.1 https://github.com/prometheus/mysqld_exporter/releases/download/v0.15.1/mysqld_exporter-0.15.1.linux-amd64.tar.gz 9104 MySQL 指标采集

3. 前置准备(必做)

复制代码
# 1. 安装基础依赖
yum install -y wget tar vim docker  # 含Docker(用于cadvisor)

# 2. 创建专用用户(无登录权限)不再列举每个service都要创建,也可以不创建都用root执行
useradd -M -s /sbin/nologin prometheus

# 3. 放行核心端口(CentOS/RHEL)
firewall-cmd --add-port={9090,9093,9100,3000,8080,9115,9104}/tcp --permanent
firewall-cmd --reload

# 4. 启动Docker(用于cadvisor)
systemctl enable --now docker

# 5. 切换工作目录
cd /data

二、核心组件部署步骤(完整命令)

1. Prometheus(监控核心)

复制代码
# 1. 下载解压
wget https://github.com/prometheus/prometheus/releases/download/v2.53.4/prometheus-2.53.4.linux-amd64.tar.gz
tar -xvf prometheus-2.53.4.linux-amd64.tar.gz
mv prometheus-2.53.4.linux-amd64/* /data/prometheus

# 2. 权限配置
chown -R prometheus.prometheus /data/prometheus

# 3. 创建systemd服务
cat >> /etc/systemd/system/prometheus.service << EOF
[Unit]
Description=Prometheus Server
Documentation=https://prometheus.io/docs
After=network.target

[Service]
User=prometheus
Group=prometheus
Restart=on-failure
ExecStart=/data/prometheus/prometheus \
  --config.file=/data/prometheus/prometheus.yml \
  --storage.tsdb.path=/data/prometheus/data \
  --storage.tsdb.retention.time=15d \
  --web.enable-lifecycle

[Install]
WantedBy=multi-user.target
EOF

# 4. 启动验证
systemctl daemon-reload
systemctl enable --now prometheus.service
systemctl status prometheus.service
curl http://10.0.0.104:9090  # 访问成功即正常

2. Alertmanager(告警管理)

复制代码
# 1. 下载解压
wget https://github.com/prometheus/alertmanager/releases/download/v0.28.1/alertmanager-0.28.1.linux-amd64.tar.gz
tar -xvf alertmanager-0.28.1.linux-amd64.tar.gz
mv alertmanager-0.28.1.linux-amd64/* /data/alertmanager

# 2. 权限配置
chown -R prometheus.prometheus /data/alertmanager

# 3. 创建systemd服务
cat >> /etc/systemd/system/alertmanager.service << EOF
[Unit]
Description=Alert Manager
Wants=network-online.target
After=network-online.target

[Service]
User=prometheus
Group=prometheus
ExecStart=/data/alertmanager/alertmanager \
  --config.file=/data/alertmanager/alertmanager.yml \
  --storage.path=/data/alertmanager/data
Restart=always

[Install]
WantedBy=multi-user.target
EOF

# 4. 启动验证
systemctl daemon-reload
systemctl enable --now alertmanager.service
systemctl status alertmanager.service
curl http://10.0.0.104:9093  # 访问成功即正常

3. node_exporter(主机监控)

复制代码
# 1. 下载解压
wget https://github.com/prometheus/node_exporter/releases/download/v1.9.0/node_exporter-1.9.0.linux-amd64.tar.gz
tar -xvf node_exporter-1.9.0.linux-amd64.tar.gz
mv node_exporter-1.9.0.linux-amd64/* /data/node_exporter

# 2. 权限配置
chown -R prometheus.prometheus /data/node_exporter

# 3. 创建systemd服务
cat >> /etc/systemd/system/node_exporter.service << EOF
[Unit]
Description=node_exporter
Documentation=https://prometheus.io/
After=network.target

[Service]
User=prometheus
Group=prometheus
ExecStart=/data/node_exporter/node_exporter
Restart=on-failure

[Install]
WantedBy=multi-user.target
EOF

# 4. 启动验证
systemctl daemon-reload
systemctl enable --now node_exporter.service
curl http://10.0.0.104:9100/metrics  # 输出指标即正常

4. Grafana(可视化)

复制代码
# 1. 下载解压
wget https://dl.grafana.com/enterprise/release/grafana-enterprise-11.5.3.linux-amd64.tar.gz
tar -xvf grafana-enterprise-11.5.3.linux-amd64.tar.gz
mv grafana-enterprise-11.5.3.linux-amd64/* /data/grafana

# 2. 权限配置
chown -R prometheus.prometheus /data/grafana

# 3. 创建systemd服务
cat >> /etc/systemd/system/grafana-server.service << EOF
[Unit]
Description=Grafana server
Documentation=http://docs.grafana.org

[Service]
User=prometheus
Group=prometheus
Restart=on-failure
ExecStart=/data/grafana/bin/grafana-server --config=/data/grafana/conf/defaults.ini --homepath=/data/grafana

[Install]
WantedBy=multi-user.target
EOF

# 4. 启动验证
systemctl daemon-reload
systemctl enable --now grafana-server.service
curl http://10.0.0.104:3000  # 访问成功即正常(默认账号admin/admin)

5. cadvisor(容器监控)

复制代码
docker run -d \
  --name=cadvisor \
  --net=host \
  --privileged=true \
  -v /:/rootfs:ro \
  -v /var/run:/var/run:rw \
  -v /sys:/sys:ro \
  -v /var/lib/docker/:/var/lib/docker:ro \
  --restart=always \
  google/cadvisor:v0.47.0

# 验证
curl http://10.0.0.104:8080/metrics  # 输出容器指标即正常

6. blackbox_exporter(黑盒监控)

复制代码
# 1. 下载解压
wget https://github.com/prometheus/blackbox_exporter/releases/download/v0.25.0/blackbox_exporter-0.25.0.linux-amd64.tar.gz
tar -xvf blackbox_exporter-0.25.0.linux-amd64.tar.gz
mv blackbox_exporter-0.25.0.linux-amd64/* /data/blackbox_exporter

# 2. 配置监控模块
cat > /data/blackbox_exporter/blackbox.yml << EOF
modules:
  http_2xx:  # HTTP接口监控
    prober: http
    timeout: 5s
    http:
      valid_status_codes: [200,201,204]
  tcp_connect:  # TCP端口监控
    prober: tcp
    timeout: 5s
  icmp:  # ICMP ping监控
    prober: icmp
    timeout: 5s
EOF

# 3. 权限配置
chown -R prometheus.prometheus /data/blackbox_exporter

# 4. 创建systemd服务
cat >> /etc/systemd/system/blackbox_exporter.service << EOF
[Unit]
Description=Blackbox Exporter
After=network.target

[Service]
User=prometheus
Group=prometheus
ExecStart=/data/blackbox_exporter/blackbox_exporter --config.file=/data/blackbox_exporter/blackbox.yml
Restart=on-failure

[Install]
WantedBy=multi-user.target
EOF

# 5. 启动验证
systemctl daemon-reload
systemctl enable --now blackbox_exporter.service
curl http://10.0.0.104:9115/metrics  # 输出指标即正常

7. mysqld_exporter(MySQL 监控)

复制代码
# 1. 下载解压
wget https://github.com/prometheus/mysqld_exporter/releases/download/v0.15.1/mysqld_exporter-0.15.1.linux-amd64.tar.gz
tar -xvf mysqld_exporter-0.15.1.linux-amd64.tar.gz
mv mysqld_exporter-0.15.1.linux-amd64/* /data/mysqld_exporter

# 2. 创建MySQL监控用户
mysql -uroot -p
CREATE USER 'exporter'@'localhost' IDENTIFIED BY 'Exporter@123';
GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'localhost';
FLUSH PRIVILEGES;
exit

# 3. 配置连接信息
cat > /data/mysqld_exporter/.my.cnf << EOF
[client]
user=exporter
password=Exporter@123
host=localhost
EOF

# 4. 权限配置
chown -R prometheus.prometheus /data/mysqld_exporter

# 5. 创建systemd服务
cat >> /etc/systemd/system/mysqld_exporter.service << EOF
[Unit]
Description=MySQL Exporter
After=network.target

[Service]
User=prometheus
Group=prometheus
Environment=DATA_SOURCE_NAME=exporter:Exporter@123@(localhost:3306)/
ExecStart=/data/mysqld_exporter/mysqld_exporter --config.my-cnf=/data/mysqld_exporter/.my.cnf
Restart=on-failure

[Install]
WantedBy=multi-user.target
EOF

# 6. 启动验证
systemctl daemon-reload
systemctl enable --now mysqld_exporter.service
curl http://10.0.0.104:9104/metrics  # 输出MySQL指标即正常

三、监控核心配置(监控什么?怎么配?)

1. 核心监控对象与指标

监控维度 监控内容 对应组件 核心指标示例
主机层面 CPU、内存、磁盘 IO、网络、负载、磁盘使用率 node_exporter node_cpu_usagenode_memory_usage
容器层面 容器 CPU / 内存 / 磁盘、状态、镜像占用 cadvisor container_cpu_usage_seconds_total
服务层面 接口存活、端口监听、响应耗时 blackbox_exporter probe_successhttp_request_duration_seconds
数据库层面 连接数、QPS、慢查询、表空间 mysqld_exporter mysql_connected_clientsmysql_slow_queries
中间件层面 Nginx 连接数、Kafka 消费延迟、Redis 命中率 专属 Exporter(如 nginx_exporter) nginx_http_requests_totalredis_keyspace_hits
应用层面 JVM 内存、线程、接口调用量 jmx_exporter jvm_memory_used_bytes

2. Prometheus 核心配置(prometheus.yml)

完整配置示例
复制代码
global:
  scrape_interval: 1m          # 默认拉取频率
  evaluation_interval: 1m      # 告警规则评估频率
  external_labels:             # 全局标签(区分环境/集群)
    env: "production"
    cluster: "prod-cluster"

# 对接Alertmanager
alerting:
  alertmanagers:
    - static_configs:
        - targets: ["10.0.0.104:9093"]
      timeout: 10s

# 告警规则文件
rule_files:
  - "/data/alertmanager/rule/*.yml"

# 指标拉取配置(核心)
scrape_configs:
  # 1. 监控自身
  - job_name: "prometheus"
    static_configs:
      - targets: ["10.0.0.104:9090"]

  # 2. 主机监控
  - job_name: "node_exporter"
    scrape_interval: 15s        # 覆盖全局拉取频率
    static_configs:
      - targets: ["10.0.0.104:9100", "10.0.0.105:9100"]
        labels:
          group: "web-server"

  # 3. 容器监控
  - job_name: "cadvisor"
    scrape_interval: 15s
    static_configs:
      - targets: ["10.0.0.104:8080"]

  # 4. HTTP接口监控(blackbox)
  - job_name: "blackbox_http"
    scrape_interval: 10s
    metrics_path: /probe
    params:
      module: [http_2xx]
    static_configs:
      - targets: ["http://10.0.0.104:80", "http://10.0.0.104:8080/api/health"]
    relabel_configs:
      - source_labels: [__address__]
        target_label: __param_target
      - source_labels: [__param_target]
        target_label: instance
      - target_label: __address__
        replacement: 10.0.0.104:9115

  # 5. TCP端口监控(blackbox)
  - job_name: "blackbox_tcp"
    scrape_interval: 10s
    metrics_path: /probe
    params:
      module: [tcp_connect]
    static_configs:
      - targets: ["10.0.0.104:3306", "10.0.0.104:6379"]
    relabel_configs:
      - source_labels: [__address__]
        target_label: __param_target
      - source_labels: [__param_target]
        target_label: instance
      - target_label: __address__
        replacement: 10.0.0.104:9115

  # 6. MySQL监控
  - job_name: "mysql_exporter"
    scrape_interval: 15s
    static_configs:
      - targets: ["10.0.0.104:9104"]
配置语法核心说明
配置节点 核心参数 含义
global scrape_interval 所有 job 默认拉取频率(默认 1m,密集监控可设 15s)
alerting alertmanagers.targets Alertmanager 地址列表
rule_files - 告警规则文件路径(支持通配符)
scrape_configs job_name 监控任务名称(唯一)
static_configs.targets 监控目标(IP: 端口)
labels 自定义标签(用于分类筛选)
relabel_configs 标签重写(清洗 / 添加 / 删除标签)
file_sd_configs 动态发现(适合大量目标,通过文件更新)
配置验证与重载
复制代码
# 1. 语法验证(必做)
cd /data/prometheus
./promtool check config prometheus.yml

# 2. 热重载(推荐,无中断)
curl -X POST http://10.0.0.104:9090/-/reload

# 3. 重启(配置结构变更时用)
systemctl restart prometheus.service

3. 告警规则编写(实战示例)

规则文件目录创建
复制代码
mkdir -p /data/alertmanager/rule
chown -R prometheus.prometheus /data/alertmanager/rule
通用告警规则示例(/data/alertmanager/rule/common.yml)
复制代码
groups:
  - name: 通用监控规则
    rules:
      # 1. 主机宕机
      - alert: 主机宕机
        expr: up == 0
        for: 1m
        labels:
          severity: critical
        annotations:
          summary: "{{ $labels.instance }} 主机宕机"
          description: "{{ $labels.instance }} 持续1分钟未响应,请检查服务器状态。"

      # 2. 磁盘使用率过高
      - alert: 磁盘使用率过高
        expr: 100 - (node_filesystem_avail_bytes{fstype=~"ext4|xfs"} / node_filesystem_size_bytes{fstype=~"ext4|xfs"} * 100) > 90
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "{{ $labels.instance }} 磁盘使用率过高"
          description: "分区 {{ $labels.mountpoint }} 使用率达 {{ $value | printf \"%.2f\" }}%,超过90%阈值。"

      # 3. HTTP接口不可用
      - alert: HTTP接口不可用
        expr: probe_success{job="blackbox_http"} == 0
        for: 1m
        labels:
          severity: critical
        annotations:
          summary: "{{ $labels.instance }} 接口不可用"
          description: "接口 {{ $labels.instance }} 访问失败,请检查服务。"

      # 4. MySQL连接数过高
      - alert: MySQL连接数过高
        expr: mysql_global_status_threads_connected > 500
        for: 2m
        labels:
          severity: warning
        annotations:
          summary: "{{ $labels.instance }} MySQL连接数过高"
          description: "当前连接数 {{ $value }},超过500阈值。"
Alertmanager 告警渠道配置(邮件示例)
复制代码
# /data/alertmanager/alertmanager.yml
global:
  smtp_smarthost: 'smtp.163.com:25'
  smtp_from: 'your_email@163.com'
  smtp_auth_username: 'your_email@163.com'
  smtp_auth_password: '邮箱授权码'
  smtp_require_tls: false

route:
  group_by: ['alertname']
  group_wait: 10s
  group_interval: 10s
  repeat_interval: 1h
  receiver: 'email-receiver'

receivers:
- name: 'email-receiver'
  email_configs:
  - to: 'admin@example.com'
    subject: '【告警】{{ .CommonLabels.alertname }}'
    html: |
      <h3>告警详情</h3>
      <p>告警名称:{{ .CommonLabels.alertname }}</p>
      <p>级别:{{ .CommonLabels.severity }}</p>
      <p>描述:{{ .CommonAnnotations.description }}</p>
      <p>时间:{{ .StartsAt.Format "2006-01-02 15:04:05" }}</p>

# 抑制规则(避免重复告警)
inhibit_rules:
  - source_match:
      severity: 'critical'
    target_match:
      severity: 'warning'
    equal: ['alertname', 'instance']

四、Grafana 可视化配置

1. 对接 Prometheus 数据源

  1. 登录 Grafana(http://10.0.0.104:3000),首次登录修改默认密码;
  2. 左侧菜单栏 → ConnectionsData sourcesAdd data source → 选择Prometheus
  3. 填写URLhttp://10.0.0.104:9090 → 点击Save & test,提示 "Data source is working" 即成功。

2. 导入预制仪表盘

监控场景 仪表盘 ID 导入步骤
Linux 主机详情 12633 左侧DashboardsNewImport → 输入 ID → 选择数据源 → Import
Linux 主机列表 12632 同上
容器监控 893 同上
MySQL 监控 7362 同上

3. 自定义仪表盘

  1. 新建 Dashboard → Add Panel → 选择Prometheus数据源;
  2. 输入 PromQL 查询语句(如node_cpu_usage{instance="10.0.0.104"});
  3. 配置图表类型(折线图 / 柱状图)、阈值标注(如 > 90% 标红);
  4. 保存面板,命名 Dashboard(如 "生产环境主机监控")。

五、PromQL 查询语言核心语法

1. 基础查询

  • 直接查询指标:node_memory_usage(返回所有标签的内存使用率);

  • 标签过滤:node_memory_usage{instance="10.0.0.104",env="production"}

  • 聚合运算:

    复制代码
    sum(node_cpu_usage) by (instance)  # 按实例汇总CPU使用率
    avg(node_disk_usage) by (env)      # 按环境计算平均磁盘使用率
    max(node_load15)                   # 最大15分钟负载

2. 时间范围查询

  • node_load15[5m]:过去 5 分钟的 15 分钟负载;
  • increase(node_http_requests_total[1m]):1 分钟内请求数增量;
  • rate(node_http_requests_total[1m]):1 分钟内请求速率(每秒);
  • irate(node_http_requests_total[10s]):10 秒内瞬时速率(适合高频指标)。

3. 阈值判断

  • node_disk_usage > 90:磁盘使用率超过 90%;
  • probe_success == 0:监控目标不可用;
  • increase(mysql_slow_queries[5m]) > 10:5 分钟慢查询超过 10 个。

六、进阶补充(生产环境必备)

1. 监控数据持久化与扩容

  • 数据保留 :通过--storage.tsdb.retention.time=30d(保留 30 天)或--storage.tsdb.retention.size=100GB(限制 100GB)控制数据量;
  • 扩容方案
    1. /data挂载独立磁盘,定期清理旧数据;
    2. 生产环境用 Thanos 实现数据集群化存储和查询;
    3. 指标分片:按业务 / 环境拆分 Prometheus 实例。

2. 常见问题排查

问题现象 排查步骤
Prometheus 启动失败 1. 检查权限:chown -R prometheus.prometheus /data/prometheus;2. 验证配置:./promtool check config;3. 查看日志:journalctl -u prometheus -f
监控目标显示 DOWN 1. 检查 Exporter 状态:systemctl status xxx_exporter;2. 测试端口连通:telnet IP 端口;3. 防火墙放行端口
告警误触发 1. 增加for持续时间(如 1m→5m);2. 用rate/irate平滑指标;3. 调整阈值适应业务场景
Grafana 无数据 1. 验证数据源连通性;2. 在 Prometheus Graph 中测试 PromQL;3. 检查 targets 状态

3. 性能调优建议

  • Prometheus 调优
    1. 降低非核心指标拉取频率(如从 15s 改为 1m);
    2. 删除无用标签(通过relabel_configslabeldrop);
    3. 限制标签维度(避免单指标标签数超过 10 个);
  • Grafana 调优
    1. 减少面板查询次数(合并重复查询);
    2. 增大查询时间范围步长(如 1m→5m);
    3. 避免使用irate查询长时间段数据。

4. 其他常用 Exporter 扩展

插件名称 监控对象 下载地址(示例版本) 默认端口 核心指标
redis_exporter Redis https://github.com/oliver006 /redis_exporter/releases/downl oad/v1.52.0/redis_exporter-v1.52.0.linux-amd64.tar.gz 9121 redis_connected_clientsredis_keyspace_hits
nginx_exporter Nginx https://github.com/nginxinc/ngi nx-prometheus-exporter/releases/download/v0.11.0/nginx-prometh eus-exporter_0.11.0_linux_amd64.tar.gz 9113 nginx_http_requests_totalnginx_active_connections
jmx_exporter Java 应用 https://repo1.maven.org/maven2/i o/prometheus/jmx/jmx_promethe us_javaagent/0.19.0/jmx_prome theus_javaagent-0.19.0.jar 自定义 jvm_memory_used_bytesjvm_threads_active

七、总结

  1. 核心逻辑:Exporter 采集指标 → Prometheus 拉取 / 存储 → PromQL 分析 → 告警 / 可视化,所有配置需先验证语法再重载;
  2. 部署重点:目录规划(数据与程序分离)、专用用户授权、systemd 服务配置,确保服务可启停、自启动;
  3. 监控配置:按 "主机→容器→服务→数据库" 逐步扩展,通用场景用 blackbox_exporter,专属场景用对应 Exporter;
  4. 进阶关键:掌握 PromQL 实现指标分析,配置告警抑制避免误触发,生产环境做好数据持久化和性能调优。
相关推荐
龙码精神2 天前
前端嵌入Grafana 报表的自定义方案:隐藏导航栏保留筛选工具
grafana
西岸行者3 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
悠哉悠哉愿意3 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
别催小唐敲代码3 天前
嵌入式学习路线
学习
毛小茛3 天前
计算机系统概论——校验码
学习
babe小鑫3 天前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
winfreedoms3 天前
ROS2知识大白话
笔记·学习·ros2
在这habit之下3 天前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs
我想我不够好。3 天前
2026.2.25监控学习
学习
im_AMBER3 天前
Leetcode 127 删除有序数组中的重复项 | 删除有序数组中的重复项 II
数据结构·学习·算法·leetcode