2017-06-28 47 views
0

我送customEvents到Azure應用程序的見解,是這樣的:警報使用Azure的見解和/或分析差錯率超過閾值的

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默認情況下不能這樣做,所以我想嘗試approach described here來編寫可能觸發警報的Analytics(分析)查詢。這是我已經能夠拿出最好的:

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. 返回「通過」即使沒有活動在一小時內(另一個警報將照顧沒有事件)
  2. 只在每小時內考慮每個Id的最終狀態。

由於寫入請求,如果沒有事件,查詢既不返回「PASSED」也不返回「FAILED」。

它還考慮到任何記錄與Status == 3000,這意味着,上面的例子將返回「失敗」(5超過了10記錄具有狀態3000),而在現實中只是出於1 4個IDS在結束了錯誤狀態。

有人可以幫我找出正確的查詢嗎?

(和可選的輔助問題:有沒有人安裝使用洞察的類似警告這是一個正確的做法?)

回答

1

如上所述,由於您只是在一個小時查詢,您不需要將timestamp裝箱,或者將其作爲您的聚合的一部分。
回答您的問題:

  1. 的方式在所有克服沒有數據將注入合成一行到你的餐桌,這將轉化爲一個成功的結果,如果沒有其它結果發現
  2. 如果你想您的通過/失敗標準基於每個ID的最終狀態,那麼您需要在summarize中使用argmax - 它將返回對應於最大時間戳的狀態。

所以包裹這一切:

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 

關於獎金的問題 - 你可以設置報警基於使用流量分析查詢。查詢here有關的問題

+0

爲了將來的參考,如果我不'bin'的時間戳,查詢總是返回一些東西(因爲總和返回0),所以綜合結果沒有幫助。因此,要麼保持垃圾箱,要麼,正如我最終所做的那樣,如果失敗==成功== 0,則返回「PASSED」。無論如何,謝謝你的好解釋 – madd0

1

我假定的查詢,如果您在小時沒有數據返回任何行,因爲timestamp bin = 1h(又名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,失敗= 0,成功= 0,所以失敗百分比的數學應該讓你回0失敗率,這應該讓你「通過」。

而不是嘗試它我不確定這是否工作,或如果沒有數據仍然返回你沒有行?

關於第二個問題,你可以使用類似

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

得到公正行(S)已經有一個小時內,最後事件的時間戳?