Splunk 仪表板 - 评估案例和范围图结果之间的差异

问题描述

我正在运行查询以将 splunk 结果分叉到存储桶中。我想根据文件在磁盘上占用的大小来划分和计算文件。这可以使用 rangemapeval case 来实现。

当我阅读 here 时,使用 evalrangemap 快。但是我在使用两者时得到了不同的结果。

这是我正在运行的查询 -

<source> 
| eval size_group = case(SizeInMB < 150,"0-150 MB",SizeInMB < 200 AND SizeInMB >= 150,"150-200 MB",SizeInMB < 300 AND SizeInMB >= 200,"200-300 MB",SizeInMB < 500 AND SizeInMB >= 300,"300-500 MB",SizeInMB < 1000 AND SizeInMB >= 500,"500-1000 MB",SizeInMB > 1000,">1000 MB") 
| stats count by size_group

这是我得到的结果 -

enter image description here

而使用 rangemap 这是查询 -

<source> 
| rangemap field=SizeInMB "0-150MB"=0-150 "151-200MB"=150-200 "201-300MB"=200-300 "301-500MB"=300-500 "501-999MB"=500-1000 default="1000MB+" 
| stats count by range

我也尝试过这个范围 - rangemap field=SizeInMB "0-150MB"=0-150 "150-200MB"=150-200 "200-300MB"=200-300 "300-500MB"=300-500 "500-1000MB"=500-1000 default="1000MB+" 并且得到相同的结果 -

enter image description here

这两个图像结果没有太大差异,我们可能可以接受它 - 但我看到 150-200MB 的范围 - 它是 445958 vs 445961,而对于 200-300 MB,它是 { {1}},对于 300-500 MB,它是 3676 vs 3677。我想了解为什么会有这种差异,我应该更信任哪一个? Speedwise 3346 vs 3348 似乎更好,但 datawise 不是那么正确吗?

解决方法

您看到的问题是您的 rangemap 具有重叠值。

而对于 eval 格式,您使用 case 来“正确”修剪范围。

侧边栏 - 您可以这样简化 case

| eval size_group = case(SizeInMB < 150,"0-150 MB",SizeInMB < 200,"150-200 MB",SizeInMB < 300,"200-300 MB",SizeInMB < 500,"300-500 MB",SizeInMB < 1000,"500-1000 MB",0=0,">1000 MB") 

由于 case 表达式在匹配后立即停止计算,因此无需像以前那样使用 AND。使用 0=0 作为最后一种可能性将总是评估为真(想想 C 或 C++ 中 default 语句中的 case)。