听起来您想要一个小时内计数的变化率,然后确定该速率是否为负?正如您所描述的那样,一种方法是:
(fold-interval-metric 3600 folds/count
(fixed-event-window 2
(smap folds/difference
(where (neg? (:metric event))
email))))
这是有道理的。您可能会发现,如果您使用内置的时间导数函数ddt
并将其绘制成图表,您可以在更短的时间范围内发现这些问题。如果您的成功率在一小时的第三分钟降至零,那么 57 分钟是计算机在呼叫人类寻求帮助之前等待的很长一段时间。如果 15 分钟内的变化率接近负无穷大,那么您的服务很可能刚刚停止。
我喜欢包裹ddt
在指数加权移动平均线中ewma
,因此尖峰不会引发警报,并且这种模式的误报率极低:
(ewma 30 (ddt ...your stuff here...))
我经常想比较对服务的请求率与这种模式的响应,该模式使用ewma
ddt
and project
:
(pipe ↲ (splitp = service
"service:input" (ewma 30 ↲)
"service:output" (ewma 30 ↲)
bit-bucket) ;; throw out other services here
(project [(service "service:input")
(service "service:output")]
(smap folds/quotient-sloppy
(with :service "service-ratio-rate-of-change"
(ddt ...your streams here...)))))
如果请求不频繁,您将需要在所有这些示例中使用间隔,以确保警报不会在事件之间响起。如果您的事件不频繁,您可能还需要将事件的 :ttl 设置得足够高,以使它们在您聚合它们时不会过期。
ps:↲可以是你想要的任何符号,我只是选择了那个unicode字符。
pss:如果您仔细考虑这些事情,每季度一次警报的误报率应该是合理的。