Grafana中使用Prometheus的官方帮助文档翻译

Grafana IT敢客 6个月前 (12-11) 2031次浏览 已收录 2个评论 扫描二维码

       喜欢 Grafana 的华丽,又喜欢 Prometheus 的精细,而非常幸运的是 Grafana 和 Prometheus 是兼容的,可以结合起来使用。之前我也写过Grafana 配置 Prometheus 展示高大上牛掰的监控图表,来展示 Prometheus 和 Grafana 的强大之处。今天我就其中的一些小问题并且是非常重要的小问题做一些官方文档的翻译。

       在使用 Grafana+Prometheus 的过程中,我们往往因为一些图表的数据不显示或者非我们想要的结果需要调整这个 Prometheus 的模板函数。像下面的这样的函数,我们看上去也是一脸懵逼对吧。

Grafana 中使用 Prometheus 的官方帮助文档翻译

这些我主要分两部分说明,一个是 Prometheus 本身的变量名称问题,一个就是 Prometheus 的函数问题了。就像下面这样的一段语法

clamp_max((avg by (mode) ( (clamp_max(rate(node_cpu_seconds_total{instance="$host",mode!="idle"}[$interval]),1)) or (clamp_max(irate(node_cpu_seconds_total{instance="$host",mode!="idle"}[5m]),1)) )),1)

这些 mode,node_cpu_seconds_total{instance=”$host”,mode!=”idle”}是 Prometheus 的参数变量名称,这些是可以在 Prometheus 的界面中找到,如下图所示,有些图表不显示,可能是因为这些模板中的变量名称变化了而已。Grafana 中使用 Prometheus 的官方帮助文档翻译

然后像 clamp_max,rate,irate 这样的都是 Prometheus 的函数了。

在 Grafana 的官方网站上,有专门针对 Prometheus 的模板配置做说明,地址http://docs.grafana.org/v4.5/features/datasources/prometheus/#templating,我这里主要做一个翻译:


在 Grafana 使用普罗米修斯

Grafana 包括对 Prometheus 的内置支持。

添加数据源 Grafana 

  1. 单击顶部标题中的 Grafana 图标打开侧边菜单。
  2. Dashboards链接下的侧边菜单中,您应找到一个名为的链接Data Sources
  3. 单击+ Add data source顶部标题中的按钮。
  4. Prometheus从“ 类型”下拉列表中选择。

注意:如果您没有Data Sources在侧边菜单中看到该链接,则表示您当前的用户没有Admin当前组织的角色。

数据源选项

名称 描述
名称 数据源名称。这是您在面板和查询中引用数据源的方式。
默认 默认数据源意味着它将为新面板预先选择。
网址 您的 Prometheus 服务器的 http 协议,IP 和端口(默认端口通常是 9090)
访问 Proxy =通过 Grafana 后端访问,Direct =直接从浏览器访问。
基本认证 启用对 Prometheus 数据源的基本身份验证。
用户 您的 Prometheus 用户的名称
密码 数据库用户的密码

查询编辑器

通过单击标题>编辑(或在鼠标e悬停在面板上时按键)打开编辑模式下的图形。

Grafana 中使用 Prometheus 的官方帮助文档翻译

 
名称 描述
查询表达式 Prometheus 查询表达式,请查看Prometheus 文档
图例格式 使用名称或模式控制时间系列的名称。例如,{{hostname}}将替换为标签的标签值hostname
最小步骤 设置 Prometheus 步骤选项的下限。Step 控制 Prometheus 查询引擎执行范围查询时跳转的大小。遗憾的是,没有正式的 prometheus 文档链接到这个非常重要的选项。
解析度 控制步骤选项。小步骤可以创建高分辨率图形,但在较大的时间范围内可能会很慢,降低分辨率可以加快速度。1/2将尝试设置步骤选项,为每个其他像素生成 1 个数据点。值1/10将尝试设置步骤选项,以便每 10 个像素有一个数据点。
指标查找 在此输入字段中搜索度量标准名称。
格式为 (v4.3 中的新增功能)在表和时间系列之间切换。表格格式仅适用于“表格”面板。

模板

您可以在度量标准查询中使用变量代替硬编码服务器,应用程序和传感器名称等内容。变量显示为仪表板顶部的下拉选择框。这些下拉菜单可以轻松更改仪表板中显示的数据。

查看模板文档,了解模板功能和不同类型的模板变量。

查询变量

Query类型的变量允许您查询 Prometheus 以获取度量标准,标签或标签值的列表。Prometheus 数据源插件提供了可在Query输入字段中使用的以下功能。

名称 描述
label_values(标签) 返回label每个度量标准中的标签值列表。
label_values(metric,label) 返回label指定度量标准中的标签值列表。
度量(公制) 返回与指定metric正则表达式匹配的度量标准列表。
query_result(查询) 返回一个 Prometheus 查询结果列表query

有关度量标准名称标签名称标签值的详细信息,请参阅Prometheus 文档

