Prometheus+Grafana监控平台学习笔记

一、Prometheus 核心基础介绍

1.1 基本概述

Prometheus是由Go语言开发的开源监控、报警与时间序列数据库组合工具,依托Kubernetes生态快速普及,可实现主机、服务、容器全方位监控,支持多类型Exporter数据采集与PushGateway数据上报,性能可支撑上万台规模集群监控,是云原生主流监控方案。

其核心存储形式为时间序列数据,即按照时间顺序记录系统、设备、服务的状态变化数据,广泛应用于系统运维监控、车联网、证券交易、无人驾驶等场景。

1.2 时间序列数据库核心优势

  • 性能优异:相较于关系型数据库,时序数据库针对大规模时序数据读写做了深度优化,I/O处理能力远超传统数据库,适配海量监控数据场景。

  • 存储成本低:采用 key=value 标签存储模式+高效压缩算法,单条采样数据仅占用约3.5字节空间。百万级时序数据、30秒采集一次、保留60天数据,仅需200G左右存储空间,极大降低存储与I/O开销。

1.3 Prometheus 核心特性

  1. 多维度数据建模与查询,支持通过多维度标签筛选、统计监控数据;

  2. 内置灵活的PromQL查询语言,同时提供HTTP查询接口,适配第三方可视化工具;

  3. 无分布式存储依赖,单节点独立运行,本地时序数据库支持每秒百万级数据存储,可对接第三方时序数据库扩展存储;

  4. 默认基于HTTP协议的Pull(拉取)模型采集指标,降低监控与被监控服务耦合度;

  5. 支持Push(推送)模型,可通过PushGateway中间网关适配短生命周期任务数据上报;

  6. 支持服务发现、静态配置两种方式自动识别监控目标;

  7. 原生支持基础图表展示,完美兼容Grafana实现专业可视化;

  8. 高可用、高可靠,故障场景下仍可正常查询历史监控数据,适配运维故障排查场景。

1.4 核心监控原理

Prometheus Server为核心服务,会定时向被监控目标(主机、服务、容器)发起HTTP请求,抓取目标暴露的 /metrics 接口指标数据。所有监控数据以时序格式存储,支持后续查询、聚合、告警触发。

Pull模型核心优势:被监控端无需感知监控服务,完全独立运行;避免大量终端同时推送数据导致监控端过载;配置简单、扩展性强、耦合度低,杜绝推送失败引发的业务故障。

1.5 配置文件六大核心配置段

Prometheus采用模块化配置,六大核心配置段可自由组合,适配不同监控场景,核心配置用途如下:

组合配置段 核心用途
采集配置段(scrape_configs) 基础数据采集,数据仅存储本地
采集配置+远程写入(remote_write) 数据本地存储+同步远端时序数据库
远程查询(remote_read) 纯查询远端存储的监控数据
采集配置+远程查询 同时查询本地、远端存储数据
采集配置+告警配置+Alertmanager 本地数据触发告警,推送至Alertmanager
远程查询+告警配置+Alertmanager 基于远端数据触发远程告警
远程读写+预聚合配置 预聚合指标,结果同步至远端存储

完整基础配置示例(prometheus.yml)

# 全局配置段
global:
  scrape_interval:     15s       # 全局数据采集间隔
  evaluation_interval: 15s       # 告警、预聚合规则计算间隔
  scrape_timeout: 10s            # 采集超时时间
  query_log_file: /opt/logs/prometheus_query_log  # 查询日志路径
  external_labels:                # 全局自定义标签
    account: 'huawei-main'
    region: 'prometheus'

# Alertmanager 告警服务对接配置
alerting:
  alertmanagers:
  - scheme: http
    static_configs:
    - targets:
      - "localhost:9090"

# 告警、预聚合规则文件路径
rule_files:
    - /etc/prometheus/rules/record.yml
    - /etc/prometheus/rules/alert.yml

# 数据采集配置
scrape_configs:
  - job_name: 'prometheus'
    static_configs:
    - targets: ['localhost:9090']

# 远端数据查询配置
remote_read:
  - url: http://prometheus/v1/read
    read_recent: true
  - url: "http://m3coordinator-read:7201/api/v1/prom/remote/read"
    read_recent: true

