使用AWS CloudWatch Insights按字段值聚合日志并绘制为多个序列

Tom*_*all 2 amazon-web-services amazon-cloudwatchlogs aws-cloudwatch-log-insights

使用AWS CloudWatch Insights分析一些日志文件后,我可以使用以下方式绘制时间仓中汇总的计数:

| stats count(*) by bin(1h)
Run Code Online (Sandbox Code Playgroud)

如预期的那样,这将产生一个图表,汇总每个时间段中的所有日志。

我想通过一个值是A和B的“组”字段来拆分此数据。

| stats count(*) by group, bin(1h)
Run Code Online (Sandbox Code Playgroud)

这将按预期返回跨时间段的日志计数,但是可视化选项卡显示“无可用可视化”。我想返回一个时间序列图,其中A组为一个系列,B组为一个系列。

我在哪里出错,或者这根本不可能?

Esk*_*ola 12

这是基于 @smth 等人的答案的另一种变体。无法根据值自动构建图表非常烦人,因此您需要明确提及每个值。

fields @timestamp, @message
| filter namespace like "audit-log"
| fields coalesce(`audit.client-version`, "legacy") as version
| parse version "legacy" as v0
| parse version "886ac066*" as v1
| parse version "93e021e2*" as v2
| stats count(*), count(v0), count(v1), count(v2) by bin(5m)
Run Code Online (Sandbox Code Playgroud)

结果: 上述查询的 CloudWatch Logs Insights 可视化

  • 截至 2021 年,仍然无法自动执行此操作吗?我有超过 30 个不同的值,将来可能会有更多,不幸的是,这对我来说不是一个选择:( (2认同)

Jar*_*art 10

@smth 描述的解决方法还有一个扩展,可以支持比count(). 下面的示例显示了一段时间内不同实例的 CPU 使用情况:

| fields (instance_id like "i-instance_1") as is_instance_1, (instance_id like "i-instance_2") as is_instance_2
| stats sum(cpu * is_instance_1) as cpu_1, sum(cpu * is_instance_2) as cpu_2 by bin(5m)
Run Code Online (Sandbox Code Playgroud)

  • 这个解决方案非常有用......我本质上需要创建一个额外的维度。由于我在运行查询之前添加了“like”值,因此我能够使其工作! (2认同)

6ug*_*gr3 8

扩展@smth的样本,我通常做的有点不同,

通过此查询,我遵循标准 nginx 访问日志上随时间聚合的状态代码的趋势

fields @timestamp, @message
| parse @message '* - * [*] "* * *" * * "-" "*"' as host, identity, dateTimeString, httpVerb, url, protocol, status, bytes, useragent
| stats count (*) as all, sum ( status < 299 ) as c_s200, sum ( status > 299 and status < 399 ) as c_s300, sum ( status > 399 and status < 499 ) as c_s400, sum ( status > 499 ) as c_s500 by bin (1m)

Run Code Online (Sandbox Code Playgroud)

诀窍在于,像“status > 499”这样的表达式如果为假则返回 0,如果为真则返回 1,因此,将它添加到时间桶上可以模拟类似“count if [condition]”之类的东西

在可视化选项卡上,生成的示例图也是如此。

在 1 分钟存储桶上聚合的每个 stausCode 的数量

  • 据我所知,至少到目前为止,您还不能使用 cloudwatch 可视化来做到这一点。可视化功能非常基础。绝对可以看到一些改进 (2认同)

小智 5

好吧,我找到了一种解决问题的方法。看来不,你不能做

| stats count(*) by group, bin(1h)
Run Code Online (Sandbox Code Playgroud)

但是,您可以使用解析来人为地创建新变量,如下所示:

parse "[E*]" as @error
| parse "[I*]" as @info
| parse "[W*]" as @warning
| filter ispresent(@warning) or ispresent(@error) or ispresent(@info)
| stats count(@error) as error, count(@info) as info, count(@warning) as warning by bin(15m)
Run Code Online (Sandbox Code Playgroud)

在这里,我试图查看日志类型随时间的分布。我有三种格式的日志消息:“ [错误]”,“ [信息]”和“ [警告]”

  • 这让我能够想象我的两个不同领域。他们只是不能让事情变得容易,不是吗? (2认同)