在查询中使用变量

有两种语法:

  • $<varname> 示例:rate(http_requests_total {job =〜“$ job”} [5m])
  • [[varname]] 示例:rate(http_requests_total {job =〜“[[job]]”} [5m])

为什么两种方式?第一种语法更易于读写,但不允许您在单词的中间使用变量。启用“ 多值”或“ 包括所有值”选项后,Grafana 会将标签从纯文本转换为正则表达式兼容字符串。这意味着你必须使用=~而不是=

注释

注释允许您在图表上叠加丰富的事件信息。您可以通过仪表板菜单/注释视图添加注释查询。

Prometheus 支持两种查询注释的方法。

  • 常规度量标准查询
  • 针对挂起和触发警报的 Prometheus 查询(有关详细信息,请参阅在运行时检查警报

步骤选项可用于限制从查询返回的事件数。


模板

模板允许更多交互式和动态仪表板。您可以在度量标准查询中使用变量代替硬编码服务器,应用程序和传感器名称等内容。变量显示为仪表板顶部的下拉选择框。通过这些下拉菜单,您可以轻松更改仪表板中显示的数据。

Grafana 中使用 Prometheus 的官方帮助文档翻译

什么是变量?

变量是值的占位符。您可以在度量标准查询和面板标题中使用变量。因此,当您更改值时,使用仪表板顶部的下拉列表,面板的度量标准查询将更改以反映新值。

插值

面板标题和度量标准查询可以使用两种不同的语法引用变量:

  • $<varname> 示例:apps.frontend。$ server.requests.count
  • [[varname]] 示例:apps.frontend。[[server]]。requests.count

为什么两种方式?第一种语法更易于读写,但不允许在单词中间使用变量。在表达式中使用第二种语法my.server[[serverNumber]].count

在将查询发送到数据源之前,将对查询进行插值,这意味着将变量替换为其当前值。在插值期间,可以对变量值进行转义,以符合查询语言的语法和使用它的位置。例如,InfluxDB 或 Prometheus 查询中的正则表达式中使用的变量将进行正则表达式转义。有关插值期间值转义的详细信息,请阅读数据源特定文档文章。

变量选项

变量显示为仪表板顶部的下拉选择框。它具有当前值和一组选项。该选项是一组可供选择的值。

添加变量

Grafana 中使用 Prometheus 的官方帮助文档翻译

您可以通过 Dashboard cogs 菜单>模板添加变量。这将打开一个变量列表和一个New用于创建新变量的按钮。

基本变量选项

选项 描述
名称 变量的名称,这是在度量标准查询中引用变量时使用的名称。必须是唯一的,不包含空格。
标签 此变量的下拉列表的名称。
隐藏 隐藏下拉选择框的选项。
类型 定义变量类型。

变量类型

类型 描述
询问 此变量类型允许您编写数据源查询,该查询通常返回度量标准名称,标记值或键的列表。例如,返回服务器名称,传感器 ID 或数据中心列表的查询。
间隔 此变量可表示时间跨度。不是按时间或日期直方图间隔对组进行硬编码,而是使用此类型的变量。
数据源 此类型允许您快速更改整个仪表板的数据源。如果您在不同的环境中有多个数据源实例,则非常有用。
习惯 使用逗号分隔列表手动定义变量选项。
不变 定义隐藏常量。对于要共享的仪表板的度量标准路径前缀很有用。在仪表板导出期间,常量变量将变为导入选项。
Ad hoc 过滤器 非常特殊的变量,目前仅适用于某些数据源,InfluxDB 和 Elasticsearch。它允许您添加键/值过滤器,这些过滤器将自动添加到使用指定数据源的所有度量标准查询中。

查询选项

此变量类型是最强大和最复杂的,因为它可以使用数据源查询动态获取其选项。

选项 描述
数据源 查询的数据源目标。
刷新 控制何时更新变量选项列表(下拉列表中的值)。在仪表板上加载将减慢仪表板负载,因为在初始化仪表板之前需要完成变量查询。如果变量选项查询包含时间范围过滤器或取决于仪表板时间范围,则仅将此设置为“ 开时间范围更改”
询问 数据源特定的查询表达式。
正则表达式 正则表达式用于过滤或捕获数据源查询返回的名称的特定部分。可选的。
分类 在下拉列表中定义选项的排序顺序。已禁用表示将使用数据源查询返回的选项顺序。

查询表达式

每个数据源的查询表达式都不同。

需要注意的一点是,查询表达式可以包含对其他变量的引用,实际上可以创建链接变量。Grafana 将检测到这一点并在其中一个变量包含变量时自动刷新变量。

选择选项

选项 描述
多值 如果启用,该变量将支持同时选择多个选项。
包括所有选项 添加一个特殊All选项,其值包括所有选项。
自定义所有价值 默认情况下,该All值将包括组合表达式中的所有选项。这可能会变得很长并且可能会出现性能问题。很多时候,最好指定一个自定义的所有值,比如通配符正则表达式。为了能够在自定义所有值选项中使用定义正则表达式,globs 或 lucene 语法,它永远不会被转义,因此您必须考虑 avbout 什么是数据源的有效值。

形成多个值

使用所选择的多个值对变量进行插值是很棘手的,因为如何将多个值格式化为在使用该变量的给定上下文中有效的字符串是不容易的。Grafana 试图通过允许每个数据源插件通知模板插值引擎用于多个值的格式来解决这个问题。

例如,Graphite使用 glob 表达式。在这种情况下,具有多个值的变量将被内插,{host1,host2,host3}就像当前变量值是host1host2host3 一样

InfluxDB 和 Prometheus使用正则表达式,因此相同的变量将被插值为(host1|host2|host3)。如果没有,每个值也将是正则表达式转义,具有正则表达式控制字符的值将破坏正则表达式。

Elasticsearch使用 lucene 查询语法,因此在这种情况下,相同的变量将被格式化为("host1" OR "host2" OR "host3")。在这种情况下,每个值都需要进行转义,以便该值可以包含 lucene 控制字和引号。

形成麻烦

自动转义和格式化可能会导致问题,掌握它背后的逻辑可能会很棘手。特别是对于 InfluxDB 和 Prometheus,使用正则表达式语法要求在 regex 运算符上下文中使用该变量。如果您不希望 Grafana 执行此操作,则自动正则表达式转义并格式化您唯一的选项是禁用“ 多值”或“ 包括所有”选项

值组/标签

如果您在多值变量的下拉列表中有很多选项。您可以使用此功能将值分组为可选标记。

选项 描述
标签查询 应返回标记列表的数据源查询
标记值查询 应返回指定标记键值的列表的数据源查询。$tag在查询中使用以引用当前选定的标记。

Grafana 中使用 Prometheus 的官方帮助文档翻译

区间变量

使用Interval类型创建表示时间跨度的变量(例如1m1h1d)。还有一个特殊auto选项会根据当前时间范围而改变。您可以指定当前时间范围应分多少次以计算当前auto时间跨度。

此变量类型可用作按时间分组的参数(对于 InfluxDB),日期直方图间隔(对于 Elasticsearch)或作为汇总函数参数(对于 Graphite)。

在石墨函数中使用myinterval类型的模板变量的示例Interval

summarize($myinterval, sum, false)

全局内置变量

Grafana 具有全局内置变量,可以在查询编辑器中的表达式中使用。

$ __ 区间变量

这个$ __ interval 变量类似于auto上面描述的 interval 变量。它可以用作按时间分组的参数(对于 InfluxDB),日期直方图间隔(对于 Elasticsearch)或作为汇总函数参数(对于 Graphite)。

Grafana 自动计算可用于在查询中按时间分组的间隔。当数据点多于图表上显示的数据点时,可以通过更大的间隔分组来提高查询效率。在查看 3 个月的数据时,分组比 1 天比 10 分更有效,图表看起来相同,查询会更快。的$__interval使用时间范围和图形(像素数)的宽度来计算。

近似计算: (from - to) / resolution

例如,当时间范围为 1 小时且图形为全屏时,则可以计算间隔2m– 以 2 分钟为间隔对点进行分组。如果时间范围是 6 个月并且图表是全屏,则间隔可能是1d(1 天) – 点按天分组。

在 InfluxDB 数据源中,遗留变量$interval是同一个变量。$__interval应该用来代替。

InfluxDB 和 Elasticsearch 数据源具有Group by time interval用于对间隔进行硬编码或设置$__interval变量的最小限制的字段(通过使用>语法 – > >10m)。

$ __ interval_ms 变量

此变量是以$__interval毫秒为单位的变量(而不是格式化字符串的时间间隔)。例如,如果$__interval是,20m那么$__interval_ms1200000

$ timeFilter 或$ __ timeFilter 变量

$timeFilter变量返回当前选定的时间范围作为表达。例如,时间范围间隔Last 7 days表达式为time > now() - 7d

这在 InfluxDB 数据源的 WHERE 子句中使用。在查询编辑器模式下,Grafana 会自动将其添加到 InfluxDB 查询中。必须在文本编辑器模式下手动添加:WHERE $timeFilter

$__timeFilter是在 MySQL 数据源使用。

$ __ name 变量

此变量仅在 Singlestat 面板中可用,可以在“选项”选项卡上的前缀或后缀字段中使用。变量将替换为系列名称或别名。

重复面板

模板变量对于在整个仪表板中动态更改查询非常有用。如果您希望 Grafana 根据您选择的值动态创建新面板或行,则可以使用“ 重复”功能。

如果您启用了变量Multi-valueInclude all value选项,则可以选择一个面板或一行,并让 Grafana 为每个选定值重复该行。您可以在面板编辑模式的“常规”选项卡下找到此选项。选择要重复的变量,然后选择 a min span。该min span控制小 Grafana 将如何使面板(如果你有很多值中选择)。Grafana 将自动调整每个重复面板的宽度,以便填满整行。目前,您不能将一行中的其他面板与重复面板混合使用。

仅对第一个面板(原始模板)进行更改。要使更改在所有面板上生效,您需要触发动态仪表板重建。您可以通过更改变量值(这是重复的基础)或重新加载仪表板来完成此操作。

重复行

此选项要求您打开行选项视图。将鼠标悬停在行左侧以触发行菜单,在此菜单中单击Row Options。这将打开行选项视图。在这里,您可以找到重复下拉列表,您可以在其中选择要重复的变量。

URL 状态

变量值始终使用语法同步到 URL var-<varname>=value


脚本仪表板

如果您有许多以定义模式更改的度量标准名称(新服务器等),则不断创建新仪表板会令人恼火。

使用脚本化仪表板,您可以使用 javascript 动态创建仪表板。在文件夹 grafana install 文件夹下面public/dashboards/有一个名为的文件scripted.js。此文件包含脚本化仪表板的示例。您可以使用以下网址访问它:http://grafana_url/dashboard/script/scripted.js?rows=3&name=myName

如果打开 scripted.js,您可以看到它如何从 ARGS 变量中读取 url 参数,然后添加行和面板。

示例

var rows = 1;
var seriesName = 'argName';
if(!_.isUndefined(ARGS.rows)) {
  rows = parseInt(ARGS.rows, 10);
}
if(!_.isUndefined(ARGS.name)) {
  seriesName = ARGS.name;
}
for (var i = 0; i < rows; i++) {

  dashboard.rows.push({
    title: 'Scripted Graph ' + i,
    height: '300px',
    panels: [
      {
        title: 'Events',
        type: 'graph',
        span: 12,
        fill: 1,
        linewidth: 2,
        targets: [
          {
            'target': "randomWalk('" + seriesName + "')"
          },
          {
            'target': "randomWalk('random walk2')"
          }
        ],
      }
    ]
  });
}
return dashboard;

更多例子

您可以在public/dashboards/grafana 安装目录中找到更多示例。


接下来的都是 Prometheus 的说明。

查询普罗米修斯

Prometheus 提供了一种功能表达式语言,允许用户实时选择和汇总时间序列数据。表达式的结果可以显示为图形,在 Prometheus 的表达式浏览器中显示为表格数据,或者由外部系统通过HTTP API 使用

例子

本文档仅供参考。对于学习,从几个例子开始可能更容易。

表达式语言数据类型

在 Prometheus 的表达式语言中,表达式或子表达式可以评估为以下四种类型之一:

  • 即时向量 – 一组包含每个时间序列的单个样本的时间序列,它们共享相同的时间戳
  • 范围向量 – 一组时间系列,包含每个时间序列随时间变化的一系列数据点
  • 标量 – 一个简单的数字浮点值
  • String – 一个简单的字符串值; 目前尚未使用

根据用例(例如,当绘图与显示表达式的输出时),只有部分类型是合法的,因为来自用户指定的表达式。例如,返回即时向量的表达式是唯一可以直接绘制的类型。

字面

字符串文字

字符串可以用单引号,双引号或反引号指定为文字。

PromQL 遵循与Go相同的转义规则。在单引号或双引号反斜杠开头的转义序列,其可以随后abf, nrtv\。可以使用八进制(\nnn)或十六进制(\xnn\unnnn\Unnnnnnnn)提供特定字符。

在反引号内没有处理转义。与 Go 不同,Prometheus 不会丢弃反引号中的换行符。

例:

"this is a string"
'these are unescaped: \n \\ \t'
`these are not unescaped: \n ' " \t`

浮点文字

标量浮点值可以字面上写为表单的数字 [-](digits)[.(digits)]

-2.43

时间序列选择器

即时矢量选择器

即时向量选择器允许在给定时间戳(即时)为每个选择一组时间序列和单个样本值:在最简单的形式中,仅指定度量名称。这将生成包含具有此度量标准名称的所有时间序列的元素的即时向量。

此示例选择具有http_requests_total度量标准名称的所有时间系列:

http_requests_total

可以通过附加一组标签来进一步过滤这些时间序列,以匹配花括号({})。

此示例仅选择具有http_requests_total 度量标准名称的时间系列,这些时间序列也job设置为标签prometheus并将其group标签设置为canary

http_requests_total{job="prometheus",group="canary"}

也可以对标签值进行负匹配,或者将标签值与正则表达式进行匹配。存在以下标签匹配运算符:

  • =:选择与提供的字符串完全相同的标签。
  • !=:选择不等于提供的字符串的标签。
  • =~:选择正则表达式匹配提供的字符串(或子字符串)的标签。
  • !~:选择不与提供的字符串(或子字符串)正则表达式匹配的标签。

例如,此选择所有http_requests_total的时间序列staging, testing以及development环境和比其他 HTTP 方法GET

http_requests_total{environment=~"staging|testing|development",method!="GET"}

与空标签值匹配的标签匹配器也会选择根本没有特定标签集的所有时间序列。正则表达式匹配是完全锚定的。可以为同一标签名称提供多个匹配器。

向量选择器必须指定一个名称或至少一个与空字符串不匹配的标签匹配器。以下表达式是非法的:

{job=~".*"} # Bad!

相反,这些表达式是有效的,因为它们都有一个与空标签值不匹配的选择器。

{job=~".+"}              # Good!
{job=~".*",method="get"} # Good!

标签匹配器也可以通过与内部__name__标签匹配来应用于度量标准名称 。例如,表达式http_requests_total相当于{__name__="http_requests_total"}。比其他的匹配器=!==~!~)也可以使用。以下表达式选择名称以下面开头的所有指标job:

