在AWS Cloudwatch中按@reportId和@taskName分组并按日志查找持续时间

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

我的 Cloudwatch 日志从通过 Zappa 部署到 AWS Lambda 的 Django 应用程序具有以下格式:

  {
    taskName: foo.bar,
    @requestId: 98ccca67-46db-4793-9a62-412f9dc60ed5  
  }
  {
    @billedDuration: 24723.0, 
    @duration: 24722.88,
    @maxMemoryUsed: 2.49E8,
    @requestId: 98ccca67-46db-4793-9a62-412f9dc60ed5,
    @type: REPORT
  }

现在我想创建一个cloudwatch仪表板或者只是cloudwatch日志见解查询,这样我就可以找到每个任务花费的时间(按分钟/小时/天/月等分类)

example1: foo.bar - avg duration over last 1 hour is 30 seconds
example2: foo.baz - avg duration over last 1 hour is 20 seconds

等等。这里的关键是reportId,它是下一个日志并且有持续时间,原始消息有requestId但没有持续时间。所以我们需要分组或查找相邻的reportId。

我尝试了 GPT 和其他资源,但无法使其正常工作,提前致谢:)

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

CloudWatch 有两个限制

  1. 它没有连接
  2. 它不允许聚合两次,即查询中不能有两个
    |stats
    子句

这两个问题结合在一起,使您的查询无法编写。


为什么第二个限制在这种情况下很重要?因为您可以使用聚合来模拟

join
,例如

stats max(taskName) as _taskName, max(@duration) as _duration by @requestId

^ 这样您就可以将两个记录合并到一个演示文稿中。

要通过

taskName
构建统计数据,您可以编写类似的内容

stats max(taskName) as _taskName, max(@duration) as _duration by @requestId
| stats avg(_duration) as avg_duration by _taskName

但这意味着单个查询中有两个

stats
子句,这是不允许的。

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