0

我正在发送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")

但是,为了让我的警报正常工作,查询应该:

  1. 即使一小时内没有事件,也返回“PASSED”(另一个警报将处理没有事件的情况)
  2. 只考虑一个小时内每个Id的最终状态。

在写入请求时,如果没有事件,则查询既不返回“PASSED”也不返回“FAILED”。

它还考虑了任何带有 的记录Status == 3000,这意味着上面的示例将返回“FAILED”(10 条记录中有 5 条的状态为 3000),而实际上只有 4 个 Id 中的 1 个最终处于错误状态。

有人可以帮我找出正确的查询吗?

(以及可选的次要问题:是否有人使用 Insights 设置了类似的警报?这是正确的方法吗?)

4

2 回答 2

1

我假设如果您在一小时内没有数据,则查询不会返回任何行,因为timestamp bin = 1h(aka bin(timestamp,1h)) 不会返回任何垃圾箱?

但是,如果您只查询最后一小时,我认为您根本不需要时间戳上的 bin 吗?

如果没有你的数据,很难准确地复制,但是......你可以尝试类似的东西(注意语法错误):

customEvents
| where timestamp > ago(1h)
| extend isError = iff(toint(customDimensions.Status) == 3000, 1, 0)
| summarize totalCount = count(), failures = countif(isError == 1), successes = countif(isError ==0) 
| extend ratio = iff(totalCount == 0, 0, todouble(failures) / todouble(failures+successes))
| extend failure_Percent = ratio * 100
| project iff(failure_Percent < 50, "PASSED", "FAILED")

假设,摆脱小时分箱应该只给你一排

totalCount = 0,failures = 0,successes = 0,所以失败百分比的数学应该给你 0 失败率,这应该让你“通过”。

如果没有尝试,我不确定这是否有效,或者如果没有数据,仍然不会返回任何行?

对于你的第二个问题,你可以使用类似的东西

let maxTimestamp = toscalar(customEvents where timestamp > ago(1h)
| summarize max(timestamp));
customEvents | where timestamp == maxTimestamp ...
// ... more query here

只获取具有一小时内最后一个事件的时间戳的行?

于 2017-06-28T21:25:26.153 回答
1

如前所述,由于您只在一个小时内进行查询,因此您根本不需要将 bintimestamp或将其用作聚合的一部分。
要回答您的问题:

  1. 克服没有数据的方法是将合成行注入到您的表中,如果没有找到其他结果,它将转换为成功结果
  2. 如果您希望您的通过/失败标准基于每个 ID 的最终状态,那么您需要argmax在您的summarize- 它将返回与最大时间戳对应的状态。

所以总结一下:

customEvents
| where timestamp > ago(1h)
| extend isError = iff(toint(customDimensions.Status) == 3000, 1, 0)
| summarize argmax(timestamp, isError) by tostring(customDimensions.Id) 
| summarize failures = sum(max_timestamp_isError), successes = sum(1 - max_timestamp_isError)
| extend ratio = todouble(failures) / todouble(failures+successes)
| extend failure_Percent = ratio * 100
| project Result = iff(failure_Percent < 50, "PASSED", "FAILED"), IsSynthetic = 0
| union (datatable(Result:string, IsSynthetic:long) ["PASSED", 1])
| top 1 by IsSynthetic asc 
| project Result 

关于奖金问题 - 您可以使用 Flow 根据分析查询设置警报。有关相关问题/答案,请参见此处

于 2017-06-29T07:17:14.933 回答