{__name__=~"job:.*"}

Prometheus 中的所有正则表达式都使用RE2 语法

范围矢量选择器

范围向量文字像即时向量文字一样工作,除了它们从当前时刻选择一系列样本。在语法上,范围持续时间附加在[]向量选择器末尾的方括号()中,以指定应为每个结果范围向量元素提取多长时间值。

持续时间指定为数字,紧接着是以下单位之一:

  • s – 秒
  • m – 分钟
  • h – 小时
  • d – 天
  • w – 周
  • y – 年

在此示例中,我们选择在过去 5 分钟内为具有度量标准名称http_requests_totaljob标签设置为的所有时间序列记录的所有值prometheus

http_requests_total{job="prometheus"}[5m]

偏移修改器

所述offset改性剂可以改变时间为查询中的个别时刻和范围矢量偏移。

例如,以下表达式返回http_requests_total过去相对于当前查询评估时间的 5 分钟值 :

http_requests_total offset 5m

请注意,offset修饰符始终需要立即跟随选择器,即以下内容是正确的:

sum(http_requests_total{method="GET"} offset 5m) // GOOD.

虽然以下内容不正确

sum(http_requests_total{method="GET"}) offset 5m // INVALID.

同样适用于范围向量。这将返回http_requests_total一周前的 5 分钟费率 :