# 远端数据写入配置
remote_write:
  - url: "http://m3coordinator-write:7201/api/v1/prom/remote/write"
    queue_config:
      capacity: 10000
      max_samples_per_send: 60000
    write_relabel_configs:
      - source_labels: [__name__]
        regex: '(kubelet_|apiserver_|container_fs_).*'
        action: drop

二、Prometheus 监控平台部署实操

2.1 部署资源包版本

本次部署采用稳定适配版本,各组件官方安装包地址如下:

  • Prometheus主程序:v3.0.0

  • 主机监控插件node_exporter:v1.8.2

  • 告警服务Alertmanager:v0.27.0

  • MySQL监控插件mysqld_exporter:v0.16.0

  • HAProxy监控插件haproxy_exporter:v0.15.0(官方最终独立版本,新版HAProxy已内置监控能力)

  • Nginx监控插件nginx-prometheus-exporter:v1.5.1

2.2 物理主机部署 Prometheus 服务端

2.2.1 安装启动

# 下载安装包
wget https://github.com/prometheus/prometheus/releases/tag/v3.0.0/prometheus-3.0.0.linux-amd64.tar.gz

# 解压部署
tar xf prometheus-3.0.0.linux-amd64.tar.gz -C /home/
cd /home/prometheus-3.0.0.linux-amd64/

# 后台启动服务
nohup ./prometheus --config.file=prometheus.yml &

# 验证端口监听(默认9090)
netstat -anptu | grep prometheus

2.2.2 常用启动命令参数

支持配置文件重载、资源自适应、端口监听、存储策略等丰富参数,核心常用参数如下:

  • --config.file:指定Prometheus主配置文件路径

  • --config.auto-reload-interval=30s:30秒自动检测并重载配置文件

  • --web.listen-address=0.0.0.0:9090:指定服务监听地址和端口

  • --auto-gomaxprocs:自动适配Linux容器CPU配额

  • --auto-gomemlimit:自动适配容器内存限制

  • --storage.tsdb.path:指定时序数据存储目录

  • --storage.tsdb.retention.time:数据保留时长,默认15天

  • --web.enable-otlp-receiver:开启OTLP协议数据接收接口

2.2.3 启动验证

浏览器访问 http://服务器IP:9090,进入Prometheus原生UI界面,默认监控本机指标;访问 http://IP:9090/metrics 可查看原始监控时序数据。

启动报错解决:若提示 lock DB directory: resource temporarily unavailable,为服务未正常关闭产生锁文件,执行 rm /home/prometheus-3.0.0.linux-amd64/data/lock 删除锁文件后重启即可。

2.3 监控远端主机(node_exporter部署)

node_exporter用于采集服务器CPU、内存、磁盘、网络等基础硬件指标,部署在所有被监控主机。

2.3.1 被监控端部署启动

# 下载解压
wget https://github.com/prometheus/node_exporter/releases/tag/v1.8.2/node_exporter-1.8.2.linux-amd64.tar.gz
tar xf node_exporter-1.8.2.linux-amd64.tar.gz -C /home/
cd /home/node_exporter-1.8.2.linux-amd64/

# 后台启动,默认监听9100端口
nohup ./node_exporter &

# 验证端口
netstat -anptu | grep 9100

2.3.2 Prometheus服务端添加监控配置

编辑 prometheus.yml,新增远端主机采集规则:

scrape_configs:
  - job_name: 'server'
    static_configs:
    - targets: ['192.168.166.13:9100'] # 被监控主机IP+9100端口

重启Prometheus服务,访问Status-Targets页面,即可看到新增的监控节点。

2.4 监控MySQL服务(mysqld_exporter部署)

2.4.1 MySQL环境准备与授权

# 安装MySQL服务
dnf -y install mysql-server
systemctl enable --now mysqld

# 创建监控用户并授权
mysql> create user 'hello'@'localhost' identified by '123456';
mysql> grant select,replication client,process on *.* to 'hello'@'localhost';
mysql> flush privileges;

2.4.2 部署启动exporter

# 下载解压
wget https://github.com/prometheus/mysqld_exporter/releases/tag/v0.16.0/mysqld_exporter-0.16.0.linux-amd64.tar.gz
tar xf mysqld_exporter-0.16.0.linux-amd64.tar.gz -C /usr/local

