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

Posted

技术标签:

【中文标题】如何根据失败百分比在日志字段中创建警报?【英文标题】:How to create an alert the log fields based on the percentage of failures? 【发布时间】:2019-06-04 07:26:33 【问题描述】:

我在 sumologic 上完成了日志记录。日志 JSON 包含请求的响应时间。让它成为一个名为“response_time”的 JSON 键。每个请求都由唯一 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】:

标签 - 聚合与消息

首先,让我们澄清一下这两个选项卡。第一个(消息)包含所有这些产生结果的原始日志行。第二个(聚合)是您的实际查询与分组的结果。请注意,您使用的是| 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

【讨论】:

1) 此查询使用子查询。并且我想将子查询的结果作为实时的松弛警报。子查询无法提供实时警报。有没有办法避免子查询但仍然达到结果?? 如果不是实时警报我想运行这个预定的搜索。 Run Frequency 最少是 15 分钟。有什么办法可以缩短到 10 分钟?? 实时警报后的下一个频率是 15 分钟。

以上是关于如何根据失败百分比在日志字段中创建警报?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SQL 中创建带有百分比的总计行

在 MS ACCESS 中查找完成的字段百分比

在 Impala DB 中创建表作为选择百分比子查询

在 CSS 中创建结合百分比和静态(例如像素)值的网格的研究

如何在 MDX 中创建周期测量?

在 Rails / Freemium 中创建收费服务