如何根据失败百分比在日志字段中创建警报?

时间:2019-06-04 07:26:33

标签: alert percentile sumologic

我已经完成了对摘要学的记录。日志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的请求进一步过滤上面的查询。 只要有结果,就会显示两个选项卡。一个用于“消息”,另一个用于“聚合”。我想将“消息”选项卡中的字段发送到备用频道。如何实现呢?

1 个答案:

答案 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工作