使用通用表达式语言通过 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-_][email protected]$”)
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 选项!