使用通用表达式语言通过 Telegraf 进行指标过滤
作者:Josh Powers / 产品
2023 年 6 月 22 日
导航至
Telegraf 是一个开源的插件驱动代理,用于收集、处理、聚合和写入时间序列数据。在收集指标时,通常会过滤掉或传递具有特定名称、标签、字段或时间戳值的指标。
通用表达式语言 (CEL) 是一种开源语言,它为表达式求值提供了一组语义。Kubernetes 用户可能已经熟悉这种语言,因为它用于声明验证规则、策略规则和其他约束或条件。
在 v1.27 中,Telegraf 现在能够解析 CEL 表达式来过滤指标。以下帖子概述了用户如何利用 CEL 比以往更轻松地使用 Telegraf 过滤指标。
Telegraf 配置
新的 metricpass
选项启用 CEL 过滤。这类似于现有的 namepass
或 tagpass
选项。
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/namedrop
和 tagpass/tagdrop
配置选项以获得最佳性能。但是,在大多数情况下,这些 CEL 过滤器应该比使用 Starlark 处理器执行相同任务更快。
开始使用指标过滤和 Telegraf
随着 v1.27 中添加了用于指标过滤的通用表达式语言,用户现在可以更轻松地自定义他们的指标。下载 Telegraf 并立即试用新的 metricpass
选项!