【问题标题】:Aggregate logs by field value and plot as multiple series using AWS CloudWatch Insights使用 AWS CloudWatch Insights 按字段值聚合日志并绘制为多个系列
【发布时间】:2019-07-31 11:32:26
【问题描述】:

使用 AWS CloudWatch Insights 分析一些日志文件,我可以绘制在时间箱中聚合的计数:

| stats count(*) by bin(1h)

正如预期的那样,这会生成一个图表,聚合每个时间段中的所有日志。

我想按一个“组”字段拆分这些数据,值为 A 和 B。

| stats count(*) by group, bin(1h)

这会按预期返回跨时间段的日志计数,但可视化选项卡显示“没有可视化可用”。我希望它返回一个时间序列图,其中包含 A 组系列和 B 组系列。

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

【问题讨论】:

    标签: amazon-web-services amazon-cloudwatchlogs aws-cloudwatch-log-insights


    【解决方案1】:

    好的,我找到了一个非常笨拙的方法来解决这个问题。看来不行,你不能这样做

    | stats count(*) by group, bin(1h)
    

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

    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)
    

    在这里,我试图查看日志类型随时间的分布情况。我有三种格式的日志消息:“[ERROR]”、“[INFO]”和“[WARNING]”

    【讨论】:

    • 它不会给出我认为汤姆正在寻找的确切答案。我也面临同样的问题,但问题是组字段有多个值,所以列标题应该用这些值表示,对于查询解析“组”作为@group | 输出应该是这样的过滤器存在(@group)|统计计数(@group)按 bin(15m)分组
    • 时间 A B 2019-09-26T12:00:00.000+05:30 3 2 2019-09-26T12:30:00.000+05:30 1 2 但它会像这次一样打印 Group 2019- 09-26T12:00:00.000+05:30 5 2019-09-26T12:30:00.000+05:30 13
    • 这让我可以可视化我的两个不同领域。他们只是不能让事情变得容易。
    【解决方案2】:

    扩展@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)
    
    

    这方面的技巧是,像“status > 499”这样的表达式如果为假则返回 0,如果为真则返回 1,因此,将其添加到时间桶中可以模拟类似“count if [condition]”之类的东西

    在可视化选项卡上生成的示例图看起来也像。

    【讨论】:

    • 我们如何进一步按动词划分?在 Kibana 中,我可以像你一样有一个堆叠的条形图,但也可以按每个动词的计数堆叠。
    • 据我所知,至少到目前为止,您还不能使用 cloudwatch 可视化来做到这一点。可视化功能非常基础。绝对可以看到一些改进的东西
    • 这太棒了!我本能地像数据透视表一样完成查询(每个状态+bin 组合一行)。相反,通过这样的求和来创建每个 bin 一行一行的多列,我终于能够得到我想要的折线图和堆积面积图。
    【解决方案3】:

    @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)
    

    【讨论】:

    • 这个解决方案非常有用...我需要创建一个额外的维度。由于我在运行查询之前新建了“like”值,因此我能够让它工作!
    【解决方案4】:

    这是基于@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)
    

    结果:

    【讨论】:

      猜你喜欢
      • 2020-04-10
      • 2021-04-30
      • 2020-05-16
      • 1970-01-01
      • 2020-11-20
      • 1970-01-01
      • 1970-01-01
      • 2020-10-25
      • 1970-01-01
      相关资源
      最近更新 更多