6

我有cloud-init.log日志被发送到 CloudWatch,我想创建一个指标过滤器来提取报告的 Cloud Init 运行时间。

示例日志条目如下所示:

Jun 24 12:06:51 ip-x-x-x-x [CLOUDINIT] util.py[DEBUG]: cloud-init mode 'modules' took 295.097 seconds (294.83)

我想提取的价值是:295.097

这似乎很简单,因为took [number] seconds这条线是独一无二的。这个关于度量过滤器语法的指南似乎只显示了从 JSON 日志中提取值的示例,并且这个官方示例列表没有涵盖它。

根据文档,我想出类似的东西:

[..., "took", seconds]

会工作,但我没有太多的运气。

任何帮助将非常感激!

4

3 回答 3

7

您尝试的几乎是正确的,语法略有变化。

代替

[..., "took", seconds]

它应该是

[..., took="took", seconds, secondsword, secondsparentheses]

最后两个词不管它们是什么,我试着选择有用的名字来说明它们代表什么。

有了这个,seconds变量现在将包含295.097您可以在指标中使用的变量。

the...可以在开头或结尾使用,但似乎不能同时使用,这就是为什么我们必须在之后调用secondswordand secondsparentheses

于 2018-09-12T16:23:23.597 回答
1

稍微概括一下这个答案。
以空格分隔的日志行的 Metric 过滤器语法必须锚定在行首或行尾,您可以在另一端使用 ... 表示您不在乎有多少列那个方向。
给定具有以下空格分隔值
1 2 3 4 5 6
的日志行, 您可以像这样捕获第四列中的值
[,,,four,...]
表示您想要从开始的第 4 列中的值

[...,four,,]
表示您需要倒数第三列中的值。
测试这些模式,将显示$four=4

接受的答案是正确的,但不需要定义最后两个列名。他们只需要空的占位符,所以
[..., take="took", seconds, secondsword, secondsparentheses]
变成了
[...,took=took,seconds,,]
从技术上讲你甚至不需要 take=took if您知道每个日志行都是相同的语法。但是,添加 take=took 可确保您仅匹配从行尾算起的第 4 列中包含该单词的日志行,并且始终像这样始终匹配日志行中的至少一个已知项目可能是最安全的。

于 2021-05-06T23:45:17.477 回答
1

要提取值,我认为您需要将日志格式化为 json 或空格分隔格式。对于上面的示例,这很困难,因为您试图从消息中提取值。

这很难看,但这是可行的(在 Metric Filter 编辑器中的测试给出 $value=295.097):

[month, day, time, ip, process, module, name, mode, modules, type=took, value, therest]

您可能希望更改日志格式以简化事情。

于 2017-02-10T19:20:10.507 回答