rate(http_requests_total[5m] offset 1w)

运营商

Prometheus 支持许多二进制和聚合运算符。这些在表达式语言运算符页面中有详细描述。

功能

Prometheus 支持多种操作数据的功能。这些在表达式语言功能页面中有详细描述。

陷阱

泄气

运行查询时,独立于实际当前时间序列数据选择采样数据的时间戳。这主要是为了支持聚合(sumavg等等)这样的情况,其中多个聚合时间序列在时间上不完全对齐。由于它们的独立性,Prometheus 需要在每个相关时间序列的时间戳上分配值。它只需在此时间戳之前采用最新的样本即可。

如果目标刮擦或规则评估不再返回先前存在的时间序列的样本,则该时间序列将被标记为陈旧。如果删除目标,则之前返回的时间序列将很快标记为陈旧。

如果在时间序列标记为失效后在采样时间戳处评估查询,则不会为该时间系列返回任何值。如果随后在该时间序列中摄取新样本,它们将照常返回。

如果在采样时间戳前 5 分钟未找到任何样本(默认情况下),则此时间点不会返回该时间序列的值。这实际上意味着时间序列在其最新收集的样本超过 5 分钟或标记为陈旧之后从图表中“消失”。

对于在其刮擦中包含时间戳的时间序列,不会标记陈旧性。在这种情况下,仅应用 5 分钟的阈值。