# 配置数据库连接账号密码
vim /home/mysqld_exporter-0.16.0.linux-amd64/.my.cnf
# 配置内容
[client]
user=hello
password=123456

# 后台启动(默认9104端口)
nohup /home/mysqld_exporter-0.16.0.linux-amd64/mysqld_exporter --config.my-cnf=/home/mysqld_exporter-0.16.0.linux-amd64/.my.cnf 

2.4.3 服务端添加监控配置

- job_name: 'mysql'
  static_configs:
  - targets: ['192.168.166.13:9104']

重启Prometheus后,即可采集MySQL连接数、锁、性能指标等数据。

2.5 容器快速部署Prometheus

docker run --name prometheus -d -p 127.0.0.1:9090:9090 prom/prometheus

三、Grafana 可视化部署与全量配置详解

3.1 Grafana 概述

Grafana是开源可视化监控仪表盘工具,支持Prometheus、InfluxDB、Elasticsearch等多数据源,可快速绘制美观的监控图表、自定义仪表盘,同时具备强大的告警通知能力,是Prometheus最佳可视化配套工具。

3.2 Grafana 物理机部署

# 安装企业版11.3.1
sudo yum install -y https://dl.grafana.com/enterprise/release/grafana-enterprise-11.3.1-1.x86_64.rpm

# 启动并设置开机自启
systemctl enable grafana-server
systemctl start grafana-server

# 验证端口(默认3000)
lsof -i :3000

默认账号密码:admin/admin,首次登录可跳过密码修改或自定义新密码。

