使用 Telegraf 对度量指标进行指标过滤的通用表达式语言

导航至

Telegraf 是一个开源的插件驱动代理,用于收集、处理、聚合和写入时间序列数据。在收集指标时,通常需要过滤掉或传递具有特定名称、标签、字段或时间戳值的指标。

通用表达式语言 (CEL) 是一种开源语言,提供了一套用于表达式评估的语义。Kubernetes 用户可能已经熟悉这门语言,因为它用于声明验证规则、策略规则和其他约束或条件。

v1.27 中,Telegraf 现在可以解析 CEL 表达式以过滤指标。以下文章概述了用户如何利用 CEL,通过 Telegraf 使指标过滤变得比以往任何时候都更容易。

Telegraf 配置

新的 metricpass 选项启用 CEL 过滤。这与现有的 namepasstagpass 选项类似。

Telegraf 根据表达式评估指标。与表达式匹配的指标将被传递,而其他指标将被丢弃。

[[inputs.cpu]]
  metricpass = “fields.usage_idle < 90”

此选项适用于任何输入、输出、处理器和聚合器插件。对于输入,过滤发生在输入的最后,而对于其他插件类型,在运行这些插件之前执行过滤。

虽然 CEL 语言功能强大,但它不会更改指标。它只确定哪些指标应从输入或传递到其他插件。

通过示例介绍 CEL 语法

以下是一些示例,用于介绍 Telegraf 中 CEL 的使用。有关完整类型、逻辑和函数的集合,用户可以参考 CEL 存储库中的 cel-spec 语言定义。还有一个 CEL 讨论论坛,用于帮助解决有关语言的特定问题。

引用度量指标组件

为了过滤指标,用户可以引用度量指标的具体组件。考虑以下示例指标

example,host=a value=42 1686252961000000000

以下表格显示了如何引用度量指标的具体组件

组件 CEL 引用 示例
度量指标名称 name name == “example”
标签 tags tags.host == “a”
字段 fields fields.value > 0
时间戳 time time >= now() - duration(“24h”)

逻辑运算符

CEL 支持类似于 C 和 Go 风格的逻辑运算符进行比较。以下示例检查字段“id”是否存在且字段“id”包含子串“nwr”。

"id" in fields && fields.id.contains("nwr")

此示例确保指标名称不以“t”开头且标签“state”等于“on”。

!name.startsWith("t") || tags.state == "on"

数值运算

对于数值,用户可以进行算术和等式运算。例如

fields.value / 8 >= 1024
	fields.bits % 2 == 0

字符串运算

为了帮助测试字符串,用户可以使用一系列辅助函数。以下表格列出了一些常见的函数

函数 测试描述 示例
contains 字符串包含子串 tags.host.contains(“domain”)
endsWith 测试字符串后缀 tags.id.endsWith(“.com”)
lowerAscii 小写字符串 metric.name.lowerAscii()
matches 将字符串与正则表达式比较 tags.source.matches(“^[0-9a-zA-z-_]@[a-zA-Z0-9._-]*$”)
startsWith 测试字符串前缀 tags.host.startsWith(“subdomain”)
size 字符串长度 tags.id.size()

有关函数的完整列表,请查看 string.go 源文件,其中还包括示例。

时间操作

此类过滤的一个可能用例是删除早于特定日期的度量。CEL 包含各种辅助函数来分解日期。例如

time.getFullYear() == 2023

这些辅助函数的完整列表可在 CEL 标准定义列表 中找到。

此外,用户可以将当前时间与时间戳进行比较。使用这种方法,用户可以看到时间戳是否小于一天

time >= now() - duration(“24h”)

类型

要测试特定类型,type() 函数返回特定标签或字段的类型。这可能有助于确保字段是数值类型

type(fields.bits) in [double, int, uint]
type(fields.cluster) == string

第一行确保 bits 字段是数值类型,而第二行确保 cluster 字段是字符串。

性能影响

用户应记住,CEL 使用是有代价的。CEL 是一种解释型语言,在实现时使用开销。如果您只根据特定标签或度量名称进行过滤,请继续使用 namepass/namedroptagpass/tagdrop 配置选项以实现最佳性能。然而,在大多数情况下,这些 CEL 过滤器应该比使用 Starlark 处理器执行相同任务更快。

开始使用度量过滤和 Telegraf

随着在 v1.27 版本中添加了用于度量过滤的通用表达式语言,用户现在可以更轻松地自定义他们的度量。下载 Telegraf 并尝试今天的新 metricpass 选项!