避免慢查询和重载

如果查询需要对大量数据进行操作,则绘制图表可能会超时或使服务器或浏览器过载。因此,在构建对未知数据的查询时,始终在 Prometheus 表达式浏览器的表格视图中开始构建查询,直到结果集看起来合理(最多数百个,而不是数千个时间序列)。只有在您充分过滤或汇总数据后,才能切换到图表模式。如果表达式仍然需要很长时间来绘制 ad-hoc 图形,请通过录制规则预先录制它。

这与 Prometheus 的查询语言特别相关,其中一个简单的度量名称选择器api_http_requests_total可以扩展到具有不同标签的数千个时间序列。还要记住,即使输出只是少量的时间序列,聚合在许多时间序列上的表达式也会在服务器上产生负载。这类似于在关系数据库中对列的所有值求和的速度很慢,即使输出值只是一个数字。


接下来是 Prometheus 的函数部分

函数

有些函数有默认参数,例如year(v=vector(time()) instant-vector)。这意味着有一个参数v是一个即时向量,如果没有提供,它将默认为表达式的值 vector(time())

abs()

abs(v instant-vector) 返回输入向量,所有样本值都转换为其绝对值。

absent()

absent(v instant-vector) 如果传递给它的向量具有任何元素,则返回空向量;如果传递给它的向量没有元素,则返回值为 1 的 1 元素向量。

