“ExtendedPromQL” - 罗曼·哈夫罗年科 (Roman Khavronenko) 报告的文字记录

我建议阅读罗曼·哈夫罗年科 (Roman Khavronenko) 的报告“ExtendedPromQL”的文字记录

“ExtendedPromQL” - 罗曼·哈夫罗年科 (Roman Khavronenko) 报告的文字记录

简单介绍一下我。 我的名字是罗马。 我在 CloudFlare 工作,住在伦敦。 但我也是 VictoriaMetrics 的维护者。
而我就是作者 ClickHouse 插件 对于格拉法纳和 ClickHouse-代理 是 ClickHouse 的一个小型代理。

“ExtendedPromQL” - 罗曼·哈夫罗年科 (Roman Khavronenko) 报告的文字记录

我们将从第一部分开始,即“翻译困难”,在其中我将谈论任何语言甚至只是一种交流语言都非常重要的事实。 因为这是您向另一个人或系统传达想法的方式,也是您提出请求的方式。 互联网上的人们正在争论哪种语言更好——java 还是其他语言。 对于我自己来说,我认为有必要选择一项任务,因为这一切都是具体的。

“ExtendedPromQL” - 罗曼·哈夫罗年科 (Roman Khavronenko) 报告的文字记录

让我们从头开始吧。 什么是 PromQL? PromQL 是 Prometheus 查询语言。 这就是我们在 Prometheus 中形成查询来获取时间序列数据、时间序列的方式。

“ExtendedPromQL” - 罗曼·哈夫罗年科 (Roman Khavronenko) 报告的文字记录

什么是时间序列数据? 从字面上看,这是三个参数。

它们是:

  • 我们在看什么。
  • 当我们看它的时候。
  • 以及它表现出什么价值。

“ExtendedPromQL” - 罗曼·哈夫罗年科 (Roman Khavronenko) 报告的文字记录

如果你看一下这个图表(这个图表来自我的手机,它显示了我的步数统计),那么在这里你可以快速回答这些问题。

我们正在研究步骤。 当我们看到它时,我们就看到了意义,也看到了时间。 也就是说,看这张图,您可以轻松地说,周日我走了大约 15 步。 这是时间序列数据。

“ExtendedPromQL” - 罗曼·哈夫罗年科 (Roman Khavronenko) 报告的文字记录

现在让我们将它们“分解”(转换)为表形式的另一个数据模型。 这里也有我们正在查看的内容。 这里我添加了一些额外的数据,我们将其称为元数据,也就是说,经历的不是我,而是两个人,例如Jay和Silent Bob。 这就是我们正在寻找的; 它显示什么以及何时显示该值。

“ExtendedPromQL” - 罗曼·哈夫罗年科 (Roman Khavronenko) 报告的文字记录
现在让我们尝试将所有这些数据存储在数据库中。 例如,我采用了 ClickHouse 语法。 在这里,我们创建一个名为“步骤”的表,即我们正在查看的表。 有一段时间,当我们审视它时; 它显示的内容以及我们将存储其身份的一些元数据:Jay 和 Silent Bob。

“ExtendedPromQL” - 罗曼·哈夫罗年科 (Roman Khavronenko) 报告的文字记录

为了尝试将这一切可视化,我们将使用 Grafana,因为首先,它很漂亮。

“ExtendedPromQL” - 罗曼·哈夫罗年科 (Roman Khavronenko) 报告的文字记录

我们也将使用这个插件。 有两个原因。 第一个是因为我写的。 我确切地知道从 ClickHouse 中提取时间序列数据并在 Grafana 中显示它有多么困难。

“ExtendedPromQL” - 罗曼·哈夫罗年科 (Roman Khavronenko) 报告的文字记录

我们将显示在图形面板中。 这是 Grafana 中最受欢迎的面板,显示价值与时间的关系,因此我们只需要两个参数。

“ExtendedPromQL” - 罗曼·哈夫罗年科 (Roman Khavronenko) 报告的文字记录
让我们编写最简单的查询 - 如何在 Grafana 中显示步骤统计信息,并将这些数据存储在 ClickHouse 中我们创建的表中。 我们编写了这样一个简单的查询。 我们从步骤中进行选择。 我们选择一个值并选择这些值的时间,即我们讨论的相同的三个参数。

