prometheus 原理(架构,promql表达式,描点原理)

news/2024/5/18 21:27:27 标签: prometheus, grafana, promql, 性能监控, 指标, metric, 云原生

大家好,我是蓝胖子,提到监控指标,不得不说prometheus,今天这篇文章我会对prometheus 的架构设计,promql表达式原理和监控图表的绘图原理进行详细的解释。来让大家对prometheus的理解更加深刻。

架构设计

先来看看,prometheus的架构设计,明白指标的采集方式,存储方式,查询方式。

指标采集方式

指标的采集方式有两种,推(push)和拉(pull)。

prometheus提供了各种exporter,暴露了指标路由,prometheus server可以从指标路由获取该exporter的指标。这边是拉模式。

推送模式是进程主动将指标推送给prometheus服务器,但是在架构设计上并不是直接推送的,如下,是prometheus官网的架构图。推送的指标是推送给了pushgateway,然后prometheus server 从推送网关上面拉取指标信息。像短时定时任务我们可以采用推送模式,推送定时任务相关的指标

Pasted image 20240228165123.png

存储方式

prometheus 对于指标的存储也是分为了两种,本地远程

prometheus内部提供了TSDB作为对时序数据的存储,同时它也提供了远程写接口,能够将数据写入远端服务器,例如clickhouse,influxdb等。

如果本地存储已经不能满足你的需求😌,那就用remote write吧,选用聚合性能更加的clickhouse或其他列式数据库。

查询方式

prometheus 查询方式除了读取本地的TSDB数据库,也可以配置remote read,远程读,这样能直接从远端读取时序数据。

远程读写的方式相当于prometheus帮助我们对接了远程存储器的存储和查询协议,而我们只用和prometheus打交通即可。

promql__32">promql 表达式原理

接着介绍下,使用prometheus 时,用到的promql语句,我们通过promql语句从prometheus中对指标进行查询和聚合。

promql表达式中有四种数据类型

  • Instant vector - 瞬时向量,指的是有相同时间戳的时间序列,因为在同一时刻会有多个指标的样本值产生,所以这里时间序列是多个。
  • Range vector - 范围向量,和瞬时向量不同,这里的时间序列筛选的范围不再是单个的时间戳,而是一个时间范围,指代的是在某个时间范围内的时间序列。
  • Scalar - 数值类型,浮点型
  • String - 字符串类型

我们来看下prometheus 中对函数的描述来更加形象化的理解这几张表达式的数据类型。

floor()prometheus.io/docs/prometheus/latest/querying/functions/#floor" rel="nofollow">

floor(v instant-vector) rounds the sample values of all elements in v down to the nearest integer.

可以看到floor 的参数要求传递的是瞬时向量,接着对于传递的瞬时向量中的每个指标都会执行floor 向下取最接近的整数 这样的逻辑。floor函数返回的结果是瞬时向量,也就是相同时间戳,每个时间序列会有一个向下取整后的value值。

rate()prometheus.io/docs/prometheus/latest/querying/functions/#rate" rel="nofollow">

rate(v range-vector) calculates the per-second average rate of increase of the time series in the range vector.

再来看下对rate函数的描述,rate函数要求传递的参数是范围向量,在promql语句中范围向量的写法是在指标后跟上[],例如 http_requests_total{job=“api-server”}[5m]代表指标名http_requests_total 中job标签是 api-server 的过去5分钟中内的样本。

rate函数的返回是瞬时向量Instant vector

❗️❗️❗️在使用promql表达式画图时,要注意,promql表达式只有最后的结果是即时向量才可以画图。

既然讲到了画图,我们就顺势将prometheus的画图描点的原理介绍下。

描点原理

我们在绘图的时候通常是选择一段时间范围,那么prometheus在收到这个时间范围的时候,如何根据请求的promql语句来绘制图表呢?

prometheus会将整个时间段按step或者也可以叫做interval得到不同的时间戳,这个参数也是用户在绘图的时候传递的。

基于每个时间戳得到每个时间序列的一个描点,得到描点的逻辑则是通过时间戳和promql表达式得到相同时间戳的时间序列值也就是瞬时向量。

最后我再介绍下grafna在绘图的时候两个关于时间范围的选项,作为科普。

grafana__76">grafana 描点选项配置

当前时间为now,假设为11点半点

relative time 选择 1h,那么界面展示的数据为10点半到11点半的数据。

Pasted image 20240227112910.png

选择timeshift则是将面板的结束时间从11点半变为10点半,面板还是按默认的时间间隔显示数据

Pasted image 20240227113008.png


http://www.niftyadmin.cn/n/5417777.html

相关文章

Rust 中有哪些实现了 std::error::Error 的类型?

在 Rust 中,std::error::Error trait 被许多内置类型和第三方库中的类型所实现。以下是一些实现了 std::error::Error trait 的常见类型: 内置类型 std::io::Error:用于表示 I/O 操作中的错误,如文件读写错误或网络操作错误。 s…

使用docker搭建chromium

使用Docker CLI 首先,你需要确保已经安装了Docker。以下是使用Docker命令行界面(CLI)搭建linuxserver/chromium的步骤: 拉取linuxserver/chromium镜像: docker pull linuxserver/chromium这将从Docker Hub上拉取最新的…

考虑局部遮阴的光伏PSO-MPPT控制MATLAB仿真

微❤关注“电气仔推送”获得资料(专享优惠) 简介 光伏电池阵列的输出特性曲线不是线性变化的。当光伏电池遮荫时,产生的功 率会不断变化,致使光伏电池阵列的输出功率不断变化,其输出特性曲线呈现多峰值的现象。 多峰…

关于Linux上的$ORIGIN解说

1、Linux RPATH & $ORIGIN 许多现代C / C 项目都利用Autotools创建GNU构建系统,例如 根据平台生成make文件。 可执行文件(二进制文件)在生成/编译过程中生成,并且可以在执行编译的计算机上本地执行。 但是,如果将…

滴滴一面:Keepalived+Nginx高可用,如何实现IP跳跃?(1)

尼恩说在前面 HashMap的工作原理是目前java面试问的较为常见的问题之一,在40岁老架构师 尼恩的读者交流群(50)中,最近有小伙伴拿到了一线互联网企业如得物、阿里、滴滴、极兔、有赞、shein 希音、百度、网易的面试资格,遇到很多很重要的面试…

LeetCode刷题——146. LRU 缓存(HOT100)

✊✊✊🌈大家好!最近有面试会考LRU题,所以本篇文章将较详细介绍该题目146. LRU 缓存,代码语言为:C代码😇。 🎡导航小助手🎡 394. 字符串解码🔒1、题目:☀️2、…

「AI工程师」数据处理与分析-工作指导

工作指导书 一、工作职责 负责数据的收集、清洗、整合和处理,确保数据质量和准确性。进行数据分析和挖掘,提取有价值的信息,为业务决策提供支持。构建和维护数据处理和分析的流程和工具,提高数据处理效率。与其他团队成员合作,共同解决数据处理和分析过程中遇到的问题。二…

oracle 获取两个时间相差天数,以及指定一个日期相差天数后的日期

1、获取两个时间相差天数 -- 两个日期相差天数 select (trunc(TO_DATE( 2024-02-28, YYYY-MM-DD ) -TO_DATE( 2024-02-25, YYYY-MM-DD ) )1) from dual2、获取日期减去指定天数后的时间 -- 两个日期相差天数的日期 select (TRUNC(TO_DATE( 2024-02-25, YYYY-MM-DD )- (trunc…