首页 > 其他分享 >PromQL (Prometheus Query Language)进阶教程

PromQL (Prometheus Query Language)进阶教程

时间:2024-10-31 13:49:52浏览次数:3  
标签:http 进阶 Language request Prometheus 直方图 total 向量

Prometheus Query Language典型应用场景:在仪表板中可视化Prometheus数据、使用Prometheus的警报管理器构建警报规则等。了解如何构建PromQL是使用Prometheus的一项基本技能,通过上篇文章学习了基础知识,本文带你更深入学习并实践。

Prometheus metrics类型

我们已经知道,Prometheus将从各种exportor中获取的指标数据存储在时间序列数据库中。对于想要存储的度量,必须有标识符,还包括一些列标签,当然还有时间戳和收集数据。

  • 格式:Identifier -> ( timestamp1, value 1), ( t2,v2),…
  • 示例:http_request_total{job=”httpcollector”, method=”GET”, path=”/tesst’}

通过这些标签可以筛选指标。从技术上讲,指标存储在JSON对象中,如下所示:

{
 job=”httpcollector”, 
 method=”GET”, 
 path=”/tesst’ , 
 __name__=”http_request_total”
}

__name__是指标的名称。例如,使用它来过滤具有特定名称的所有指标。当应用PromQL时,Prometheus将转换数据并以4种不同的格式呈现:

  • String
  • Scalar
  • Instant vector
  • Range vector

前两个很容易理解:String只是一种文本格式,而Scalar是一个数值。然而,即时向量和范围向量有点复杂。

即时向量

数据不会同时到Prometheus,Prometheus到不同的exportor收集各类数据,他们都在不同的时间到达Prometheus。运行查询时,可以根据当前时间或特定时间计算数据。

下面是典型查询示例:

rate(cpu_meory_usage_total{ host=myserver, type=applicationserver, namesapce=test} [30s] )

在后面使用了过滤器:[30s],这意味着“查询最近30秒的数据”。

它将返回过去30秒内的值cpu_memory_usage / s,即时向量给你每个时间序列一个值;如果不专门指定,则是最后报告的值。

范围向量

范围向量不会给你单个值,不像即时向量;它在两个时间戳之间提供了一组测量值。

Prometheus数据存储方式

如果计划编写Prometheus exportor程序,那么你需要了解Prometheus的各种数据类型,因为需要根据场景选择正确的数据集类型。即使你不构建exportor,了解各种数据类型也是有益的,如,帮助你合适的函数构建查询和预警规则。以下是这些数据类型的概述:

  • Counter
  • Gauge
  • Histogram
  • Summary

Prometheus客户端支持构建exportor程序。这些客户端通常很容易使用,它们的一些功能依赖于数据类型。支持主流的编程语言:

  • Go
  • Java
  • Python
  • Ruby

让我们详细看看数据类型。

Couter

计数器类型用来存储随时间增长的指标,例如request_count、error_count、total等。它不应该用于减少的指标。一般使用“rate”函数查询计数器。语法格式:

rate( metric name [last period of time])

Rate只接受计数器作为输入,它将在特定时间段内返回计数器的每秒次数。它返回一个瞬时向量。

Rate (http_request_count [5s]) # 最近5秒内的http_request/s

请注意,如果导出程序因任何原因崩溃,计数器将以值0重启,并从那时开始递增。这是计数器的最大不足。

Gauge

该指标可用于值上下变化的指标,如:响应时间、内存使用情况、CPU使用情况等。Gauge(仪表)数据类型很常用。如何在Prometheus中查询Gauge数据?
在这里插入图片描述

通常是聚合函数将Gauge数据作为输入参数。注意:不要用rate函数计算Gauge数据类型。

Avg_over_time (http_response_time[5m]) # 将返回最近5分钟的平均响应时间

Histogram

直方图指定预定义桶的值。请看示例:

假设我想统计http_response大小,通常使用直方图进行统计分享(例如,2秒),Prometheus将获取响应时间,并计算在特定桶中的请求数量。
在这里插入图片描述

直方图将计算在桶中具有该值的请求的数量。默认桶有一个清晰的结构:

.005,0.01,0.025;0.05,0.075,0.1,0.25,0.5,0.75,1,2.5,5,7.5,10

