如何在Log Analytics中运行嵌套查询同时生成两个时间图表
解答
首先明确两个问题的结论:
- Log Analytics使用的KQL查询语言完全支持嵌套查询,可根据业务需求编写任意层级的子查询逻辑
- 你需要同时获取磁盘吞吐量、IOPS时间图表的需求完全可实现,且不需要依赖嵌套查询。
你原有写法存在两个问题:
- 直接拼接两段独立查询且未做语句分隔,查询窗口默认只会返回最后一段语句的渲染结果
- 第二段IOPS查询的计算逻辑错误:
Disk Transfers/sec计数器单位为每秒IO操作次数,不需要除以1024/1024做存储单位换算,原写法会导致IOPS数值完全失真。
实现方案
方案1:两个指标合并到同一张时间图展示(推荐)
通过maxif聚合函数在同一次聚合中计算两个指标,最终在单张时间图中生成两条对应序列,查询语句如下:
Perf | where ObjectName == "LogicalDisk" | where CounterName in ("Disk Bytes/sec", "Disk Transfers/sec") | where Computer contains "servername" | summarize // 磁盘吞吐量,单位MB/s DiskThroughputMBps = maxif(CounterValue, CounterName == "Disk Bytes/sec") / 1024 / 1024, // 磁盘IOPS,单位次/秒 DiskIOPS = maxif(CounterValue, CounterName == "Disk Transfers/sec") by Computer, bin(TimeGenerated, 5m) | render timechart
该写法会自动按Computer维度拆分,分别展示每台服务器的吞吐量、IOPS随时间变化的趋势。
方案2:两个指标分别渲染为独立时间图
修正计算逻辑后,在两段查询末尾添加英文分号;做语句分隔,即可在一次查询运行后返回两个独立的图表结果,查询语句如下:
// 磁盘吞吐量查询 Perf | where ObjectName == "LogicalDisk" | where CounterName == "Disk Bytes/sec" | where Computer contains "servername" | summarize ThroughputInMBs = max(CounterValue) / 1024 / 1024 by Computer, bin(TimeGenerated, 5m) | render timechart; // 磁盘IOPS查询 Perf | where ObjectName == "LogicalDisk" | where CounterName == "Disk Transfers/sec" | where Computer contains "servername" | summarize IOPS = max(CounterValue) by Computer, bin(TimeGenerated, 5m) | render timechart
内容的提问来源于stack exchange,提问作者Yackzel
相关产品推荐
相关产品推荐