这对于在给定度量标准名称和标签组合不存在时间序列时发出警报非常有用。

absent(nonexistent{job="myjob"})
# => {job="myjob"}

absent(nonexistent{job="myjob",instance=~".*"})
# => {job="myjob"}

absent(sum(nonexistent{job="myjob"}))
# => {}

在第二个示例中,absent()尝试从输入向量中导出 1 元素输出向量的标签。

ceil()

ceil(v instant-vector)将所有元素的样本值四舍五入v到最接近的整数。

changes()

对于每个输入时间系列,changes(v range-vector)将其值在所提供的时间范围内更改的次数作为即时向量返回。

clamp_max()

clamp_max(v instant-vector, max scalar)钳制所有元素的样本值,v其上限为max

clamp_min()

clamp_min(v instant-vector, min scalar)钳制所有元素的样本值的v下限为min

day_of_month()

day_of_month(v=vector(time()) instant-vector)返回 UTC 中每个给定时间的月中某天。返回值为 1 到 31。

day_of_week()

day_of_week(v=vector(time()) instant-vector)返回 UTC 中每个给定时间的星期几。返回值为 0 到 6,其中 0 表示星期日等。

days_in_month()

days_in_month(v=vector(time()) instant-vector)返回 UTC 中每个给定时间的月中天数。返回值为 28 到 31。

delta()

delta(v range-vector)计算范围向量中每个时间系列元素的第一个和最后一个值之间的差异v,返回具有给定增量和等效标签的即时向量。delta 被外推以覆盖范围向量选择器中指定的全时间范围,因此即使样本值都是整数,也可以获得非整数结果。

以下示例表达式返回从现在到 2 小时之前 CPU 温度的差异:

delta(cpu_temp_celsius{host="zeus"}[2h])

delta 应该只用于仪表。

deriv()

deriv(v range-vector)v使用简单线性回归计算范围向量中时间序列的每秒导数。

deriv 应该只用于仪表。

exp()

exp(v instant-vector)计算所有元素的指数函数v。特殊情况是:

  • Exp(+Inf) = +Inf
  • Exp(NaN) = NaN

floor()

floor(v instant-vector)将所有元素的样本值v舍入为最接近的整数。

histogram_quantile()

histogram_quantile(φ float, b instant-vector)直方图的桶b中 计算φ-分位数(0≤φ≤1)。(有关φ-分位数的详细解释和直方图度量类型的使用,请参阅 直方图和摘要。)样本中是每个桶中的观察计数。每个样本必须有一个标签,其中标签值表示桶的包含上限。(默认忽略没有此类标签的样本。)直方图度量标准类型 自动提供带有后缀和相应标签的时间序列。ble_bucket

使用此rate()功能指定分位数计算的时间窗口。

示例:调用直方图度量http_request_duration_seconds。要计算过去 10 米内请求持续时间的第 90 个百分位数,请使用以下表达式:

histogram_quantile(0.9, rate(http_request_duration_seconds_bucket[10m]))

为每个标签组合计算分位数 http_request_duration_seconds。要聚合,请使用函数sum()周围的聚合器rate()。由于le标签是必需的 histogram_quantile(),因此必须包含在该by条款中。以下表达式汇总了第 90 个百分点job

histogram_quantile(0.9, sum(rate(http_request_duration_seconds_bucket[10m])) by (job, le))

要聚合所有内容,请仅指定le标签:

histogram_quantile(0.9, sum(rate(http_request_duration_seconds_bucket[10m])) by (le))

histogram_quantile()函数通过假设桶内的线性分布来插值分位数值。最高桶必须具有上限+Inf。(否则,NaN返回。)如果分位数位于最高桶中,则返回第二个最高桶的上限。如果该桶的上限大于 0,则假设最低桶的下限为 0.在这种情况下,在该桶内应用通常的线性插值。否则,返回位于最低桶中的分位数的最低桶的上限。

如果b包含少于两个桶,NaN则返回。对于φ<0,-Inf返回。对于φ> 1,+Inf返回。

holt_winters()

holt_winters(v range-vector, sf scalar, tf scalar)根据范围输入生成时间序列的平滑值v。平滑因子越低sf,旧数据的重要性就越高。趋势因子越高,数据的趋势tf就越多。二者sftf必须在 0 和 1 之间。

holt_winters 应该只用于仪表。

hour()

hour(v=vector(time()) instant-vector)返回 UTC 中每个给定时间的一天中的小时。返回值为 0 到 23。

idelta()

idelta(v range-vector)

idelta(v range-vector)计算范围向量中最后两个样本之间的差异v,返回具有给定增量和等效标签的即时向量。

idelta 应该只用于仪表。

increase()

increase(v range-vector)计算范围向量中时间序列的增加。单调性中断(例如由于目标重启而导致的计数器重置)会自动调整。增加外推以覆盖范围向量选择器中指定的全时间范围,因此即使计数器仅以整数增量增加,也可以获得非整数结果。