“ExtendedPromQL” - 罗曼·哈夫罗年科 (Roman Khavronenko) 报告的文字记录

结果,我们得到了这张图。 谁知道他为什么这么奇怪?

“ExtendedPromQL” - 罗曼·哈夫罗年科 (Roman Khavronenko) 报告的文字记录

没错,你需要按时间排序。

“ExtendedPromQL” - 罗曼·哈夫罗年科 (Roman Khavronenko) 报告的文字记录

最终我们得到了一个更好但仍然奇怪的时间表。 谁知道为什么? 没错,有两个参与者,我们在 Grafana 中给出了两个时间序列,因为如果我们再次处理数据模型,那么每个时间序列都是名称和所有标签键值的唯一组合。

“ExtendedPromQL” - 罗曼·哈夫罗年科 (Roman Khavronenko) 报告的文字记录

因此,我们需要选择一个特定的人。 我们选择杰伊。

“ExtendedPromQL” - 罗曼·哈夫罗年科 (Roman Khavronenko) 报告的文字记录

并再次绘制。 现在图表看起来就像事实一样。 现在这是一个正常的时间表,一切都进展顺利。

“ExtendedPromQL” - 罗曼·哈夫罗年科 (Roman Khavronenko) 报告的文字记录

而且,您可能知道如何做同样的事情,但是在 Prometheus 中通过 PromQL。 大致是这样的。 容易一点。 让我们把这一切分解一下。 我们采取了步骤。 并由杰伊过滤。 我们在这里没有指定我们需要获取一个值,并且我们没有选择时间。

“ExtendedPromQL” - 罗曼·哈夫罗年科 (Roman Khavronenko) 报告的文字记录

现在让我们尝试计算 Jay 或 Silent Bob 的移动速度。 在 ClickHouse 中,我们需要执行 runningDifference,即计算点对之间的差异并将它们除以时间以获得准确的速度。 该请求看起来像这样。

“ExtendedPromQL” - 罗曼·哈夫罗年科 (Roman Khavronenko) 报告的文字记录

他将显示大约这些值,即 Silent Bob 或 Jay 大约每秒 1,8 步。

“ExtendedPromQL” - 罗曼·哈夫罗年科 (Roman Khavronenko) 报告的文字记录

在《普罗米修斯》中你也知道如何去做。 比以前容易多了。

“ExtendedPromQL” - 罗曼·哈夫罗年科 (Roman Khavronenko) 报告的文字记录为了使其在 Grafana 中也很容易完成,我添加了这样一个看起来与 PromQL 非常相似的包装器。 它被称为“速率宏”,或者任何你想要的名称。 在 Grafana 中,你只需写“rate”,但在内心深处,它会转化为如此大的请求。 您甚至不必看它,它就在那里,但您可以节省大量时间,因为编写如此庞大的 SQL 查询总是很昂贵的。 你很容易犯错误,然后很长一段时间都不明白发生了什么。

“ExtendedPromQL” - 罗曼·哈夫罗年科 (Roman Khavronenko) 报告的文字记录

这是一个甚至无法放在一张幻灯片上的查询,我什至不得不将其分成两列。 这也是 ClickHouse 中的一个请求,它具有相同的速率,但对于两个时间序列:Silent Bob 和 Jay,因此我们在面板上有两个时间序列。 在我看来,这已经非常困难了。

“ExtendedPromQL” - 罗曼·哈夫罗年科 (Roman Khavronenko) 报告的文字记录

根据普罗米修斯的说法,这将是总和(比率)。 对于 ClickHouse,我制作了一个名为 RateColumns 的单独宏,它看起来像 Prometheus 查询。

“ExtendedPromQL” - 罗曼·哈夫罗年科 (Roman Khavronenko) 报告的文字记录

我们发现 PromQL 看起来非常酷,但它当然也有局限性。

它们是:

  • 有限选择。
  • 边缘连接。
  • 没有支持。

如果你已经使用它很长时间了,那么你就会知道,有时在 PromQL 中做一些事情是非常困难的,而在 SQL 中你几乎可以做所有的事情,因为我们刚才谈到的所有这些选项都可以在 SQL 中完成。 但使用起来会方便吗? 这让我觉得最强大的语言并不总是最方便的。

