Azure Application Insights中KQL查询API请求占比报错,求正确写法
ASP.NET Web API端点调用占比KQL查询修复
我有一个ASP.NET Web API,想要在Azure门户中编写KQL查询,展示各API端点的使用占比,以此了解哪些端点调用频率高、哪些较低。编写的查询运行时出现错误:
原查询语句
requests | summarize count() by operation_Name | extend percentage = todouble(count_) * 100.0 / todouble(todynamic(summarize count())) | project operation_Name, percentage | order by percentage desc
错误信息
查询无法解析,错误位置为第3行第73个字符处的'summarize'
Token: summarize Line: 3 Position: 73 若问题持续,请提交支持工单。请求ID: 8727eeab-aa0a-4ef5-a7e4-58e699419cdd
问题原因
原查询第3行的写法不符合KQL语法规则:
- KQL不允许在
extend的表达式中嵌套summarize操作 todynamic用于将字符串转为动态类型,不适用于计算总调用数的场景
正确查询方案
方案一:使用窗口函数(简洁直观)
requests | summarize endpoint_count = count() by operation_Name | extend total_requests = sum(endpoint_count) over () | extend percentage = todouble(endpoint_count) * 100.0 / todouble(total_requests) | project operation_Name, endpoint_count, percentage | order by percentage desc
逻辑说明:
- 按
operation_Name(API端点)分组,统计每个端点的调用次数,命名为endpoint_count - 通过
sum(endpoint_count) over ()计算全局总调用数(over()表示不做分组,计算所有数据的总和) - 将端点调用数和总调用数转为double类型,计算占比(避免整数除法导致的精度丢失)
- 展示端点名称、调用次数、占比,并按占比降序排序
方案二:先计算总调用数再关联(大场景下性能更优)
let total_requests = toscalar(requests | summarize count()); requests | summarize endpoint_count = count() by operation_Name | extend percentage = todouble(endpoint_count) * 100.0 / total_requests | project operation_Name, endpoint_count, percentage | order by percentage desc
逻辑说明:
- 先用
toscalar函数将所有请求的总次数转为标量值,存储到变量total_requests中 - 按端点分组统计调用次数
- 直接用预计算的总次数计算占比
- 展示并排序结果
内容的提问来源于stack exchange,提问作者Vivek Nuna
相关产品推荐
相关产品推荐