以下示例表达式返回范围向量中每个时间系列在过去 5 分钟内测量的 HTTP 请求数:

increase(http_requests_total{job="api-server"}[5m])

increase应该只用于计数器。它是语法糖,rate(v)乘以指定时间范围窗口下的秒数,主要用于人类可读性。用于rate记录规则,以便每秒一致地跟踪增量。

irate()

irate(v range-vector)计算范围向量中时间序列的每秒即时增长​​率。这基于最后两个数据点。单调性中断(例如由于目标重启而导致的计数器重置)会自动调整。

以下示例表达式返回范围向量中每个时间序列的两个最新数据点的最多 5 分钟的 HTTP 请求的每秒速率:

irate(http_requests_total{job="api-server"}[5m])

irate只应在绘制易失性快速移动计数器时使用。使用rate警报和缓慢移动的柜台,因为在房价短暂变化可以重设FOR条款和图表完全由罕见尖峰难以阅读。

注意,当irate()与 聚合运算符(例如sum())或随时间聚合的函数(以任何结尾的函数_over_time)组合时,总是先取irate()第一个,然后聚合。否则irate()在目标重新​​启动时无法检测到计数器重置。

label_join()

对于每个时间序列vlabel_join(v instant-vector, dst_label string, separator string, src_label_1 string, src_label_2 string, ...)连接所有src_labels 使用的所有值,separator并返回dst_label包含连接值的标签的时间序列。src_labels此功能中可以有任意数量。

此示例将返回一个向量,每个时间序列都有一个foo标签,其中a,b,c添加了值:

label_join(up{job="api-server",src1="a",src2="b",src3="c"}, "foo", ",", "src1", "src2", "src3")

label_replace()

对于每个时间序列vlabel_replace(v instant-vector, dst_label string, replacement string, src_label string, regex string)将正则表达式regex与标签匹配src_label。如果匹配,则返回时间序列,并将标签dst_label替换为扩展名 replacement$1替换为第一个匹配的子组,$2第二个匹配的子组等。如果正则表达式不匹配,则返回时间序列不变。

此示例将返回一个向量,每个时间序列都有一个foo 标签,其中a添加了值:

label_replace(up{job="api-server",service="a:c"}, "foo", "$1", "service", "(.*):.*")

ln()

ln(v instant-vector)计算所有元素的自然对数v。特殊情况是:

  • ln(+Inf) = +Inf
  • ln(0) = -Inf
  • ln(x < 0) = NaN
  • ln(NaN) = NaN

log2()

log2(v instant-vector)计算所有元素的二进制对数v。特殊情况相当于ln

log10()

log10(v instant-vector)计算所有元素的十进制对数v。特殊情况相当于ln

minute()

minute(v=vector(time()) instant-vector)以 UTC 为单位返回每个给定时间的分钟。返回值为 0 到 59。

month()

month(v=vector(time()) instant-vector)返回 UTC 中每个给定时间的一年中的月份。返回值为 1 到 12,其中 1 表示 1 月等。

predict_linear()

predict_linear(v range-vector, t scalar)使用简单的线性回归t,基于范围向量预测从现在开始的时间序列秒的值。v

predict_linear 应该只用于仪表。

rate()

rate(v range-vector)计算范围向量中时间序列的每秒平均增长率。单调性中断(例如由于目标重启而导致的计数器重置)会自动调整。此外,计算推断到时间范围的末端,允许错过刮擦或刮擦循环与范围的时间段的不完美对齐。

以下示例表达式返回范围向量中每个时间系列在过去 5 分钟内测量的每秒 HTTP 请求速率:

rate(http_requests_total{job="api-server"}[5m])

rate应该只用于计数器。它最适用于警报和缓慢移动计数器的图形。

注意,当rate()与聚合运算符(例如sum())或随时间聚合的函数(以任何结尾的函数_over_time)组合时,总是先取rate()第一个,然后聚合。否则rate()在目标重新​​启动时无法检测到计数器重置。

resets()

对于每个输入时间系列,resets(v range-vector)将提供的时间范围内的计数器重置次数作为即时向量返回。两个连续样本之间的值的任何减少都被解释为计数器重置。

resets 应该只用于计数器。

round()

round(v instant-vector, to_nearest=1 scalar)将所有元素的样本值舍入v为最接近的整数。通过四舍五入解决关系。可选to_nearest参数允许指定样本值应舍入的最接近的倍数。这个倍数也可能是一个分数。

scalar()

给定单元素输入向量,scalar(v instant-vector)将该单个元素的样本值作为标量返回。如果输入向量没有恰好一个元素,scalar则返回NaN

sort()

sort(v instant-vector) 返回按其样本值排序的向量元素,按升序排列。

sort_desc()

相同sort,但按降序排序。

sqrt()

sqrt(v instant-vector)计算所有元素的平方根v

time()

time()返回自 1970 年 1 月 1 日 UTC 以来的秒数。请注意,这实际上不会返回当前时间,而是返回计算表达式的时间。

