我正在发送customEvents
到 Azure Application Insights,如下所示:
timestamp | name | customDimensions
----------------------------------------------------------------------------
2017-06-22T14:10:07.391Z | StatusChange | {"Status":"3000","Id":"49315"}
2017-06-22T14:10:14.699Z | StatusChange | {"Status":"3000","Id":"49315"}
2017-06-22T14:10:15.716Z | StatusChange | {"Status":"2000","Id":"49315"}
2017-06-22T14:10:21.164Z | StatusChange | {"Status":"1000","Id":"41986"}
2017-06-22T14:10:24.994Z | StatusChange | {"Status":"3000","Id":"41986"}
2017-06-22T14:10:25.604Z | StatusChange | {"Status":"2000","Id":"41986"}
2017-06-22T14:10:29.964Z | StatusChange | {"Status":"3000","Id":"54234"}
2017-06-22T14:10:35.192Z | StatusChange | {"Status":"2000","Id":"54234"}
2017-06-22T14:10:35.809Z | StatusChange | {"Status":"3000","Id":"54234"}
2017-06-22T14:10:39.22Z | StatusChange | {"Status":"1000","Id":"74458"}
假设状态3000
是错误状态,我想Ids
在过去一小时内有一定百分比的最终处于错误状态时收到警报。
据我所知,Insights 默认无法做到这一点,所以我想尝试这里描述的方法来编写一个可以触发警报的分析查询。这是我能想到的最好的:
customEvents
| where timestamp > ago(1h)
| extend isError = iff(toint(customDimensions.Status) == 3000, 1, 0)
| summarize failures = sum(isError), successes = sum(1 - isError) by timestamp bin = 1h
| extend ratio = todouble(failures) / todouble(failures+successes)
| extend failure_Percent = ratio * 100
| project iff(failure_Percent < 50, "PASSED", "FAILED")
但是,为了让我的警报正常工作,查询应该:
- 即使一小时内没有事件,也返回“PASSED”(另一个警报将处理没有事件的情况)
- 只考虑一个小时内每个Id的最终状态。
在写入请求时,如果没有事件,则查询既不返回“PASSED”也不返回“FAILED”。
它还考虑了任何带有 的记录Status == 3000
,这意味着上面的示例将返回“FAILED”(10 条记录中有 5 条的状态为 3000),而实际上只有 4 个 Id 中的 1 个最终处于错误状态。
有人可以帮我找出正确的查询吗?
(以及可选的次要问题:是否有人使用 Insights 设置了类似的警报?这是正确的方法吗?)