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 核心特性
-
多维度数据建模与查询,支持通过多维度标签筛选、统计监控数据;
-
内置灵活的PromQL查询语言,同时提供HTTP查询接口,适配第三方可视化工具;
-
无分布式存储依赖,单节点独立运行,本地时序数据库支持每秒百万级数据存储,可对接第三方时序数据库扩展存储;
-
默认基于HTTP协议的Pull(拉取)模型采集指标,降低监控与被监控服务耦合度;
-
支持Push(推送)模型,可通过PushGateway中间网关适配短生命周期任务数据上报;
-
支持服务发现、静态配置两种方式自动识别监控目标;
-
原生支持基础图表展示,完美兼容Grafana实现专业可视化;
-
高可用、高可靠,故障场景下仍可正常查询历史监控数据,适配运维故障排查场景。
1.4 核心监控原理
Prometheus Server为核心服务,会定时向被监控目标(主机、服务、容器)发起HTTP请求,抓取目标暴露的 /metrics 接口指标数据。所有监控数据以时序格式存储,支持后续查询、聚合、告警触发。
Pull模型核心优势:被监控端无需感知监控服务,完全独立运行;避免大量终端同时推送数据导致监控端过载;配置简单、扩展性强、耦合度低,杜绝推送失败引发的业务故障。
1.5 配置文件六大核心配置段
Prometheus采用模块化配置,六大核心配置段可自由组合,适配不同监控场景,核心配置用途如下:
| 组合配置段 | 核心用途 |
|---|---|
| 采集配置段(scrape_configs) | 基础数据采集,数据仅存储本地 |
| 采集配置+远程写入(remote_write) | 数据本地存储+同步远端时序数据库 |
| 远程查询(remote_read) | 纯查询远端存储的监控数据 |
| 采集配置+远程查询 | 同时查询本地、远端存储数据 |
| 采集配置+告警配置+Alertmanager | 本地数据触发告警,推送至Alertmanager |
| 远程查询+告警配置+Alertmanager | 基于远端数据触发远程告警 |
| 远程读写+预聚合配置 | 预聚合指标,结果同步至远端存储 |
完整基础配置示例(prometheus.yml)
yaml
# 全局配置段
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 安装启动
bash
# 下载安装包
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 被监控端部署启动
bash
# 下载解压
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,新增远端主机采集规则:
yaml
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环境准备与授权
bash
# 安装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
bash
# 下载解压
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 服务端添加监控配置
yaml
- job_name: 'mysql'
static_configs:
- targets: ['192.168.166.13:9104']
重启Prometheus后,即可采集MySQL连接数、锁、性能指标等数据。
2.5 容器快速部署Prometheus
bash
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 物理机部署
bash
# 安装企业版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 基础初始化配置
-
汉化设置:登录后进入系统设置,切换界面语言为中文;
-
添加Prometheus数据源 :Data Sources → Add data source → 选择Prometheus → 填写Prometheus服务地址
http://IP:9090→ 保存测试; -
仪表盘模板导入:支持自定义绘制图表,也可从官方模板库(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邮件推送告警:
ini
[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 部署启动
bash
# 解压部署
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 邮件告警完整配置
yaml
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地址与告警规则文件路径:
yaml
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使用率告警
yaml
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 内存使用率告警
yaml
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 磁盘空间告警
yaml
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连接数告警
yaml
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 前期准备
-
钉钉群创建自定义机器人,勾选自定义关键词(如Alertmanager);
-
复制机器人Webhook地址:
https://oapi.dingtalk.com/robot/send?access_token=xxx; -
确保服务器可正常访问钉钉外网接口。
5.2 Alertmanager 钉钉告警配置
5.2.1 基础Webhook配置
yaml
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格式告警消息:
go
{{ 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中引用模板:
yaml
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 配置验证
bash
# 校验配置文件语法
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 生成)