首页 > 解决方案 > Kusto 查询根据结果将饼图分成两半

问题描述

我正在尝试在饼图中使用 Kusto KQL 查询显示结果。目标是在失败的情况下将饼图显示为半色,在通过的情况下显示为全色。基本上来自站点的日志将行显示为通过和失败行。如果全部通过,饼图应显示 100% 相同的颜色。如果任何行中即使单个失败,则应显示 50% 一种颜色和 50% 其他颜色color.Below 查询在以下情况下起作用 1)当所有行都以全色通过时 2)当一些通过并且一些失败甚至一个失败时(显示饼图在一半 n 一半)颜色 3)但是当所有行都失败时,这是以一种颜色显示,而不是将饼图分成两半

我使用的查询:

results
| where Name contains "jobqueues"
| where timestamp > ago(1h)
| extend PASS = (ErLvl)>2 )
| extend FAIL = ((ErLvl<2 )
| project PASS ,FAIL
| extend status = iff(PASS==true,"PASS","FAIL")
| summarize count() by status
| extend display = iff(count_>0,1,0)
| summarize percentile(display, 50) by status
| render piechart

请建议可以做些什么来解决这个问题。在此先感谢。

标签: percentageazure-data-explorerkql

解决方案


让我们总结一下你的问题:

您的查询只有两种结果:

  1. 显示 50% 与 50% 的饼图
  2. 显示 100% 的饼图

从您的描述中我们了解到,当

  1. 所有行都是通过我们绘制饼图 2。
  2. 任何行都有失败,我们绘制饼图 1。

让我们看看我们如何在您的代码中的这一行之后实现这一点:

| extend status = iff(PASS==true,"PASS","FAIL")
| summarize count() by status

我们应该有一个如下所示的表格:

地位 数数_
经过 X
失败 是的

看起来我们需要对此执行一些逻辑。您最初是根据操作结果进行绘图的。我的想法是只为 50%v50% 的情况生成一个 pass = 1 和 fail = 1 的表,为 100% 的情况生成另一个 pass = 1 和 fail = 0 的表。

因此,按照该逻辑,我们需要执行以下映射:

地位 数数_ 地位 计数2
失败 >0 映射到 失败 1
经过 >0 经过 1
地位 数数_ 地位 计数2
失败 >0 映射到 失败 1
经过 =0 经过 1
地位 数数_ 地位 计数2
失败 =0 映射到 失败 0
经过 >0 经过 1

逻辑表示:

(given count_ >=0):
if fail > 0  count2 = 0 else count 1
pass is always equal to 1

我们只需要将它应用于 status == FAILED 但如果没有观察结果,summary 并不能保证一行

保证总结结果:

| extend fail_count = iif(status == "FAIL", count_, 0)
| extend pass_count = iif(status == "PASS", count_, 0)
| project fail_count,pass_count
| summarize sum(fail_count), sum(pass_count)

应用逻辑

| extend FAIL = iff(sum_fail_count > 0, 1, 0)
| extend PASS = 1
| project FAIL, PASS

现在我们的结果看起来像:

经过 失败
1 1 或 0

为了将其绘制为饼图,我们只需将其转置,因此 PASSED 和 FAILED 列是“状态”列的行。
我们可以为此使用一个简单的包和 mv-expand

//transpose for rendering 
| extend tmp = pack("FAIL",FAIL,"PASS",PASS)
| mv-expand kind=array tmp
| project Status=tostring(tmp[0]), Count=toint(tmp[1])
| render piechart

就是这样!~

最终查询:

results
| where Name contains "jobqueues"
| where timestamp > ago(1h)
| extend PASS = (ErLvl)>2 )
| extend FAIL = ((ErLvl<2 )
| project PASS ,FAIL
| extend status = iff(PASS==true,"PASS","FAIL")
| summarize count() by status
//ensure results
| extend fail_count = iif(status == "FAIL", count_, 0)
| extend pass_count = iif(status == "PASS", count_, 0)
| project fail_count,pass_count
| summarize sum(fail_count), sum(pass_count)
//apply logic
| extend FAIL = iff(sum_fail_count > 0, 1, 0)
| extend PASS = 1
| project FAIL, PASS
//transpose for rendering 
| extend Temp = pack("FAIL",FAIL,"PASS",PASS)
| mv-expand kind=array Temp
| project Status=tostring(Temp[0]), Count=toint(Temp[1])
| render piechart

推荐阅读