获取指定源请求处理时间的CloudWatch Insights查询需求
问题描述
我的应用每个请求会生成两条日志事件,格式示例如下:
日志事件1----> Found Source : A | CorrelationId : GuidA
日志事件2----> Total Processing Time : 15 | CorrelationId : GuidA
日志事件3----> Found Source : B | CorrelationId : GuidB
日志事件4----> Total Processing Time : 35 | CorrelationId : GuidB
日志事件5----> Found Source : B | CorrelationId : GuidC
日志事件6----> Total Processing Time : 45 | CorrelationId : GuidC
需要编写CloudWatch Insights查询语句,获取指定源(比如源为B)的所有请求处理时间,返回结果需包含Processing Time和CorrelationId字段,格式如下:
| Processing Time | CorrelationId |
|---|---|
| 35 | GuidB |
| 45 | GuidC |
尝试过嵌套查询,但CloudWatch Insights不支持子查询,求可行方案。
解决方案
可以利用CloudWatch Insights的字段解析和分组统计能力来实现,具体查询语句如下:
fields @message | parse @message "Found Source : * | CorrelationId : *" as Source, CorrelationId | parse @message "Total Processing Time : * | CorrelationId : *" as ProcessingTime, CorrelationId | stats max(ProcessingTime) as "Processing Time" by CorrelationId, Source | filter Source = "B" | display "Processing Time", CorrelationId
语句解释:
- 先提取日志的原始消息内容,为后续解析做准备
- 用两次解析规则,分别从两类日志里提取出
Source、CorrelationId和ProcessingTime字段——同一个请求的两条日志会通过CorrelationId自动关联到同一条记录中 - 按
CorrelationId和Source分组,取出每组的处理时间(因为每个请求对应唯一的处理时间,用max/min/first任意一个函数都能拿到正确值) - 过滤出源为B的请求记录
- 最后指定要显示的字段及顺序,输出符合需求的格式
如果要查询其他源,只需要修改filter Source = "B"中的值即可。
内容的提问来源于stack exchange,提问作者Vinit Divekar
相关产品推荐
相关产品推荐

