Alert 如何根据故障百分比在日志字段中创建警报?

Alert 如何根据故障百分比在日志字段中创建警报?,alert,percentile,sumologic,Alert,Percentile,Sumologic,我在sumologic上做了日志记录。日志JSON包含请求的响应时间。让它成为一个名为“response_time”的JSON键。每个请求都由唯一ID标识,由JSON键“request_ID”表示。以及由JSON键“URL”表示的URL。我需要根据以下情况对松弛通道发出警报 1) 在10分钟的窗口内,若有100个请求,并且超过5%的请求的响应时间超过100ms,则通知所有这些请求的“url”、“请求id”和“响应时间”。 2) 如果少于或等于5%的请求的响应时间超过100ms,则根本不发出警报。

我在sumologic上做了日志记录。日志JSON包含请求的响应时间。让它成为一个名为“response_time”的JSON键。每个请求都由唯一ID标识,由JSON键“request_ID”表示。以及由JSON键“URL”表示的URL。我需要根据以下情况对松弛通道发出警报

1) 在10分钟的窗口内,若有100个请求,并且超过5%的请求的响应时间超过100ms,则通知所有这些请求的“url”、“请求id”和“响应时间”。 2) 如果少于或等于5%的请求的响应时间超过100ms,则根本不发出警报。 我写了一个这样的查询

_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)
\u sourceName=
|json字段=_原始“响应时间”作为响应时间
|json字段=_原始“请求id”作为请求id
|如果(num(响应时间)>100,1,0)更高
|if(数值(响应时间)0.05)
当超过5%的请求的响应时间超过100毫秒时,上面的查询会给出所有请求。但不管响应时间如何,它都会给出所有请求。否则不会返回任何结果

除了这个结果,我还想用“响应时间”>100毫秒的请求进一步过滤上述查询。
每当有结果时,它都会给出两个选项卡。一个用于“消息”,另一个用于“聚合”。我想将“消息”选项卡中的字段发送到空闲通道。如何实现这一点?

选项卡-聚合与消息

首先,让我们澄清这两个标签。第一条(消息)包含生成结果的所有原始日志行。第二个(聚合)是实际查询分组的结果。请注意,您正在使用
|count
,这是一个分组运算符(类似于SQL中的
分组依据

任何传出的交互始终基于查询的实际结果(聚合)。原始行仅在用户界面中可见以供检查(在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
\u sourceName=
|json字段=_原始“响应时间”作为响应时间
|json字段=_原始“请求id”作为请求id
|其中响应时间>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
\u sourceName=
|1按预期\u失败\u比率\u违规
|其中[子查询:
_sourceName=
|json字段=_原始“响应时间”作为响应时间
|json字段=_原始“请求id”作为请求id
|如果(num(响应时间)>100,1,0)更高
|if(数值(响应时间)0.05)
|按预期计数\u失败\u比率\u违规
|合成预期的\u失败\u比率\u违规
]
|json字段=_原始“响应时间”作为响应时间
|json字段=_原始“请求id”作为请求id
|其中响应时间>100
它使用了一种技巧,将(一个常量)
1
与子查询中的违规计数(
expected\u failure\u ratio\u违规
)进行匹配

另外,作为一个提示,您在这里没有使用
| timeslice
,根据我的经验,这是人们在类似场景中通常使用的。你可能想看看


免责声明:我目前受雇于Sumo Logic

1)此查询使用子查询。我想把子查询的结果作为一个实时的松弛警报。子查询不可能提供实时警报。是否有办法避免子查询,但仍能获得结果?如果不是实时警报,我希望运行此计划搜索。运行频率至少为15分钟。有没有办法把时间缩短到10分钟?实时警报后的下一个频率是15分钟。