草庐IT

【云原生监控系列第二篇】Prometheus进阶——PromQL数据类型

Steve lu 2023-04-21 原文


目录

一、PromQL简介

PromQL(Prometheus Query Language)是Prometheus内置的数据查询语言。支持用户进行实时的数据查询及聚合操作。

Prometheus基于指标名称(metrics name)以及附属的标签集(labelset)唯一定义一条时间序列

  • 指标名称代表着监控目标上某类可测量属性的基本特征标识
  • 标签则是这个基本特征上再次细分的多个可测量维度


指标名称相同,但是标签不同也是不同的时间序列

基于PromQL表达式,用户可以针对指定的特征及其细分的纬度进行过滤、聚合、统计等运算从而产生期望的计算结果

  • PromQL 使用表达式(expression)来表述查询需求
  • 根据其使用的指标和标签,以及时间范围,表达式的查询请求可灵活地覆盖在一个或多个时间序列的一定范围内的样本之上,甚至是只包含单个时间序列的单个样本

二、Prometheus 数据模型

2.1 简介

Prometheus 中,每个时间序列都由指标名称(Metric Name)和标签(Label)来唯一标识格式为:{

  • 指标名称:通常用于描述系统上要测定的某个特征

    例如,prometheus_http_requests_total表示接收到的HTTP请求总数

  • 标签:键值型数据,附加在指标名称之上,从而让指标能够支持多纬度特征;可选项

    例如,prometheus_http_requests_total{code=“200”}和prometheushttp_requests_total{code=“302”}代表着两个不同的时间序列

  • 双下划线的标签(例如address)是Prometheus系统默认标签,是不会显示在/metrics页面里面的;

  • 系统默认标签在target页面中也是不显示的,需要鼠标放到Labels字段上才会显示。

  • 常见的系统默认标签:

__address:当前target 实例的套接字地址:

__scheme:采集当前target 上指标数据时使用的协议(http或https)

__metrics_path:采集当前target 上的指标数据时使用URI路径,默认为/metrics

___param:传递的URL参数中第一个名称为的参数的值

__name:此标签是标识指标名称的预留标签,能够使用标签选择器对指标名称进行过滤

2.2 指标名称及标签使用注意事项

  • 指标名称和标签的特定组合代表着一个时间序列;指标名称相同,但标签不同的组合分别代表着不同的时间序列;不同的指标名称自然更是代表着不同的时间序列

  • PromQL支持基于定义的指标维度进行过滤和聚合;更改任何标签值,包括添加或删除标签,都会创建一个新的时间序列;应该尽可能地保持标签的稳定性,否则,则很可能创建新的时间序列,更甚者会生成一个动态的数据环境,并使得监控的数据源难以跟踪,从而导致建立在该指标之上的图形、告警及记录规则变得无效

2.3 样本数据格式

Prometheus 的每个数据样本由两部分组成

  • 毫秒精度的时间戳
  • float64格式的数据

三、PromQL 的数据类型

  • 瞬时向量 (Instant vector): 特定或全部的时间序列集合上,具有相同时间戳的一组样本值
  • 区间向量 (Range vector): 特定或全部的时间序列集合上,在指定的同一时间范围内的所有样本值
  • 标量数据 (Scalar): 一个浮点型的数据值
  • 字符串 (String): 一个字符串,支持使用单引号、双引号进行引用

3.1 时间序列选择器(Time series Selectors)

PromQL 的查询操作可能需要针对若干个时间序列上的样本数据进行,挑选出目标时间序列是构建表达式时最为关键的一步;

用户可使用向量选择器表达式来挑选出给定指标名称下的所有时间序列或部分时间序列的即时样本值或至过去某个时间范围内的样本值,前者称为瞬时向量选择器,后者称为区间向量选择器。

3.1.1 瞬时向量选择器(Instant Vector Selectors)

瞬时向量选择器可以返回0个、1个或多个时间序列上在给定时间戳(instant)上的各自的一个样本。

瞬时向量选择器由两部分组成:

  • 指标名称:用于限定特定指标下的时间序列,即负责过滤指标;可选
  • 标签选择器:用于过滤时间序列上的标签;定义在 {} 之中;可选

定义瞬时向量选择器时,以上两个部分应该至少给出一个;因此存在以下三种组合:

  • 仅给定指标名称,或在标签名称上使用了空值的标签选择器:返回给定的指标下的所有时间序列各自的即时样本
    例如,prometheus_http_requests_total 和 prometheus_http_requests_total{} 的功能相同,都是用于返回这个指标下各时间序列的即时样本(所有
  • 仅给定标签选择器:返回所有符合给定的标签选择器的所有时间序列上的即时样本
    例如,{code=“200”, job=“prometheus”} ,这样的时间序列可能会有着不同的指标名称
  • 指标名称和标签选择器的组合:返回给定的指标下的,且符合给定的标签过滤器的所有时间序列上的即时样本
    例如,prometheus_http_requests_total{code=“200”, job=“prometheus”},用于返回这个指标 code 为 200, 并且 job 为 prometheus 的时间序列的即时样本


标签选择器用于定义标签过滤条件,目前支持如下4种匹配操作符:

操作符过滤条件
=完全相等
!=不相等
=~正则表达式匹配
!~正则表达式不匹配


注意事项:

◆匹配到空标签值的标签选择器时,所有未定义该标签的时间序列同样符合条件

例如,prometheus_http_requests_total{handler= “”},则该指标名称上所有未使用该标签(handler)的时间序列也符合条件

◆正则表达式将执行完全锚定机制,它需要匹配指定的标签的整个值

◆向量选择器至少要包含一个指标名称,或者至少有一个不会匹配到空字符串的标签选择器

例如,{ job=“”}为非法的向量选择器

◆使用____name____ 做为标签名称,还能够对指标名称进行过滤

例如,{name=~“.*http_requests_total”}能够匹配所有以 http_requests_total 为后缀的所有指标


3.1.2 区间向量选择器(Range Vector Selectors)

区间向量选择器可以返回0个、1个或多个时间序列上在给定时间范值围内的各自的一组样本。

区间向量选择器的不同之处在于,需要通过在瞬时向量选择器表达式后面添加包含在 [] 里的时长来表达需在时间时序上返回的样本所处的时间范围。

时间范围:以当前时间为基准时间点,指向过去一个特定的时间长度;例如,[5m] 是指过去5分钟之内。

  • 可用的时间单位有 ms(毫秒)、s(秒)、m(分钟)、h(小时)、d(天)、w(周)和 y(年)
  • 必须使用整数时间,且能够将多个不同级别的单位进行串联组合,以时间单位由大到小为顺序,例如 1h30m,但不能使用 1.5h

3.1.3 偏移向量选择器

前面介绍的选择器默认都是以当前时间为基准时间,偏移修饰器用来调整基准时间,使其往前偏移一段时间。偏移修饰器紧跟在选择器后面,使用关键字 offset 来指定要偏移的量。(查询的不是当前时间为起点的)

例如:

prometheus_http_requests_total offset 5m ,表示获取以 prometheus_http_requests_total 为指标名称的所有时间序列在过去 5 分钟之时的即时样本;

prometheus_http_requests_total[5m] offset 1d ,表示获取距此刻 1 天时间之前的 5 分钟之内的所有样本

3.2 向量表达式使用要点

表达式的返回值类型亦是即时向量、范围向量、标题或字符串4种数据类型其中之一,但是,有些使用场景要求表达式返回值必须满足特定的条件,例如:

  1. 需要将返回值绘制成图形时,仅支持瞬时向量类型的数据;
  2. 对于诸如 rate、irate 之类的速率函数来说,其要求使用的却又必须是区间向量型的数据
  • 由于区间向量选择器的返回的是区间向量型数据,它不能用于表达式浏览器中图形绘制功能

  • 区间向量选择器通常会结合速率类的函数 rate、irate 一同使用


有关【云原生监控系列第二篇】Prometheus进阶——PromQL数据类型的更多相关文章

  1. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  2. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  3. ruby-on-rails - 使用一系列等级计算字母等级 - 2

    这里是Ruby新手。完成一些练习后碰壁了。练习:计算一系列成绩的字母等级创建一个方法get_grade来接受测试分数数组。数组中的每个分数应介于0和100之间,其中100是最大分数。计算平均分并将字母等级作为字符串返回,即“A”、“B”、“C”、“D”、“E”或“F”。我一直返回错误:avg.rb:1:syntaxerror,unexpectedtLBRACK,expecting')'defget_grade([100,90,80])^avg.rb:1:syntaxerror,unexpected')',expecting$end这是我目前所拥有的。我想坚持使用下面的方法或.join,

  4. ruby - Infinity 和 NaN 的类型是什么? - 2

    我可以得到Infinity和NaNn=9.0/0#=>Infinityn.class#=>Floatm=0/0.0#=>NaNm.class#=>Float但是当我想直接访问Infinity或NaN时:Infinity#=>uninitializedconstantInfinity(NameError)NaN#=>uninitializedconstantNaN(NameError)什么是Infinity和NaN?它们是对象、关键字还是其他东西? 最佳答案 您看到打印为Infinity和NaN的只是Float类的两个特殊实例的字符串

  5. ruby - 检查方法参数的类型 - 2

    我不确定传递给方法的对象的类型是否正确。我可能会将一个字符串传递给一个只能处理整数的函数。某种运行时保证怎么样?我看不到比以下更好的选择:defsomeFixNumMangler(input)raise"wrongtype:integerrequired"unlessinput.class==FixNumother_stuffend有更好的选择吗? 最佳答案 使用Kernel#Integer在使用之前转换输入的方法。当无法以任何合理的方式将输入转换为整数时,它将引发ArgumentError。defmy_method(number)

  6. ruby - Ruby 有 `Pair` 数据类型吗? - 2

    有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳

  7. ruby - 查找字符串中的内容类型(数字、日期、时间、字符串等) - 2

    我正在尝试解析一个CSV文件并使用SQL命令自动为其创建一个表。CSV中的第一行给出了列标题。但我需要推断每个列的类型。Ruby中是否有任何函数可以找到每个字段中内容的类型。例如,CSV行:"12012","Test","1233.22","12:21:22","10/10/2009"应该产生像这样的类型['integer','string','float','time','date']谢谢! 最佳答案 require'time'defto_something(str)if(num=Integer(str)rescueFloat(s

  8. ruby-on-rails - 在 Rails 开发环境中为 .ogv 文件设置 Mime 类型 - 2

    我正在玩HTML5视频并且在ERB中有以下片段:mp4视频从在我的开发环境中运行的服务器很好地流式传输到chrome。然而firefox显示带有海报图像的视频播放器,但带有一个大X。问题似乎是mongrel不确定ogv扩展的mime类型,并且只返回text/plain,如curl所示:$curl-Ihttp://0.0.0.0:3000/pr6.ogvHTTP/1.1200OKConnection:closeDate:Mon,19Apr201012:33:50GMTLast-Modified:Sun,18Apr201012:46:07GMTContent-Type:text/plain

  9. ruby - 我如何添加二进制数据来遏制 POST - 2

    我正在尝试使用Curbgem执行以下POST以解析云curl-XPOST\-H"X-Parse-Application-Id:PARSE_APP_ID"\-H"X-Parse-REST-API-Key:PARSE_API_KEY"\-H"Content-Type:image/jpeg"\--data-binary'@myPicture.jpg'\https://api.parse.com/1/files/pic.jpg用这个:curl=Curl::Easy.new("https://api.parse.com/1/files/lion.jpg")curl.multipart_form_

  10. 世界前沿3D开发引擎HOOPS全面讲解——集3D数据读取、3D图形渲染、3D数据发布于一体的全新3D应用开发工具 - 2

    无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD

随机推荐