3.3 基础初始化配置

  1. 汉化设置:登录后进入系统设置,切换界面语言为中文;

  2. 添加Prometheus数据源:Data Sources → Add data source → 选择Prometheus → 填写Prometheus服务地址 http://IP:9090 → 保存测试;

  3. 仪表盘模板导入:支持自定义绘制图表,也可从官方模板库(https://grafana.com/grafana/dashboards/)、Percona开源模板库导入现成监控面板,快速实现主机、MySQL等服务可视化监控。

3.4 Grafana 配置文件全参数详解

Grafana主配置文件涵盖路径、服务、数据库、安全、认证等核心模块,所有参数释义如下:

3.4.1 [paths] 路径配置模块

  • data:临时文件、会话、SQLite数据库存储路径,默认 /var/lib/grafana

  • temp_data_lifetime:临时文件过期清理时间,默认无,可配置 24h

  • logs:日志存储目录,默认 /var/log/grafana

  • plugins:插件自动扫描目录,默认 /var/lib/grafana/plugins

  • provisioning:启动自动加载的配置文件目录,默认 conf/provisioning

3.4.2 [server] 服务运行模块

  • protocol:传输协议,支持http、https、h2、socket,默认http

  • min_tls_version:最低支持TLS版本,生产建议配置 TLS1.2

  • http_addr:绑定监听IP,空值监听所有网卡

  • http_port:服务端口,默认3000

  • domain:对外访问域名,默认localhost

  • root_url:公共访问完整URL,默认 %(protocol)s://%(domain)s:%(http_port)s/

  • enable_gzip:是否开启gzip压缩,默认关闭

  • read_timeout:请求读取超时时间,0为无超时

3.4.3 [database] 数据库模块

  • type:数据库类型,支持sqlite3、mysql、postgres,默认sqlite3

  • host/name/user/password:数据库连接地址、库名、账号、密码

  • max_idle_conn:最大空闲连接数,默认2

  • max_open_conn:最大并发连接数,默认无限制

  • conn_max_lifetime:连接最大存活时间,默认14400秒(4小时)

  • log_queries:是否记录SQL执行日志

  • ssl_mode:数据库SSL连接模式,支持disable、require等

3.4.4 [security] 安全模块

  • admin_user/admin_password:默认管理员账号密码

  • secret_key:数据签名密钥,用于加密会话与数据

  • cookie_secure:HTTPS场景下是否开启Cookie安全模式

  • allow_embedding:是否允许iframe嵌套展示Grafana页面,默认关闭

  • strict_transport_security:是否开启HSTS安全响应头

  • disable_brute_force_login_protection:是否关闭登录暴力破解防护,默认开启防护

3.4.5 [auth] 认证模块

  • login_cookie_name:登录会话Cookie名称

  • disable_login:是否关闭内置登录功能,默认开启

  • oauth_auto_login:是否自动触发OAuth登录

  • api_key_max_seconds_to_live:API密钥有效期,1为永久有效

3.4.6 第三方认证模块(GitHub/GitLab)

支持对接第三方账号登录,核心配置参数:

  • enabled:是否开启对应第三方认证

  • client_id/client_secret:第三方应用授权ID与密钥

  • scopes:授权权限范围

  • auth_url/token_url/api_url:认证、令牌获取、用户信息查询接口

3.5 Grafana 邮件告警配置

修改Grafana配置文件,开启SMTP邮件推送告警:

[smtp]
enabled = true
host = "smtp.163.com:25"
user = "xxx@163.com"
password = "邮箱授权码"
from_address = "xxx@163.com"
from_name = Grafana
smtp_require_tls = false

配置完成后重启Grafana:systemctl restart grafana,即可实现监控异常邮件告警。

四、Alertmanager 告警系统配置

4.1 Alertmanager 概述

Alertmanager是Prometheus配套告警组件,负责接收Prometheus推送的告警信息,实现告警分组、去重、抑制、延时、推送通知(邮件、钉钉、企业微信等),本次部署版本为v0.27.0。

4.2 部署启动

# 解压部署
tar xf alertmanager-0.27.0.linux-amd64.tar.gz -C /usr/local

# 后台启动,监听9093端口
nohup ./alertmanager --web.listen-address=:9093 --config.file=/home/alertmanager-0.27.0.linux-amd64/alertmanager.yml &

# 验证端口
netstat -anptu | grep 9093

访问地址:http://服务器IP:9093

4.3 核心配置文件详解

4.3.1 邮件告警完整配置

global:
  smtp_smarthost: 'smtp.163.com:25'
  smtp_from: 'xxx@163.com'
  smtp_auth_username: 'xxx@163.com'
  smtp_auth_password: '邮箱授权码'
  smtp_require_tls: false

route:
  group_by: ['alertname']       # 按告警名称分组
  group_wait: 30s               # 首条告警等待30s,合并同组告警
  group_interval: 5m            # 同组告警再次推送间隔
  repeat_interval: 1h           # 告警重复推送间隔
  receiver: 'default'

receivers:
  - name: 'default'
    email_configs:
    - to: '接收邮箱@qq.com'
      send_resolved: true        # 推送告警恢复通知

# 告警抑制规则:严重告警触发时,抑制同级普通告警
inhibit_rules:
  - source_match:
      severity: 'critical'
    target_match:
      severity: 'warning'
    equal: ['alertname', 'dev', 'instance']

4.3.2 配置核心参数说明

  • group_wait:首次告警延时推送,用于合并短时间内同类型批量告警,避免轰炸

  • group_interval:同一告警组,两次推送的最小间隔

  • repeat_interval:异常未恢复时,告警重复推送周期

  • send_resolved:true=告警恢复后推送恢复通知,false=仅推送异常告警

  • inhibit_rules:告警抑制,避免高优先级告警触发时,大量低优先级告警干扰排查

4.4 Prometheus 对接 Alertmanager

编辑prometheus.yml,指定Alertmanager地址与告警规则文件路径:

alerting:
  alertmanagers:
    - static_configs:
        - targets:
           - 192.168.166.9:9093

rule_files:
  - "/etc/prometheus/rules/*.yml"

重启Prometheus服务使配置生效。

4.5 常用告警规则配置案例

创建告警规则目录:mkdir -p /etc/prometheus/rules,自定义各类监控告警规则。

4.5.1 CPU使用率告警

groups:
- name: cpu-alerts
  rules:
  - alert: HighCPUUsage
    expr: 100 - (avg by (instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80
    for: 2m
    labels:
      severity: warning
    annotations:
      summary: "节点{{ $labels.instance }} CPU使用率过高"
      description: "近5分钟CPU使用率持续超过80%,当前节点负载异常"

4.5.2 内存使用率告警

groups:
- name: memory-alerts
  rules:
  - alert: LowMemory
    expr: (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100 < 10
    for: 3m
    labels:
      severity: critical
    annotations:
      summary: "节点{{ $labels.instance }} 可用内存不足"
      description: "节点可用内存占比低于10%,存在内存溢出风险"

4.5.3 磁盘空间告警

groups:
- name: disk-alerts
  rules:
  - alert: LowDiskSpace
    expr: node_filesystem_avail_bytes{mountpoint="/"} < 1073741824
    for: 5m
    labels:
      severity: warning
    annotations:
      summary: "节点{{ $labels.instance }} 根目录磁盘空间不足"
      description: "根目录可用空间小于1GB,请及时清理磁盘"

4.5.4 MySQL连接数告警

groups:
- name: mysql-alerts
  rules:
  - alert: MySQLHighConnections
    expr: mysql_global_status_threads_connected > 100
    for: 5m
    labels:
      severity: warning
    annotations:
      summary: "MySQL实例{{ $labels.instance }} 连接数过高"
      description: "MySQL并发连接数持续超过100,可能影响业务访问"

4.6 PromQL 常用表达式编写指南

4.6.1 阈值比较

  • CPU使用率大于80%:100 - (avg by (instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80

  • 可用内存小于10GB:node_memory_MemAvailable_bytes < 10 * 1024 * 1024 * 1024

4.6.2 变化率计算

  • 网络流量5分钟增长率:(increase(node_network_receive_bytes_total[5m]) / node_network_receive_bytes_total offset 5m) > 0.1

  • 每秒新建进程数:irate(process_start_time_seconds[1m]) > 5

4.6.3 聚合函数

  • 平均负载:avg by (instance) (node_load1) > 2

  • 5分钟500错误总数:sum by (job) (increase(http_server_requests_total{status_code="500"}[5m])) > 10

五、钉钉机器人告警对接实现

5.1 前期准备

  1. 钉钉群创建自定义机器人,勾选自定义关键词(如Alertmanager);

  2. 复制机器人Webhook地址:https://oapi.dingtalk.com/robot/send?access_token=xxx

  3. 确保服务器可正常访问钉钉外网接口。

5.2 Alertmanager 钉钉告警配置

5.2.1 基础Webhook配置

global:
  resolve_timeout: 5m
route:
  group_by: ['alertname']
  group_wait: 10s
  group_interval: 10s
  repeat_interval: 1h
  receiver: 'dingtalk'

receivers:
- name: 'dingtalk'
  webhook_configs:
  - url: '你的钉钉机器人Webhook地址'
    send_resolved: true
    http_config:
      tls_config:
        insecure_skip_verify: false

inhibit_rules:
  - source_match:
      severity: 'critical'
    target_match:
      severity: 'warning'
    equal: ['alertname', 'dev', 'instance']

5.2.2 自定义钉钉消息模板(美化输出)

创建模板文件 dingtalk.tmpl,实现Markdown格式告警消息:

{{ define "dingtalk.message" }}
{
  "msgtype": "markdown",
  "markdown": {
    "title": "{{ .CommonAnnotations.summary }}",
    "text": "### 监控告警通知\n#### 状态:{{ .Status | toUpper }}\n#### 告警名称:{{ .CommonLabels.alertname }}\n#### 告警详情:{{ .CommonAnnotations.description }}\n#### 触发时间:{{ .StartsAt.Format "2006-01-02 15:04:05" }}\n{{ if gt (len .CommonLabels.instance) 0 }}#### 监控实例:{{ .CommonLabels.instance }}{{ end }}"
  }
}
{{ end }}

在alertmanager.yml中引用模板:

templates:
  - '/home/alertmanager-0.27.0.linux-amd64/dingtalk.tmpl'

receivers:
- name: 'dingtalk'
  webhook_configs:
  - url: '钉钉Webhook地址'
    send_resolved: true
    headers: { "Content-Type": "application/json" }
    body: '{{ template "dingtalk.message" . }}'

5.3 配置验证

# 校验配置文件语法
alertmanager --config.check-config alertmanager.yml

# 重启服务生效
pkill alertmanager
nohup ./alertmanager --web.listen-address=:9093 --config.file=alertmanager.yml

5.4 常见问题排查

  • 告警发送失败:检查服务器外网连通性、Webhook地址正确性、消息是否包含自定义关键词;

  • 无恢复通知:确认 send_resolved: true 已开启;

  • 消息格式异常:检查模板文件语法、JSON格式合法性。

(注:文档部分内容可能由 AI 生成)

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