我有四个月的日志,需要一些内部流程才能完成。
问题是,这个时间以不同的单位给出(毫秒、秒、分钟),具体取决于花费的时间(不是我的决定,这是遗留代码)。
示例:
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:也欢迎有关图表本身的建议。
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 文档。