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