“ExtendedPromQL” - 罗曼·哈夫罗年科 (Roman Khavronenko) 报告的文字记录

因此,有时您需要为任务选择一种语言。 这就像蝙蝠侠和超人之间的战斗。 很明显,超人更强,但蝙蝠侠能够击败他,因为他更实际并且清楚地知道自己在做什么。

“ExtendedPromQL” - 罗曼·哈夫罗年科 (Roman Khavronenko) 报告的文字记录

下一部分是扩展 PromQL。

“ExtendedPromQL” - 罗曼·哈夫罗年科 (Roman Khavronenko) 报告的文字记录

再次关于VictoriaMetrics。 什么是维多利亚指标? 这是一个时间序列数据库,它是开源的,我们分发它的单一版本和集群版本。 根据我们的基准测试,它是目前市场上最快的,并且在压缩方面相似,即生活中的人们报告每个点的压缩约为 0,4 字节,而 Prometheus 为 1,2-1,4。

我们不仅支持普罗米修斯。 我们支持 InfluxDB、Graphite、OpenTSDB。

您可以在我们这里“写入”,即可以传输旧数据。

我们还与 Prometheus 和 Grafana 完美配合,即我们支持 PromQL 引擎。 在 Grafana 中,您只需将 Prometheus 端点更改为 VictoriaMetrics,所有仪表板都会像以前一样工作。

但您也可以使用 VictoriaMetrics 提供的附加芯片。

我们将快速浏览我们添加的功能。

“ExtendedPromQL” - 罗曼·哈夫罗年科 (Roman Khavronenko) 报告的文字记录

省略间隔参数 - 您可以在 Grafana 中跳过参数间隔。 当你不想在面板放大/缩小时得到奇怪的图形时,建议使用变量 $__interval。 这是 Grafana 的内部更改,它自行选择数据范围。 VictoriaMetrics 本身可以理解这个范围应该是多少。 而且您不必更新所有请求。 这会容易得多。

“ExtendedPromQL” - 罗曼·哈夫罗年科 (Roman Khavronenko) 报告的文字记录

第二个功能是区间参考。 您可以在表达式中使用此间距。 你可以乘法、除法、转移、引用它。

“ExtendedPromQL” - 罗曼·哈夫罗年科 (Roman Khavronenko) 报告的文字记录

接下来是汇总函数族。 汇总函数可将任何时间序列转换为三个独立的时间序列。 它们是最小值、最大值和平均值。 我发现它非常方便,因为有时它可以显示一些离群值(异常)和不准确之处。

“ExtendedPromQL” - 罗曼·哈夫罗年科 (Roman Khavronenko) 报告的文字记录

如果您只是进行愤怒或评级,那么您可能会错过一些时间序列不符合您预期的情况。 使用此函数更容易看到,假设 max 与 avg 相差很多。

“ExtendedPromQL” - 罗曼·哈夫罗年科 (Roman Khavronenko) 报告的文字记录

接下来是默认变量。 默认值 - 这意味着如果我们目前没有时间序列,我们需要在 Grafana 中绘制什么值。 什么时候发生? 假设您导出一些错误指标。 而且您拥有一个非常酷的应用程序,当您启动时,您没有任何错误,甚至在接下来的三个小时甚至一天内都没有错误。 您还拥有显示从成功到错误之间关系的仪表板。 他们不会向您显示任何内容,因为您没有错误指标。 默认情况下,您可以指定任何内容。

“ExtendedPromQL” - 罗曼·哈夫罗年科 (Roman Khavronenko) 报告的文字记录

Keep_last_Value - 保存指标的最后一个值(如果丢失)。 如果 Prometheus 在下一次抓取后 5 分钟内没有找到它,那么我们将在这里记住它的最后一个值,并且您的图表将不会再次损坏。

“ExtendedPromQL” - 罗曼·哈夫罗年科 (Roman Khavronenko) 报告的文字记录

Scrape_interval - 显示 Prometheus 收集有关您的指标的数据的频率以及频率。 例如,您可以在这里看到通行证。

“ExtendedPromQL” - 罗曼·哈夫罗年科 (Roman Khavronenko) 报告的文字记录
标签替换是一个流行的功能。 但我们认为这有点复杂,因为它需要整数参数。 而且你不仅需要记住 5 个参数,还需要记住它们的顺序。
“ExtendedPromQL” - 罗曼·哈夫罗年科 (Roman Khavronenko) 报告的文字记录
因此,为什么不让它们变得更简单呢? 也就是说,将其分解为语法清晰的小函数。