因此,默认桶将只支持最多10秒的指标。如果需要报告具有较高值的指标,则需要定义自定义桶。你需要知道潜在度量的最小值和最大值是多少。直方图支持计算平均值,百分位数等。如果你对原始数据不感兴趣,直方图很适合计算它们。Prometheus将自动存储直方图中的元素数量,以及总数(即,轻松计算平均值)。

举例:

Rate(metric_duaration_sum[5m]) / Rate(request_duration_count[5m]) 
# 获取最近5分钟的平均响应。

还有一个预定义的函数来计算百分位数,其中“le”是桶名:

Histogram_quantile ( 0.95, sum(rate(request_duration_buckets[5m]))) by (le) )

Summary

摘要与直方图非常相似。直方图分位数在Prometheus服务器中计算,而摘要在应用服务器中计算。不能从多个应用程序实例聚合汇总数据。直方图要求使用默认桶或根据度量值定义桶。如果你事先不知道值的范围是什么,那么摘要是完美的。

当我们需要收集尽可能多的测量值以便稍后计算平均值或百分位数时,我们通常使用摘要。如果您不需要原始数据或非常精确的测量,例如响应时间或响应大小,那么摘要是非常合适。

PromQL 过滤数据

PromQL提供了多种过滤数据的方法。在本节中,我们将详细探讨以下可能性:

  • Labels
  • Range operator
  • Offset
  • @ modifier

Labels过滤

我们已经看到prometheus数据有标签,利用标签可以过滤存储的指标。下面是标签匹配操作符:

  • =:选择与提供的字符串完全相等的标签。
  • !=:选择不等于所提供字符串的标签。
  • =~:选择与提供的字符串进行正则匹配的标签。
  • !~:选择与提供的字符串不匹配的标签。

注意:需要指定名称或标签操作符,不能使用空字符串。

NO: http_request_total {path = " "}

NO: http_request_total {path = ~”.*”}

YES: http_request_total {path = ~ " .+ "}

Range operator

使用范围操作符,可以指定一个时间长度,该时间长度将过滤从现在到特定时间范围之间的向量。

时间长度单位以数字形式指定,后面紧跟着下列单位之一:

  • ms - milliseconds
  • s - seconds
  • m - minutes
  • h - hours
  • d - days - assuming a day has always 24h
  • w - weeks - assuming a week has always 7d
  • y - years - assuming a year has always 365d

offset

通过offset,可以在查询完成之前的一段时间内请求该值。

http_requests_total offset 5m

@ modifier

在PromQL中使用@修饰符过滤数据

@修饰符支持更改特定时间戳的评估日期。如果没有这个修饰符,您将默认使用当前时间戳。

你可以用@modifier组合范围选择器和偏移量。请看示例:

rate(http_requests_total[5m] @ 1609746000)

offset 在 @ 修饰符 之后

http_requests_total @ 1609746000 offset 5m

offset 在 @ 修饰符 之前

http_requests_total offset 5m @ 1609746000

函数应用

PromQL提供了一组丰富的函数和操作符来操作和分析时间序列数据。让我们来介绍一些最常用的:

Rate 和 Increase

rate()函数是PromQL中最常用的函数之一。它计算时间序列在范围向量中的每秒平均增长率。例如:

rate(http_requests_total [5m])

该查询计算过去5分钟内HTTP请求的每秒速率。

increase()函数与此类似,但返回计数器在时间范围内的总增量。对于以整数增加的计数器通常更直观:

increase(http_requests_total [1h])

这将显示过去一小时内HTTP请求的总数。

聚集函数

PromQL在聚合数据方面非常出色。下面是一些常见的聚合操作符:

  • sum:计算维度上的和
  • avg:计算维度
  • min和max上的平均值:找到维度上的最小或最大值
  • count:计算向量中元素的数量

例如,要获取所有端点上的HTTP请求总数:

sum(http_requests_total)

还可以按特定标签进行聚合:

sum(http_requests_total) by (status)
# 按状态码分组的请求总数。

直方图和摘要

直方图和摘要

Prometheus支持直方图和汇总度量类型,这对于度量值的分布(如请求持续时间)至关重要。下面是计算请求持续时间的第95个百分位数的示例:

Histogram_quantile(0.95, sum(rate(http_request_duration_seconds_bucket[5m])) by (le) )

该查询使用histogram_quantile函数以及sum和rate,为我们提供有关应用程序性能的有价值的见解。

