根据另一个解析字段的值转换解析字段

问题描述 投票:0回答:1

我有四个月的日志,需要一些内部流程才能完成。
问题是,这个时间以不同的单位给出(毫秒、秒、分钟),具体取决于花费的时间(不是我的决定,这是遗留代码)。
示例:

Process finished after 732 ms
Process finished after 3.53 s
Process finished after 10.84 min

我想使用 Log Insights 获取此时间分布的图形表示。

  • 我知道如何
    filter @message like /Process finished after/
    只获取我需要的消息。
  • 我知道如何
    parse @message " after * *" as t_elapsed, t_unit
    将时间和单位提取到变量中。
  • 知道如何将所有值转换为同一单位(例如,如果
    t_elapsed
    是“毫秒”,则将
    t_unit
    除以1000,如果
    t_unit
    是“分钟”,则将其乘以60 ,或者如果
    t_unit
    是“s”,则保持原样)
  • 不确定如何以看起来像分布的方式绘制值的图表。也许类似于
    stats count(*) as c by ceil(t_elapsed)
    的条形可视化?但这显然需要所有
    t_elapsed
    值都采用相同的单位...

因此,如果我设法将所有

t_elapsed
值转换为秒,我想我将能够获得正确的图表。

有什么建议吗?

PS:也欢迎有关图表本身的建议。

amazon-web-services aws-cloudwatch-log-insights
1个回答
0
投票

AWS CloudWatch Logs Insights 不支持 SQL 等条件语句,但我是这样解决的:

由于时间单位(在您的示例中)仅限于 s、ms 和 min,因此可以显式解析持续时间(t_elapsed_ms、t_elapsed_s 和 t_elapsed_min)。
再次使用 fields 语句,我为转换后的值创建了新字段。幸运的是,算术运算适用于对我们有利的 null 值,如果其中一个操作数为 null,则返回 null。
最后,使用合并显示,唯一非空 t_elapsed* 字段返回为 elapsed_s

fields @timestamp, @message, @logStream, @log
| parse @message " after * ms" as t_elapsed_ms
| parse @message " after * s" as t_elapsed_s
| parse @message " after * min" as t_elapsed_min
| fields t_elapsed_min / 60 as t_elapsed_min_as_s, t_elapsed_ms / 1000 as t_elapsed_ms_as_s
| display coalesce(t_elapsed_min_as_s, t_elapsed_ms_as_s, t_elapsed_s) as elapsed_s
| sort @timestamp desc
| limit 1000

请参阅有关 CloudWatch Logs Insights 服务的布尔值、比较、数字、日期时间和其他函数的 AWS 文档。

这是我的测试:enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.