首页 > 解决方案 > 获取 Kusto / Application Insights 中每个 bin 的并发请求数

问题描述

我想知道在 Azure Application Insights 中任何给定的秒数当前正在执行多少请求。

例如,如果请求 1 从 10:00:00 开始并在 10:00:03 结束(时间戳为 10:00:00,持续时间为 3999ms),则应将其计入 10:00:00、10 的行中:00:01、10:00:02 和 10:00:03

输出应该是这样的:

| timestamp               | count_ |
| ----------------------- | ------ |
| 0000-00-00T00:00:00.000 | 254    |
| 0000-00-00T00:00:00.001 | 345    |
| 0000-00-00T00:00:00.002 | 216    |

我想我可以使用join运算符来处理秒表,但我不能使用类似on $right.timestamp >= $left.timestamp and $right.timestamp + duration < $left.timestampkusto 回复的内容join: Only equality is allowed in this context.

那么如何通过时间戳bin获取并发请求(或依赖项)?

标签: azure-application-insightsazure-data-explorerkql

解决方案


假设您可以知道每个会话的开始和结束,您可以使用range()函数在会话处于活动状态时按 bin 大小生成适用的日期时间值,然后使用mv-expand运算符扩展列表,以便您可以计算并发会话。这是一个例子:

let sampleEvents = datatable(sessionId:string,eventType:string, timestamp:datetime)
["A", "start", datetime(2020-02-29T10:32:52.1953143Z),
"A", "end", datetime(2020-02-29T10:33:08.1953143Z),
"B", "start", datetime(2020-02-29T10:32:57.1953143Z),
"B", "end", datetime(2020-02-29T10:33:10.1953143Z)];
let startEvents = sampleEvents | where eventType =="start" | project startTime = timestamp, sessionId;
startEvents
| lookup kind=leftouter (sampleEvents | where eventType =="end" | project endTime=timestamp, sessionId) on sessionId
| extend endTime = iif(isempty(endTime), now(), endTime)
| extend sessionActiveTimeInOneSecondInterval = range(startTime, endTime, 1s)
| mv-expand sessionActiveTimeInOneSecondInterval to typeof(datetime)
| summarize count() by bin(sessionActiveTimeInOneSecondInterval, 1s) 

还可以考虑使用row_window_session()函数来确定会话的开始时间


推荐阅读