总结

本文首先介绍Prometheus指标类型,区分即时向量和范围向量,然后介绍四种数据存储方式。基于指标类型和存储方式,介绍PromQL如何过滤数据、以及常用函数的用法。未来我们会结合实际应用场景继续学习更深入的监控预警应用。

标签:http,进阶,Language,request,Prometheus,直方图,total,向量
From: https://blog.csdn.net/neweastsun/article/details/143375025

相关文章

  • C++:二叉搜索树进阶
    文章目录前言一、二叉搜索树的查找(递归版本)二、二叉树搜索树的插入(递归版本)三、二叉搜索树的删除(递归版本)四、析构函数五、拷贝构造六、赋值重载七、代码总结八、二叉搜索树性能对比九、key_value模型总结前言前面我们学习的二叉搜索树迭代的版本,今天我们来学习递归......
  • VSCode进阶之路
    VSCode进阶之路:从入门到高效率开发......
  • LUOGU_进阶算法思想
    进阶算法思想单调数据结构单调队列,单调栈都是均摊\(O(1)\),是不支持撤销的,只能按照正常过程加入。单调栈求最近的大于小于其的值CF280BMaximumXorSecondary:枚举最大值,次大值并不容易确定,但枚举次大值的位置,这样最大值就是其左右两边第一个比其大的值,用单调栈可求出。其实就......
  • LUOGU_进阶数据结构
    LUOGU_进阶数据结构二叉堆P10977CuttheSequence:因为DP的值是单调递增的,所以可能的决策点只有最远的合法位置与那些后缀最大值段的左端点,用单调队列+可删除堆(懒标记)做。如果\(\exista<0\),怎么做?CDQ优化DP,可以做!!并查集P10350ModernizacjaBajtocji:把二选一的居民放进一......
  • CMDB平台(进阶篇):CMDB的应用场景剖析
    配置管理数据库(ConfigurationManagementDatabase,简称CMDB)是IT服务管理(ITSM)中的核心组件。随着信息技术的快速发展,大型企业的IT环境变得越来越复杂,为了更好地管理和维护这些复杂的IT基础设施,近些年来国内CMDB平台越来越多,如乐维CMDB、华为CMDB等。CMDB不仅是一个存储系统,用于记录......
  • 新手逆向实战三部曲之三——通过进入关键call追码注册软件(进阶)
    教程开始:通过前两次的学习,是不是感觉逆向也蛮有意思的呢,感兴趣的同学可以先看看前二次的内容再继续向下学习新手逆向实战三部曲之一新手逆向实战三部曲之二有了上次爆破的基础,这次便省力了许多,这次从载入开始,虽前头的几个步骤与之前相同,温故而知新嘛(也可直接往后看)用OD......
  • CE243 using C language and ARM
    SchoolofComputerScienceandElectronicEngineering1CE243(NWU)Assignment2(2020-2021)ObjectivesTheobjectiveofthisassignmentistodemonstrateyourunderstandingoftheembeddedsystemthatcanbeeffectivelycontrolledusingClanguageandA......
  • Java面试题中高级进阶(JVM篇01)
    前言本来想着给自己放松一下,刷刷博客,突然被几道面试题难倒!说说堆和栈的区别?什么时候会触发FullGC?什么是Java虚拟机?似乎有点模糊了,那就大概看一下面试题吧。好记性不如烂键盘***12万字的java面试题整理***说说堆和栈的区别栈是运行时单位,代表着逻辑,内含基本数据类型和......
  • Java面试题中高级进阶(JVM篇01)
    前言本来想着给自己放松一下,刷刷博客,突然被几道面试题难倒!说说堆和栈的区别?什么时候会触发FullGC?什么是Java虚拟机?似乎有点模糊了,那就大概看一下面试题吧。好记性不如烂键盘***12万字的java面试题整理***说说堆和栈的区别栈是运行时单位,代表着逻辑,内含基本数据类型和堆中对......
  • MySQL数据库详细介绍:从入门到进阶
    MySQL是一个广泛使用的开源关系型数据库管理系统,被广泛应用于Web应用程序、企业级应用以及各种数据分析场景。本文将详细介绍MySQL数据库的基本概念、安装、配置、管理以及优化等方面的内容,帮助大家从入门到进阶了解MySQL。 一、MySQL安装可以通过以下链接下载MySQL安装包:......