You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Azure日志中使用Kusto查询语言(KQL)创建多自定义指标时间图表并解决散点图无法连线问题

嘿,我来帮你搞定这两个Azure日志KQL可视化的问题——这俩场景我之前实操时也踩过坑,咱们一步步捋清楚:

一、如何创建多自定义指标的时间图表?

要在同一张时间图里展示多个自定义指标,核心是让KQL输出结构化的时间-指标名-指标值格式,这样可视化工具才能识别并生成多系列折线。具体步骤如下:

  1. 先通过extend计算你的自定义指标,比如从日志里提取成功/失败操作数、响应时长分位数等;
  2. 用bin()按时间桶(比如1小时、5分钟)聚合每个指标的数值;
  3. 关键一步:用unpivot把多列的指标转成“指标名-指标值”的键值对结构,让可视化工具能自动识别多个数据系列。

举个实际的KQL示例(以AzureActivity日志为例):

AzureActivity
| where TimeGenerated > ago(7d)
// 计算两个自定义指标:成功操作数、失败操作数
| extend SuccessFlag = iff(ActivityStatus == "Success", 1, 0)
| extend FailureFlag = iff(ActivityStatus == "Failed", 1, 0)
// 按1小时时间桶聚合指标
| summarize 
    TotalSuccess = sum(SuccessFlag),
    TotalFailure = sum(FailureFlag)
    by bin(TimeGenerated, 1h)
// 转成多系列所需的结构
| unpivot MetricValue for MetricName in (TotalSuccess, TotalFailure)

执行完这个查询后,在Azure Monitor的可视化面板选择「时间图表」,把TimeGenerated设为X轴,MetricValue设为Y轴,MetricName设为数据系列,就能看到两条分别对应成功/失败数的连线了。

二、如何把散点图转成连线式时间图?

散点图的出现大多不是功能限制,而是KQL查询逻辑或可视化配置的问题,常见原因和解决方法:

原因1:时间维度没有连续聚合或排序

如果你的查询没有用bin()做时间桶聚合,而是直接按原始TimeGenerated(精确到秒/毫秒)分组,或者没有按时间排序,可视化工具会把每个离散时间点当成独立的散点,无法连成线。

解决方法:

  • 必须用bin(TimeGenerated, <时间间隔>)做时间桶聚合,确保数据是按固定时间间隔排列的;
  • 最后加上| sort by TimeGenerated asc,强制让数据按时间顺序输出。

示例修正后的查询:

// 错误写法(会出散点):没有bin和排序
AzureActivity
| where TimeGenerated > ago(1d)
| extend Latency = DurationMs
| summarize AvgLatency = avg(Latency) by TimeGenerated

// 正确写法(会出连线图):
AzureActivity
| where TimeGenerated > ago(1d)
| extend Latency = DurationMs
| summarize AvgLatency = avg(Latency) by bin(TimeGenerated, 10m)
| sort by TimeGenerated asc

原因2:可视化面板配置错误

有时候查询没问题,但可视化工具默认选了散点模式。你需要:

  1. 在Azure Monitor的可视化设置里,确认选择的是「时间图表」类型,而非「散点图」;
  2. 检查X轴是否绑定了TimeGenerated字段,Y轴绑定指标值;
  3. 如果是多指标场景,确保「数据系列」字段选了你的指标名称列(比如上面的MetricName)。

额外技巧:用make-series生成连续时间序列

如果某些时间桶没有数据,默认summarize会跳过这些桶,导致连线中断。这时可以用make-series强制生成连续的时间序列,空值补0:

AzureActivity
| where TimeGenerated > ago(7d)
| extend SuccessFlag = iff(ActivityStatus == "Success", 1, 0)
// 生成连续的时间序列,空桶补0
| make-series TotalSuccess = sum(SuccessFlag) default=0 on TimeGenerated from ago(7d) to now() step 1h
// 展开数组成单行时间点
| mvexpand TimeGenerated, TotalSuccess
| sort by TimeGenerated asc

内容的提问来源于stack exchange,提问作者sam0673

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 09:32:31