“ExtendedPromQL” - 罗曼·哈夫罗年科 (Roman Khavronenko) 报告的文字记录

现在是最有趣的。 为什么我们认为它是扩展的 PromQL? 因为我们支持通用表表达式。 您可以关注二维码(https://github.com/VictoriaMetrics/VictoriaMetrics/wiki/ExtendedPromQL),请参阅游乐场中的示例链接,您可以直接在 VictoriaMetrics 中运行查询,而无需仅将其安装在浏览器中。

“ExtendedPromQL” - 罗曼·哈夫罗年科 (Roman Khavronenko) 报告的文字记录

还有,这是什么? 上面的这个请求是一个相当受欢迎的请求。 我认为在许多公司的任何仪表板中,您对所有内容都使用相同的过滤器。 通常是这样。 但是,当您需要添加一些新的过滤器时,您必须更新每个面板,或者下载仪表板,以 JSON 打开它,进行查找替换,这也需要时间。 为什么不将该值存储在变量中并重用它? 在我看来,它看起来更简单、更清晰。

“ExtendedPromQL” - 罗曼·哈夫罗年科 (Roman Khavronenko) 报告的文字记录

例如,当我需要在所有请求中更新 Grafana 中的过滤器时,仪表板可能很大,甚至可能有多个。 我想如何在 Grafana 中解决这个问题?

“ExtendedPromQL” - 罗曼·哈夫罗年科 (Roman Khavronenko) 报告的文字记录

我这样解决这个问题:我创建一个 commonFilter 并在其中定义此过滤器,然后在查询中重用它。 但如果您现在执行相同的操作,它将不起作用,因为 Grafana 不允许您在查询变量中使用变量。 这有点奇怪。

“ExtendedPromQL” - 罗曼·哈夫罗年科 (Roman Khavronenko) 报告的文字记录

所以我做了一个选项,允许你这样做。 如果您感兴趣或想要这样的功能,那么如果您不喜欢这个想法,就支持或不喜欢。 https://github.com/grafana/grafana/pull/16694

“ExtendedPromQL” - 罗曼·哈夫罗年科 (Roman Khavronenko) 报告的文字记录

有关 PromQL 扩展的更多信息。 这里我们不仅定义了一个变量,而且直接定义了整个函数。 我们称之为 ru(资源使用)。 该函数接受免费资源、资源限制和过滤器。 语法看起来很简单。 使用这个函数并计算我们拥有的可用内存的百分比非常容易。 也就是说,我们有多少内存,有什么限制以及如何过滤。 如果您要使用相同的过滤器来编写所有内容,那么看起来会好得多,因为它会变成一个非常非常大的查询。

“ExtendedPromQL” - 罗曼·哈夫罗年科 (Roman Khavronenko) 报告的文字记录

这是一个如此巨大的请求的例子。 它来自 Grafana 的官方 NodeExporter 仪表板。 但我真的不明白这里发生了什么。 当然,如果你仔细观察的话我会理解,但是括号的数量会立即降低理解这里发生的事情的动机。 为什么不让它变得更简单、更清晰呢?

“ExtendedPromQL” - 罗曼·哈夫罗年科 (Roman Khavronenko) 报告的文字记录

例如,像这样突出显示变量中重要的事物或部分。 然后做你的基础数学。 这已经更像是编程了,这也是我希望将来在 Grafana 中看到的。

“ExtendedPromQL” - 罗曼·哈夫罗年科 (Roman Khavronenko) 报告的文字记录

这是第二个例子,说明如果我们已经有了这个 ru 函数,并且它已经直接存在于 VictoriaMetrics 中,我们如何使其变得更加容易。 然后您只需传递在 CTE 中声明的缓存值即可。

“ExtendedPromQL” - 罗曼·哈夫罗年科 (Roman Khavronenko) 报告的文字记录

我已经谈到使用正确的编程语言是多么重要。 而且,也许每家公司的 Grafana 都在发生着不同的事情。 而且,可能您仍然向开发人员授予 Grafana 访问权限,而开发人员则自行执行一些操作。 他们都以不同的方式做到这一点。 但我希望它在某种程度上是相同的,即降低到一个共同的标准。

假设您不仅有系统工程师,甚至可能还有专家、开发运营人员或 SRE。 也许您有知道什么是监控、什么是 Grafana 的专家,也就是说,他们已经从事此工作多年,并且确切地知道如何正确执行此操作。 他们已经写了 100 遍并向所有人解释,但由于某种原因没有人听。

如果他们可以将这些知识直接放入 Grafana 中,以便其他用户可以重用这些功能会怎么样? 如果需要计算可用内存的百分比,那么他们只需应用该函数即可。 但是,如果出口商的创建者及其产品还提供了一组功能,如何使用他们的指标,因为他们确切地知道这些指标是什么以及如何正确计算它们,该怎么办?

这个其实并不存在。 这是我自己做的。 这是 Grafana 中的库支持。 假设制作 NodeExporter 的人做了我所描述的事情。 并且还提供了一组功能。

“ExtendedPromQL” - 罗曼·哈夫罗年科 (Roman Khavronenko) 报告的文字记录

也就是说,它看起来像这样。 您将此库连接到 Grafana,然后进行编辑,这里使用 JSON 非常简单地说明如何使用此指标。 也就是说,一些函数、它们的描述以及它们展开的内容。

“ExtendedPromQL” - 罗曼·哈夫罗年科 (Roman Khavronenko) 报告的文字记录

在我看来,这可能很有用,因为这样你就可以像那样在 Grafana 中编写。 Grafana“告诉”你,某个库中有某个函数——让我们使用它。 我认为那会非常酷。

“ExtendedPromQL” - 罗曼·哈夫罗年科 (Roman Khavronenko) 报告的文字记录

关于 VictoriaMetrics 的一些信息。 我们做了很多有趣的事情。 阅读我们关于压缩的文章,关于我们与其他时间序列数据应用程序的竞争,关于如何使用 PromQL 的解释,因为这方面还有更多的初学者,以及关于垂直可扩展性和关于与 Thanos 的对抗。

“ExtendedPromQL” - 罗曼·哈夫罗年科 (Roman Khavronenko) 报告的文字记录

问题:

我将从一个简单的生活故事开始我的问题。 当我第一次开始使用 Grafana 时,我写了一个非常有说服力的 5 行查询。 最终结果是一个非常有说服力的图表。 该图几乎已投入生产。 但经过仔细检查,结果发现这张图表显示的绝对是无稽之谈,与现实无关,尽管数字落在我们预期的范围内。 还有我的问题。 我们有库,我们有函数,但是我们如何为 Grafana 编写测试呢? 您编写了一个影响业务决策的复杂查询 - 订购真实的服务器容器或不订购。 而且我们知道,这个绘制图表的函数与事实类似。 谢谢。

谢谢你的提问。 这里有两个部分。 首先,根据我的经验,我的印象是,大多数用户在查看图表时并不理解他们所显示的内容。 不知何故,人们非常擅长为图表上发生的任何异常找到借口,即使它是函数内部的错误。 第二部分 - 在我看来,使用此类函数会更适合解决您的问题,而不是每个开发人员都进行自己的容量规划并有一定概率犯错误。

如何检查?

如何检查? 可能不会。

作为 Grafana 中的测试。

那么格拉法纳呢? Grafana 将此请求直接转换为数据源。

通过添加一点参数。

不,Grafana 中没有添加任何内容。 可能有GET参数,比如step。 它没有显式指定,但您可以覆盖它,您不能覆盖它,但它会自动添加。 你不在这里编写测试。 我认为您不应该依赖 Grafana 作为事实来源。

感谢您的报告! 感谢您的压缩! 您还记得在图表中映射变量时,在 Grafana 中您不能在变量中使用变量。 你明白我的意思吗?

是。

当我想在 Grafana 中发出警报时,这最初是一个令人头痛的问题。 您需要分别对每个主机进行警报。 这是您所做的事情,它对 Grafana 中的警报有用吗?

如果 Grafana 不以其他方式访问变量,那么它会起作用。 但我的建议是根本不要在Grafana中使用警报,你最好使用alertmanager。

是的,我使用它,但在 Grafana 中设置似乎更容易,但感谢您的提示!

来源: habr.com

添加评论