timestamp()

timestamp(v instant-vector) 返回给定向量的每个样本的时间戳,作为自 1970 年 1 月 1 日 UTC 以来的秒数。

此功能已添加到 Prometheus 2.0 中

vector()

vector(s scalar)将标量返回s为没有标签的向量。

year()

year(v=vector(time()) instant-vector) 以 UTC 格式返回每个给定时间的年份。

<aggregation>_over_time()

以下函数允许聚合给定范围向量的每个系列随时间的变化并返回具有每系列聚合结果的即时向量:

  • avg_over_time(range-vector):指定时间间隔内所有点的平均值。
  • min_over_time(range-vector):指定时间间隔内所有点的最小值。
  • max_over_time(range-vector):指定时间间隔内所有点的最大值。
  • sum_over_time(range-vector):指定时间间隔内所有值的总和。
  • count_over_time(range-vector):指定时间间隔内所有值的计数。
  • quantile_over_time(scalar, range-vector):指定间隔中的值的φ-分位数(0≤φ≤1)。
  • stddev_over_time(range-vector):指定时间间隔内值的总体标准偏差。
  • stdvar_over_time(range-vector):指定时间间隔内值的总体标准差异。

请注意,即使值在整个时间间隔内的间隔不均匀,指定时间间隔内的所有值在聚合中的权重也相同。


接下来是 Prometheus 的一些查询示例

查询示例

简单的时间序列选择

返回包含指标的所有时间序列http_requests_total

http_requests_total

返回与所有指标的时间序列http_requests_total和给定 jobhandler标签:

http_requests_total{job="apiserver", handler="/api/comments"}

返回相同向量的整个时间范围(在本例中为 5 分钟),使其成为范围向量:

http_requests_total{job="apiserver", handler="/api/comments"}[5m]

请注意,导致范围向量的表达式不能直接绘制,而是在表达式浏览器的表格(“控制台”)视图中查看。

使用正则表达式,您只能为名称与特定模式匹配的作业选择时间序列,在本例中为所有以作为结尾的作业server。请注意,这会进行子字符串匹配,而不是完整的字符串匹配:

http_requests_total{job=~".*server"}

Prometheus 中的所有正则表达式都使用RE2 语法

要选择除 4xx 之外的所有 HTTP 状态代码,您可以运行:

http_requests_total{status!~"4.."}

使用功能,操作员等

使用http_requests_total 度量标准名称返回所有时间序列的每秒速率,在过去 5 分钟内测量:

rate(http_requests_total[5m])

假设http_requests_total时间序列都有标签job (按作业名称扇出)和instance(按作业实例扇出),我们可能想要总结所有实例的速率,因此我们得到更少的输出时间序列,但仍保留job维度:

sum(rate(http_requests_total[5m])) by (job)

如果我们有两个具有相同维度标签的不同指标,我们可以对它们应用二元运算符,并且两侧具有相同标签集的元素将匹配并传播到输出。例如,此表达式为每个实例返回 MiB 中未使用的内存(在虚构的群集调度程序上公开有关其运行的实例的这些度量标准):

(instance_memory_limit_bytes - instance_memory_usage_bytes) / 1024 / 1024

相同的表达式,但由应用程序总结,可以这样写:

sum(
  instance_memory_limit_bytes - instance_memory_usage_bytes
) by (app, proc) / 1024 / 1024

如果相同的虚构集群调度程序为每个实例公开了如下所示的 CPU 使用率指标:

instance_cpu_time_ns{app="lion", proc="web", rev="34d0f99", env="prod", job="cluster-manager"}
instance_cpu_time_ns{app="elephant", proc="worker", rev="34d0f99", env="prod", job="cluster-manager"}
instance_cpu_time_ns{app="turtle", proc="api", rev="4d3a513", env="prod", job="cluster-manager"}
instance_cpu_time_ns{app="fox", proc="widget", rev="4d3a513", env="prod", job="cluster-manager"}
...

…我们可以按应用程序(app)和进程类型(proc)分组排名前 3 位的 CPU 用户:

topk(3, sum(rate(instance_cpu_time_ns[5m])) by (app, proc))

假设此度量标准包含每个运行实例的一个时间系列,您可以计算每个应用程序的运行实例数,如下所示:

count(instance_cpu_time_ns) by (app)

 

 


IT 敢客 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:Grafana 中使用 Prometheus 的官方帮助文档翻译
喜欢 (7)
[313176056@qq.com]
分享 (0)
IT敢客
关于作者:
“我所做的一切都是为了方便我的生活~~~“
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
(2)个小伙伴在吐槽
  1. 博主写文辛苦了
    天津网站建设2018-12-14 15:11 回复 Windows 10 | Chrome 63.0.3239.108
    • IT敢客
      共同学习,不辛苦,哈哈
      IT敢客2018-12-14 15:20 回复 Windows 10 | Maxthon 浏览器5.5