使用 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-_]@[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/namedrop
和 tagpass/tagdrop
配置选项以实现最佳性能。然而,在大多数情况下,这些 CEL 过滤器应该比使用 Starlark 处理器执行相同任务更快。
开始使用度量过滤和 Telegraf
随着在 v1.27 版本中添加了用于度量过滤的通用表达式语言,用户现在可以更轻松地自定义他们的度量。下载 Telegraf 并尝试今天的新 metricpass
选项!