文章目录
- Prometheus 相关概念
- Prometheus 的特点
- Prometheus 架构
- 数据模型 Datemode
- 使用场景
- 指标类型 Metric type
- 适用场景
- 作业和实例 Jobs and instances
- 使用场景
- Prometheus 安装
- Prometheus 配置
- prometheus
- alertmanager
- Grafana 可视化
- Grafana 安装
- Grafana 配置选项
- Grafana UI
- PromQL
- 使用位置
- 样例
- 格式
Prometheus 相关概念
Prometheus 是一个开源系统监控和警报工具包
Prometheus 的特点
- 多维数学模型:基于时间序列的数据模型,每个时间序列由度量名称和键值对标签组成
- PromQL 查询:Prometheus特有的查询语言,可让用户实时选择和聚合时间序列数据,并且表达式结果可显示为图形
- 无分布式存储:不依赖分布式存储,单个服务器节点是自主的
- 采用拉取模式:通过HTTP主动从目标处拉取指标数据
- 可视化选项丰富:Prometheus内置 UI,并支持 Grafana 等可视化工具,支持多种图形和仪表盘
与Prometheus类似的监控系统有:
- Nagios:传统的IT基础设施监控工具。
- Zabbix:企业级的分布式监控解决方案。
- Graphite:专注于时间序列数据存储和图形化。
- InfluxDB:专门为时间序列数据设计的数据库,常与Telegraf结合使用。
- Sensu:云原生监控工具,支持自动发现和动态环境。
- Datadog:SaaS 型监控平台,提供全面的基础设施和应用程序监控。
Prometheus相较于其他监控系统的优势:
- 安装配置简单:安装和使用都相对简单,配置文件使用
YAML
格式 - 数据模型丰富:数据查询和聚合更加灵活和高效
- 专注于高性能:专注于监控和告警,而不是试图成为全能型解决方案,使得它在特定领域表现极为出色,可以每秒处理数百万个指标
- 云原生更好支持:与 Kubernetes 等容器编排系统有很好的集成,支持服务发现
Prometheus 架构
Prometheus 的架构与其他一些生态组件
metrics 是指标的意思
图片中间部分:
- Prometheus Server:
- 核心组件,负责数据的采集、存储和查询
- Retrieval:检索,负责从目标拉去指标数据
- TSDB (Time Series Database) :时间序列数据库,用于存储所有采集到的时间序列数据
- HTTP server:HTTP服务器,用于提供 API 接口,用于数据查询等接口操作
- Service discovery:
- kubernetes:自动发现 Kubernetes 集群中的监控目标
- file_sd:基于文件的服务发现,用于静态配置监控目标
- Node:
- 表示运行 Prometheus 服务器的物理或者虚拟服务器
- HDD/SSD:存储 TSDB 数据的硬盘
图片左侧部分:
- Prometheus Targets:
- 通常是长期运行的服务或应用程序
- 暴露 HTTP 接口提供 Prometheus 抓去指标数据
- Jobs/exporters:被监控的目标(服务器、应用程序等)
- Pushgateway:
- 用于接收短期作业的指标推送
- 允许那些无法被 Prometheus 直接拉取的作业推送它们的指标数据
- Short-lived jobs:
- 生命周期较短的作业,难以被 Prometheus 直接拉取
- 在作业退出时将指标推送到 Prometheus
图片右侧部分:
- Data Visualization and Export:
- Prometheus Web UI:Prometheus内置的简单用户界面
- Grafana:Prometheus更好的可视化工具
- API clients:使用 Prometheus API 的客户端应用程序
- PromQL:
- Prometheus 查询语言,用于查询和聚合时间序列数据
- Alertmanager:
- 处理由 Prometheus 服务器发送的警报
- 对警报进行分组、去重,并路由到正确的接收方式(如 PagerDuty、Email 等)
关于Prometheus Targets与Pushgateway:
Pormetheus Targets:
作用:
- 是 Prometheus 直接抓取指标数据的目标
- 通常是长期运行的服务或应用程序
特点:
- 暴露 HTTP 端点(通常是 /metrics),Prometheus 定期从这个端点拉取数据
- 被动等待 Prometheus 来抓取数据
适用场景:
- 持续运行的服务,如 web 服务器、数据库、应用服务器等
- 能够持续暴露最新指标的系统
- 适合大多数标准的监控场景
Pushgateway:
作用:
- 作为中间人接收来自短期作业的指标推送
- 存储这些指标,知道 Prometheus 来抓取
特点:
- 主动接收来自客户端推送的指标数据
- 允许短期作业在完成时推送它们的指标
适用场景:
- 短期作业或者批处理任务
- 防火墙后不能直接被 Prometheus 访问的作业
- 需要汇总多个源数据后再提供给 Prometheus 的场景
区别 | Prometheus Targets | Pushgateway |
---|---|---|
数据流向 | 被动等待拉取 | 主动接收推送 |
持久性 | 长期运行 | 处理短期作业 |
数据新鲜度 | 最新数据 | 存储旧数据,直到被覆盖 |
复杂度 | 简单直接 | 额外的组件和复杂性 |
无法被 Prometheus 直接拉取的作业示例:
- 批处理作业:如夜间数据处理、定期报告生成等
- CI/CD 流水线中的构建作业
- 定期备份任务
- 防火墙后的内部服务,Prometheus 无法直接访问
- 短期的云函数或 serverless 任务
- 分布式系统中的临时工作节点
- 离线数据处理任务,如 ETL 作业
- 定期维护脚本或系统检查
- 动态扩缩容的实例,可能在 Prometheus 下一次抓取前就已经消失。
- 需要聚合多个微服务数据的场景,where 个别微服务可能短暂不可用
以上场景需要使用 Pushgateway
数据模型 Datemode
Prometheus官网介绍:https://prometheus.io/docs/concepts/data_model/
Prometheus 的数据模型基于时间序列。每个时间序列的组成:
- 指标名称(Metirc name):描述被测量的系统特征(例如
http_requests_total
) - 标签对(Label pairs):键值对的形式,用于进一步区分指标的不同维度(例如
method="POST"
,status="200"
) - 时间戳(Timestamp):数据点的采集时间
- 样本值(Sample value):在特定时间点测量的数值
示例:
http_requests_total{method="POST",status="200"} 1234 1600781977
使用场景
- 需要存储和查询随时间变化的数据
- 需要对数据进行多维度分析
指标类型 Metric type
Prometheus官网介绍:https://prometheus.io/docs/concepts/metric_types/
四种指标类型:
- 计数器(Counter):单调递增的累计值
- 仪表盘(Gauge):可以上下波动的瞬时值
- 直方图(Histogram):对观察值进行采样,提供总和和观察次数
- 摘要(Summary):类似直方图,但提供基于滑动窗口的分位数计算
适用场景
- Counter: 用于累积值,例如:请求总数、错误总数
- Gauge: 用于可变值,例如:当前温度、内存使用量
- Histogram: 用于需要分布情况的数据,例如:响应时间分布
- Summary: 用于需要准确百分位数的场景,例如:请求持续时间的第 90 百分位
作业和实例 Jobs and instances
Prometheus官网介绍:https://prometheus.io/docs/concepts/jobs_instances/
- 作业(Job):一组执行相同任务的实例集合
- 实例(Instance):一个可以被抓取的端点,通常对应一个单独的进程
在 yaml
文件中 Prometheus 自动为每个抓取的目标添加这些标签:
- job:配置的作业名称
- instance:被抓取的目标 <host>:<port>
示例 yaml
配置:
scrape_configs:- job_name: 'node exporter'static_configs:- targets: ['192.168.84.10:9100', '192.168.84.11:9100', '192.168.84.12:9100']
使用场景
- 需要对多个相似的目标进行分组和管理
- 需要区分相同服务的不同实例
Prometheus 安装
此处以三台 CentOS 9 虚拟机为例:
虚拟机安装推荐文章:Linux CentOS9安装配置-CSDN博客
虚拟机固定 IP | 主机名 |
---|---|
192.168.84.10 | node1 |
192.168.84.11 | node2 |
192.168.84.12 | node3 |
Prometheus组件下载地址:https://prometheus.io/download/
需要下载的组件:
组件 | 介绍 |
---|---|
prometheus | Prometheus监控系统与时间序列数据库 |
node_exporter | 机器指标导出器 |
pushgateway | 用于临时和批量作业的推送接受器 |
alertmanager | Prometheus 警报管理器 |
介绍都是官方直译
- 在 node1 节点上上传解压这四个组件(此处对组件进行了重命名,去除了
.linux-amd64
后缀)
- 进入 prometheus 组件目录
其中 prometheus.yml
是它的配置文件(由后缀可以看出改配置文件使用的是 yaml 语法),默认内容为:
# my global config
global:scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.# scrape_timeout is set to the global default (10s).# Alertmanager configuration
alerting:alertmanagers:- static_configs:- targets:# - alertmanager:9093# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:# - "first_rules.yml"# - "second_rules.yml"# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.- job_name: "prometheus"# metrics_path defaults to '/metrics'# scheme defaults to 'http'.static_configs:- targets: ["localhost:9090"]
- 将
scrape_configs
模块中static_configs
的targets
内容localhost
改为 node1 IP或主机名(需注意是否配置主机名映射)
scrape_configs:# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.- job_name: "prometheus"# metrics_path defaults to '/metrics'# scheme defaults to 'http'.static_configs:- targets: ["192.168.84.10:9090"]
- 通过
pushgateway
组件获取数据,需要在prometheus.yml
文件scrape_configs
中配置相关job_name
:
注意修改 IP 地址,默认端口为 9091
- job_name: 'pushgateway'static_configs:- targets: ['192.168.84.10:9091']labels:instance: pushgateway
- 第一部分:通过
node_export
组件获取数据,需要在prometheus.yml
文件中配置相关job_name
:
从 node1、node2、node3 三台节点拿取数据
注意 node1、node2、node3 IP 地址,默认端口为9100
- job_name: 'node exporter'static_configs:- targets: ['192.168.84.10:9100', '192.168.84.11:9100', '192.168.84.12:9100']
- 第二部分:将
node_exporter
分发到 node2、node3
#分发给node2
scp -r /home/fishpie/apps/node_exporter-1.8.2 root@192.168.84.11:/home/fishpie/apps
#分发给node3
scp -r /home/fishpie/apps/node_exporter-1.8.2 root@192.168.84.11:/home/fishpie/apps
或是在node2、node3下载安装 node_exporter-1.8.2
- 在 node1、node2、node3 启动
node_exporter-1.8.2
,在 node1 启动prometheus
为了使 node_exporter
与 prometheus
服务做到开机自启动与监控中断后自动重启,我们可以将其作为一个系统服务并设置为开机自启动(类似于会自动重启的 nohup)
- 第一步:node1、node2、node3 禁用 SELinux:
sudo vim /etc/selinux/config
将文件内 SELINUX 参数改为 disabled
,如下图
node1、node2、node3 重启系统使修改生效
sudo reboot
- 第二步:node1 创建
prometheus
服务文件
sudo vim /etc/systemd/system/prometheus.service
添加以下内容,注意改为自己的 prometheus
命令位置、prometheus.yml
位置, User
为自己系统的用户
[Unit]
Description=Prometheus
Wants=network-online.target
After=network-online.target[Service]
User=fishpie
ExecStart=/home/fishpie/apps/prometheus-3.0.0/prometheus --config.file=/home/fishpie/apps/prometheus-3.0.0/prometheus.yml
Restart=always[Install]
WantedBy=multi-user.target
- 第三步:node1、node2、node3 创建
node_exporter
服务文件
sudo vim /etc/systemd/system/node_exporter.service
添加一下内容,注意修改自己 node_exporter
命令
[Unit]
Description=Node Exporter
Wants=network-online.target
After=network-online.target[Service]
User=fishpie
ExecStart=/home/fishpie/apps/node_exporter-1.8.2/node_exporter
Restart=always[Install]
WantedBy=multi-user.target
- 第四步:重新加载 systemd 管理器配置,在 node1、node2、node3 节点执行
sudo systemctl daemon-reload
- 第五步:启动服务
node1上:
sudo systemctl start prometheus
sudo systemctl start node_exporter
node2、node3上:
sudo systemctl start node_exporter
- 第六步:检查服务状态
node1上:
sudo systemctl status prometheus
sudo systemctl status node_exporter
node2、node3上:
sudo systemctl status node_exporter
如果 prometheus
和 node_exporter
服务正常则会显示:
- 第七步:确认无误后设为服务开机自启动
node1:
sudo systemctl enable prometheus
sudo systemctl enable node_exporter
node2、node3:
sudo systemctl enable node_exporter
- 访问网页
192.168.84.10:9090
查看Target
运行状态
找到 Target 如果正常则会有一下页面
如果出现:
Error scraping target: Get “http://192.168.84.11:9100/metrics”: dial tcp 192.168.84.11:9100: connect: no route to host
则需要检查自己的防火墙是否关闭或者 9100
端口是否放行
- 如果有需要启动
pushgateway
的情况
node1 在 pushgateway
目录下执行 :
nohup ./pushgateway --web.listen-address :9091 > ./pushgateway.log 2>&1 &
后台运行 pushgateway
此时我们的 pushgateway
就是 up 状态了
- 如果有需要启动
alertmanager
的情况
node1 在 alertmanager
目录下执行:
nohup ./alertmanager --config.file=alertmanager.yml > ./alertmanager.log 2>&1 &
Prometheus 配置
prometheus_526">prometheus
- 目录内容
prometheus.yaml
是 Prometheus 服务器的主要配置文件,定义了 Prometheus 如何收集指标、管理数据、配置告警等所有核心行为
prometheus.yaml
使用 YAML 格式,支持动态重载
- prometheus 配置文件
prometheus.yaml
默认内容:
# my global config
global:scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.# scrape_timeout is set to the global default (10s).# Alertmanager configuration
alerting:alertmanagers:- static_configs:- targets:# - alertmanager:9093# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:# - "first_rules.yml"# - "second_rules.yml"# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.- job_name: "prometheus"# metrics_path defaults to '/metrics'# scheme defaults to 'http'.static_configs:- targets: ["192.168.84.10:9090"]- job_name: 'pushgateway'static_configs:- targets: ['192.168.84.10:9091']labels:instance: pushgateway- job_name: 'node exporter'static_configs:- targets: ['192.168.84.10:9100', '192.168.84.11:9100', '192.168.84.12:9100']
以上配置文件分为四个大模块:
- 全局配置(global):
global:scrape_interval: 15sevaluation_interval: 15s
scrape_interval
:设置全局默认的数据抓去间隔evaluation_interval
:设置规则评估时间(告警检查的时间)
- Alertmanager 配置(alerting):
alerting:alertmanagers:- static_configs:- targets:# - alertmanager:9093
- 用于配置 Alertmanager ,配置信息中
alertmanager
填为安装启动了alertmanager
的主机名或IP
- 规则文件(rule_files):
rule_files:# - "first_rules.yml"# - "second_rules.yml"
- 用于指定告警规则和记录规则文件
- 抓取配置 (scrape_configs) 注意缩进问题:
- job_name: "prometheus"static_configs:- targets: ["192.168.84.10:9090"]
- 定义了 Prometheus 从哪些目标收集指标,此处配置为 Prometheus 抓去自己的指标,监控地址为
192.168.84.10:9090
- job_name: 'pushgateway'static_configs:- targets: ['192.168.84.10:9091']labels:instance: pushgateway
- 配置抓取 Pushgateway 的指标,地址为
192.168.84.10:9091
- 添加了一个自定义标签
instance: pushgateway
自定义标签
instance: pushgateway
的作用:
- 标识:这个标签帮助唯一标识这个特定的 Pushgateway 实例
- 查询和过滤:在 Prometheus 的查询语言 PromQL 中,你可以使用这个标签来过滤或选择特定的指标,例如使用查询
{instance="pushgateway"}
来选择所有来自这个 Pushgateway 的指标- 区分数据源:在多个数据源的情况下,这个标签可以区分哪些指标是 Pushgateway 的
- 可视化部分:这个标签可以帮助在 Grafana 等可视化工具组织和过滤仪表板
- job_name: 'node exporter'static_configs:- targets: ['192.168.84.10:9100', '192.168.84.11:9100', '192.168.84.12:9100']
- 配置抓取三个 Node Exporter 实例的指标,分别位于三个不同的 IP 地址上
alertmanager
- 目录内容
alertmanager 配置文件为
alertmanager.yml
采用 YAML语法
- alertmanager 配置文件
alertmanager.yml
默认内容:
route:group_by: ['alertname']group_wait: 30sgroup_interval: 5mrepeat_interval: 1hreceiver: 'web.hook'
receivers:- name: 'web.hook'webhook_configs:- url: 'http://127.0.0.1:5001/'
inhibit_rules:- source_match:severity: 'critical'target_match:severity: 'warning'equal: ['alertname', 'dev', 'instance']
alertmanager.yml
配置文件由三个大模块构成:
- route(路由):
route:group_by: ['alertname']group_wait: 30sgroup_interval: 5mrepeat_interval: 1hreceiver: 'web.hook'
-
group_by
: 按 ‘alertname’ 对告警进行分组 -
group_wait
: 在发送分组的第一个告警前等待 30 秒,允许收集更多相关告警 -
group_interval
: 发送同一组的后续告警的间隔为 5 分钟 -
repeat_interval
: 如果告警持续存在,每 1 小时重复发送一次 -
receiver
: 指定默认接收者为 ‘web.hook’(由以下 receiver 定义)
- reveivers(接受者):
receivers:- name: 'web.hook'webhook_configs:- url: 'http://127.0.0.1:5001/'
- 定义了一个名为 ‘web.hook’ 的接收者,并将告警发送到
http://127.0.0.1:5001/
- 接受者可以定义多个
- inhibit_rules(抑制规则)
inhibit_rules:- source_match:severity: 'critical'target_match:severity: 'warning'equal: ['alertname', 'dev', 'instance']
- 当存在严重级别为 ‘critical’ 的告警时,抑制严重级别为 ‘warning’ 的相关告警
- ‘alertname’、‘dev’ 和 ‘instance’ 标签必须相同才会触发抑制
Grafana 可视化
Prometheus 官方推荐的可视化操作界面,使用 Grafana 需要有以下两个必需组件:
- prometheus
- node_exporter
Grafana 安装
两种方法可以为 Grafana 配置 Prometheus。可以使用 Grafana Cloud 上托管的 Grafana 实例或在本地运行 Grafana ,此处选择本地运行 Grafana
也可以选择安装 Windows 客户端 ,此处选择在 Linux 安装
Grafana 安装包地址:https://grafana.com/grafana/download
此处选取两种安装方式:
- 独立 Linux 二进制文件,在需要的安装目录
wget https://dl.grafana.com/enterprise/release/grafana-enterprise-11.2.0.linux-amd64.tar.gztar -zxvf grafana-enterprise-11.2.0.linux-amd64.tar.gz
- yum 安装,能自动作为系统服务,不需要再手动配置(推荐)
sudo yum install -y https://dl.grafana.com/enterprise/release/grafana-enterprise-11.2.0-1.x86_64.rpm
此处我们采用 yum 安装
如果 grafana
使用 YUM 正常安装,则在输入
whereis grafana
后会以下显示
Grafana 配置选项
Grafana 完整配置文档:https://grafana.com/docs/grafana/latest/setup-grafana/configure-grafana/
Grafana 后端在其配置文件中定义了许多配置选项(在 Linux 系统上通常位于/etc/grafana/grafana.ini)
如图
现在我们编辑这个 grafana.ini
文件
大多数情况下,默认配置就足够了。只有在需要特定设置时才需要修改
修改配置后一定要重启Grafana服务以使更改生效
一定备份原始的 grafana.ini 文件!
sudo vim /etc/grafana/grafana.ini
- 更改 HTTP 端口(默认为 3000)
[server]
http_port = 3000
- 设置根 URL(如果Grafana在反向代理后面)
[server]
root_url = http://这里的汉字改为你的域名/grafana
# 根据自己的代理路径进行更改
- 配置数据库(默认使用 SQLite)
[database]
type = mysql
host = <数据库的地址>:3306
name = <你的数据库名称>
user = <你的数据用户>
password = <你的数据库密码>
- 配置 Grafana 的用户名和密码
[security]
admin_user = <自己设置用户名>
admin_password = <自己设置密码>
- 配置日志
[log]
mode = console file
level = info
修改完配置后,保存退出文件并启动 Grafana 服务
#启动 grafana服务
sudo systemctl start grafana-server
#平滑重启 grafana 服务
sudo systemctl restart grafana-server
Grafana UI
作者是在 node1 节点(192.168.84.10)安装配置的 Grafana
如果上述步骤正确完成,则在访问 http://192.168.84.10:3000/ 会有
此处输入自己设置的 用户名 和 密码 即可进入 Grafana 监控页面
添加 Prometheus 数据源
选择 Prometheus 数据源
设置 Prometheus 所在 URL
下拉保存
创建仪表盘
创建新的仪表盘
查看 CPU 使用情况
一些常见的监控项目指标:
系统资源:
- CPU使用率:
node_cpu_seconds_total
- 内存使用:
node_memory_MemTotal_bytes - node_memory_MemFree_bytes
- 磁盘使用:
node_filesystem_free_bytes
- 网络流量:
node_network_receive_bytes_total
,node_network_transmit_bytes_total
应用性能:
- HTTP请求率:
http_requests_total
- 请求延迟:
http_request_duration_seconds
- 错误率:
http_requests_total{status=~"5.."} / http_requests_total
数据库指标:
- 连接数:
mysql_global_status_threads_connected
- 查询性能:
mysql_global_status_queries
容器和编排指标(如果使用Kubernetes):
- 容器CPU使用:
container_cpu_usage_seconds_total
- 容器内存使用:
container_memory_usage_bytes
更用法请详见官方文档:https://grafana.com/docs/grafana/latest/panels-visualizations/visualizations/time-series/
现成的仪表盘:https://grafana.com/grafana/dashboards/
PromQL
PromQL(Prometheus Query Language)是专为 Prometheus 设计的查询语言,用于从 Prometheus 数据库中提取、过滤和聚合监控数据
使用位置
-
Prometheus 自带 UI 中
-
在 Grafana 中
仪表盘中选择
样例
以下是一些常用的 PromQL 的使用样例:
- 返回所有 CPU 相关的时间序列
node_cpu_seconds_total
- 返回空闲 CPU 时间的时间序列
node_cpu_seconds_total{mode="idle"}
- 返回过去 5 分钟的空闲 CPU 时间数据
node_cpu_seconds_total{mode="idle"}[5m]
- 使用
rate()
函数返回过去 5 分钟内每秒的平均 CPU 空闲率
rate(node_cpu_seconds_total{mode="idle"}[5m])
- 使用
sum()
函数计算每个实例的总 CPU 使用率
sum(rate(node_cpu_seconds_total{mode!="idle"}[5m])) by (instance)
- 组合函数计算每个实例的 CPU 使用百分比
100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)
- 预测 4 小时后哪些实例的根分区可能耗尽空间
predict_linear(node_filesystem_free_bytes{mountpoint="/"}[1h], 4 * 3600) < 0
格式
可以看出 PromQL 有一些规律:
# 基本格式
<metric name>{<label matcher>}[<time range>]
-
<metric name>
: 指标名称 -
{<label matcher>}
: 可选的标签匹配器 -
[<time range>]
: 可选的时间范围选择器
标签匹配器格式:
{label1="value1", label2=~"regex2", label3!="value3"}
-
=
: 精确匹配 -
!=
: 不等于 -
=~
: 正则匹配 -
!~
: 正则不匹配
更多细节详见:https://prometheus.io/docs/prometheus/latest/querying/basics/
Prometheus 官网:https://prometheus.io/
Grafana 文档:https://grafana.com/docs/grafana/latest/getting-started/get-started-grafana-prometheus/
Grafana 仪表盘:https://grafana.com/grafana/dashboards/