2025-02-25-Tue-T-Prometheus+Grafana
1. Promethues 简介
Prometheus 是由前 Google 工程师从 2012 年开始在 Soundcloud 以开源软件的形式进行研发的系统监控和告警工具包,自此以后,许多公司和组织都采用了 Prometheus 作为监控告警工具。Prometheus 的开发者和用户社区非常活跃,它现在是一个独立的开源项目,可以独立于任何公司进行维护。为了证明这一点,Prometheus 于 2016 年 5 月加入 CNCF 基金会,成为继 Kubernetes 之后的第二个 CNCF 托管项目。Prometheus 是由前 Google 工程师从 2012 年开始在 Soundcloud 以开源软件的形式进行研发的系统监控和告警工具包,自此以后,许多公司和组织都采用了 Prometheus 作为监控告警工具。Prometheus 的开发者和用户社区非常活跃,它现在是一个独立的开源项目,可以独立于任何公司进行维护。为了证明这一点,Prometheus 于 2016 年 5 月加入 CNCF 基金会,成为继 Kubernetes 之后的第二个 CNCF 托管项目。
1.1 Promethues特点
- 易于管理
- Prometheus核心部分只有一个单独的二进制文件,不存在第三方依赖(数据库,缓存等)。唯一需要的就是本地磁盘,因此不会出现级联故障等风险
- Promethues的
pull模型的架构方式,可以在任何地方(本地电脑,开发环境,测试环境)搭建所需的监控系统 - 对于复杂情况,可以使用Prometheus的
服务发现(Service Discovery)能力动态管理监控目标。 (例如对于新扩展的服务器,自动开始监控)
- 监控服务的内部运行状态
- Prometheus鼓励用户监控服务的内部状态, 基于promethues丰富的Client库。用户可以轻松地在应用程序中添加对Prometheus的支持。从而让用户可以获取应用内部真正的状态。
- 强大的数据模型
- 所有采集的监控数据均以指标(metric)的形式保存在内置的时间序列数据库当中(TSDB)。所有的样本除了基本的指标名称外,还有一组用于描述该指标的标签
# 指标名称(metric){标签}
http_request_status{code="200",content_path="/api/path",enviroment="production"}
- 强大的查询语言PromQL
- Promethues内置了强大的数据查询语言PromQL。通过PromQL可以实现对监控数据的查询、聚合。同时PromQL也被应用于数据可视化(如Grafana)以及告警中。
- 通过PromQL可以回答类似于如下问题:
- 过去一段时间中,95%应用延迟时间的分布范围?
- 预测4小时后,磁盘空间占用大致会是什么情况
- CPU占用率前5位的服务
- 高效
- 对于监控系统而言,大量的监控任务必然导致有大量的数据产生。而Promethues可以高效地处理这些数据,对于单一的Prometheus server实例而言,它可以处理:
- 数百万的监控指标
- 每秒处理数十万的数据点
- 可扩展
- 可以在每个数据中心,每个团队运行独立的Promethues Server,Promethues对于联邦集群的支持,可以让多个Promethues实例产生一个逻辑集群。当单实例Prometheus server处理的任务量过大时, 通过使用功能分区(sharding)+联邦集群(federation)可以对其进行扩展。
- 易于集成
- 使用promethues可以快速地搭建监控服务,并且可以非常方便地在应用程序中进行集成。 目前支持:JAVA,JMX,Python,GO,Rust,.Net,Node.js等语言的客户端SDK。基于这些SDK可以快速地让应用程序纳入到Promethues的监控当中,或者开发出自己的监控数据收集程序。
- 同时Promethues还支持与其他监控系统集成
- 可视化
Prometheus server中自带Prometheus UI, 可以方便地直接对数据进行查询,并且支持直接以图形化的形式展示数据。
1.2 Prometheus架构

