我已经完成了对摘要学的记录。日志JSON包含请求的响应时间。使其成为名称为“ response_time”的JSON密钥。每个请求均由唯一ID标识,该ID由JSON密钥“ request_id”表示。以及以JSON键“ url”表示的URL。我需要根据以下情况在闲置频道上发出警报。
1)在10分钟的窗口中,如果有100个请求,并且如果超过5%的请求的响应时间超过100ms,则警告所有的“ URL”,“ request_id”和“ response_time”这些要求。 2)如果少于或等于5%的请求的响应时间超过100毫秒,则完全不要发出警报。 我写了这样的查询。
_sourceName=<my_source_name>
| json field=_raw "response_time" as response_time
| json field=_raw "request_id" as request_id
| if (num(response_time) > 100, 1, 0) as higher
| if (num(response_time) <= 100, 1, 0) as lower
| count as total_requests, sum(higher) as
response_time_greater_than_100, sum(lower) as
response_time_less_than_100
| (response_time_greater_than_100/total_requests) as failure_ratio
| where (failure_ratio > 0.05)
当超过5%的请求的response_time超过100毫秒时,上述查询将为我提供所有请求。但这给了我所有请求,而与响应时间无关。否则将不返回任何结果。
关于这个结果,我想使用“ response_time”> 100 ms的请求进一步过滤上面的查询。 只要有结果,就会显示两个选项卡。一个用于“消息”,另一个用于“聚合”。我想将“消息”选项卡中的字段发送到备用频道。如何实现呢?
答案 0 :(得分:2)
标签-汇总与邮件
首先,让我们澄清这两个选项卡。第一个(消息)包含所有这些原始日志行,这些行即为结果。第二个(聚合)是您实际分组查询的结果。请注意,您正在使用| count
,它是一个分组运算符(类似于SQL中的GROUP BY
)。
任何传出交互总是基于查询的实际结果(聚合)。原始行仅在用于检查的用户界面中可见(在API中也可见)。
实际查询
如果您只想获取响应时间> 100的所有请求,那么进行这样的查询就足够了:
_sourceName=<my_source_name>
| json field=_raw "response_time" as response_time
| json field=_raw "request_id" as request_id
| where response_time > 100
以声明方式发言,我理解您想要一些不同的东西: 获得大于100的所有响应,但前提是大于100的请求占总请求的5%以上,否则为空结果集。
_sourceName=<my_source_name>
| 1 as expected_failure_ratio_violation
| where [subquery:
_sourceName=<my_source_name>
| json field=_raw "response_time" as response_time
| json field=_raw "request_id" as request_id
| if (num(response_time) > 100, 1, 0) as higher
| if (num(response_time) <= 100, 1, 0) as lower
| count as total_requests, sum(higher) as response_time_greater_than_100,
sum(lower) as response_time_less_than_100
| (response_time_greater_than_100/total_requests) as failure_ratio
| where (failure_ratio > 0.05)
| count as expected_failure_ratio_violation
| compose expected_failure_ratio_violation
]
| json field=_raw "response_time" as response_time
| json field=_raw "request_id" as request_id
| where response_time > 100
它使用了一种技巧(将一个常量1
与一个子查询(expected_failure_ratio_violation
)中的违规次数进行匹配。
此外,作为提示-您在这里没有使用| timeslice
,根据我的经验,这是人们通常在这种情况下使用的。您可能想看看它。
免责声明:我目前在Sumo Logic工作