percentage - 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
请建议可以做些什么来解决这个问题。在此先感谢。
解决方案
让我们总结一下你的问题:
您的查询只有两种结果:
- 显示 50% 与 50% 的饼图
- 显示 100% 的饼图
从您的描述中我们了解到,当
- 所有行都是通过我们绘制饼图 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
推荐阅读
- c# - 如何在 Visual Studio 中编辑锁定的文件?
- python - Seaborn 传奇不显风采,只显色相
- html - 文本填充问题,CSS 动画
- google-sheets - 基于多张工作表中日期范围的带有 VLOOKUP 的 SUMIF
- android - 在 Android 中搜索 RecyclerView 项后,总是打开 RecyclerView 的第一项
- c - 在 FreeRTOS 任务中实现功能是一个好习惯吗?
- ios - 如何根据屏幕设计快速缩放按钮文本?
- python - 如何在 python 中的多个字符串中找到相似的内容?
- sql-server - 如何获取两个日期之间的日期('FromDate 和 ToDate'),如果我们在 Todate 中有空值,我们应该在 Todate 中更改为 getdate()?
- c# - 在 C# 中使用相同 UDP 端口的多个程序/实例