采集层 ==> 存储计算层 ==> 应用展示层
1.2.1 采集层
采集层分为两类,一类是生命周期较短的任务,一类是生命周期较长的任务
- 短任务: 直接通过API,在退出时间指标推送给Pushgateway
- 长任务: Retrieval组件直接从Job或者Exporter拉取数据
1.2.2 存储计算层
- Prometheus Server:里面包含了存储引擎和计算引擎
- Retrieval: 取数组件,他会主动地从Pushgateway或者Exporter拉取指标数据
- Service Discovery: 可以动态地发现要监控的目标
- TSDB:数据核心存储与查询
- Http Server:对外提供HTTP服务
1.2.3 应用展示层
- AlertManager:对接Pagerduty,一套付费的监控报警系统
- 数据可视化: 对接Prometheus UI,Grafana
2. 安装与配置
2.1 安装
安装过程(以pushgateway为列)
# 1. 解压缩
tar -zxvf pushgateway-1.11.0.linux-amd64.tar.gz -C /opt/module
# 2. 配置
# 配置参考2.2
# 要使prometheus配置生效
kill -HUP 1
# kill -HUP 1 命令用于向 init 或 systemd 进程发送 HUP 信号,通知它重新加载配置文件或执行其他清理操作。HUP 信号的具体作用取决于系统的配置。
# 1代表prometheus的PID,不同情况下PID是不同的
# 3. 启动
nohup ./prometheus --config.file=prometheus.yml --web.listen-address=":9090" --storage.tsdb.path="data/" --web.enable-lifecycle --storage.tsdb.retention.time="15d"
# ./prometheus:执行 Prometheus 的二进制文件。
# --config.file=prometheus.yml:指定 Prometheus 的配置文件路径,通常命名为 prometheus.yml。
# 常用选项:
# --web.listen-address=":9090":设置 Prometheus Web 界面的监听地址和端口,默认为 :9090。
# --storage.tsdb.path="data/":设置时间序列数据库的存储路径,默认为 data/。
# --storage.tsdb.retention.time="15d":设置时间序列数据的保留时间,默认为 15d(15 天)。
# --web.enable-lifecycle:启用HTTP API的热加载功能。
nohup ./pushgateway --web.listen-address=":9091" --persistence.file="pushgateway.data" --persistence.interval=5m > ./pushgateway.log 2>&1 &
# --web.listen-address=":9091":设置 Pushgateway Web 界面的监听地址和端口,默认为 :9091。
# --persistence.file="pushgateway.data":设置持久化数据文件的存储路径,默认为 pushgateway.data。
# --persistence.interval=5m:设置持久化数据文件的保存间隔,默认为 5m(5 分钟)。
# > ./pushgateway.log。> 是 Linux 的输出重定向符号,用于将命令的标准输出(stdout)重定向到指定的文件。
# 2>&1 是 Linux 的错误输出重定向符号,用于将标准错误输出(stderr)重定向到标准输出。
# 2表示标准错误输出的文件描述符,1 表示标准输出的文件描述符。& 表示文件描述符。
# & 是 Linux 的后台运行符号,用于将进程放到后台运行。
# 在 Linux 和类 Unix 系统中,每个运行的进程都有三个默认的文件描述符:
# 0:标准输入(stdin):进程从这里读取输入,通常是键盘。
# 1:标准输出(stdout):进程向这里写入正常输出,通常是终端屏幕。
# 2:标准错误输出(stderr):进程向这里写入错误信息,通常也是终端屏幕。
# 2>&1 重定向标准错误输出:
# 2>&1 这部分将标准错误输出(文件描述符 2)重定向到文件描述符 1 所指向的位置。
# 由于文件描述符 1 已经指向了 file.log 文件,因此标准错误输出也被重定向到了 file.log 文件。
2.2 pushgateway配置
# 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'.
# node exporter获取长任务
static_configs:
- targets: ["localhost:9090"]
- job_name: "prome-ng"
static_configs:
- targets: ["prome-nginx:9100"]
# pushgateway获取短任务
- job_name: "pushgateway"
static_configs:
- targets: ["localhost:9091"]
labels:
instance: pushgateway
3. PromQL
Prometheus通过指标名称(metrics name) 以及对应的一组标签(labelset).唯一定义一条时间序列。指标名称反应了监控样本的基本标识,而label则在这个基本特征上为采集到的数据提供了多种特征维度。用户可以基于这些特征维度过滤、聚合、统计而产生新的计算后的一条时间序列。
PromQL是Promtheus内置的数据查询语言,其提供对时间序列数据丰富的查询,聚合以及逻辑运算能力的支持。并且广泛应用在Prometheus的日常应用当中。包括对数据查询、可视化、告警处理等
3.1 基本用法
3.1.1 查询时间序列
- 直接用监控指标名称查询:
prometheus_http_requests_total,等同于prometheus_http_requests_total{}
该表达式会返回指标名称为prometheus_http_requests_total的所有时间序列
PromQL还支持用户根据时间序列的标签匹配模式来对时间序列进行过滤,目前主要支持两种匹配模式:完全匹配和正则匹配
- 按标签过滤:
prometheus_http_requests_total{code="200"} - 使用正则表达式:
http_requests_total{path=~"^/api/v1/.*"}
3.2 范围查询[]
直接通过PromQL表达式prometheus_http_requests_total查询时,返回值只会包含该时间序列中的最新的一个样本值。 这样返回的结果成为瞬时向量。而相应的表达式称为瞬时向量表达式
如果想查询过去一段时间的样本数据,则需要使用区间向量表达式。区间向量表达式和瞬时向量表达式之间的差异在于区间向量表达式需要定义时间的范围。 时间范围通过时间范围选择器[]进行定义 。例如,通过以下表达式可以选择最近5分钟内的所有样本数据。
prometheus_http_requests_total{}[5m]
3.3 时间位移操作offset
在瞬时向量表达式或者区间向量表达式中, 都是以当前时间为基准:
prometheus_http_requests_total{}# 选择当前最新的数据prometheus_http_requests_total{}[5m]# 以当前时间为基准,5分钟内的数据
使用时间位移操作offset
prometheus_http_requests_total{} offset 5m#查询5分钟前的瞬时数据prometheus_http_requests_toatl{}[1d] offset 1d#查询一天前一天的区间样本数据
3.4 使用聚合操作sum
一般来说,如果描述样本特征的标签(label)在并非唯一的情况下,通过PromQL查询数据,会返回多条这些特征维度的时间序列。而PromQL提供的聚合操作可以用来对这些时间序列进行处理,形成一条新的时间序列。
# 查询系统所有http请求对总量
sum(prometheus_http_requests_total{})
# 按照mode计算主机CPU的平均使用时间
avg(node_cpu_seconds_total) by (mode)
# 按照主机查询各个主机的CPU使用率
sum(sum(irate(node_cpu_seconds_total{ mode!='idle'}[5m]))/ sum(irate(node_cpu_seconds_total{}[5m]))) by (instance)
3.5 标量和字符串
除了使用瞬时向量表达式和区间向量表达式外,PromQL还直接支持用户使用标量(Scalar)和字符串(String)
- 标量(Scalar): 一个浮点型的数字值
# 标量只有一个数字, 没有时序
10
# 需要注意,使用count(http_requests_total{})返回的数据类型,仍然是瞬时向量,需要使用scalar()将单个瞬时向量转化为标量
- 字符串(String): 一个简单的字符串值
# 直接使用字符串,作为PromQL,会直接返回字符串
"ok"
'this is a string'
3.6 合法的PromQL表达式
所有的PromQL表达式都必须包含一个指标名称(例如: http_request_total), 或者一个不会匹配到空字符串的标签过滤器(例如: {code="200"})
# 以下三种方式均为合法表达式
prometheus_http_requests_total
prometheus_http_requests_total{}
{code="200"}
# 以下表达式不合法
{job=~".*"}
除了使用{lable=value}的形式外,还可以使用内置的_name_标签来指定监控指标名称:
{_name_=~"prometheus_http_requests_total"}
4. Grafana
Grafana是一款采用go语言编写的开源应用, 主要用于大规模指标数据的可视化展现。 是网络架构和应用分析中最流行的时序数据展示工具,目前已经支持绝大部分常用的时序数据库。

浙公网安备 33010602011771号