如何在一个 field/column 中 combine/merge 多个通用 fields/columns 并在 Splunk 中对每个通用 field/column 值进行平均计算?

how to combine/merge multiple generic fields/columns in one field/column with average calculation per generic field/column values in Splunk?

我在splunk中有以下情况(见下图)。

我需要 Splunk 中的以下模式(见下图)。

我有不同的通用列,其中列名的最后部分(后缀)是动态的和未知的。我需要 combine/merge 这个通用列到一个目标列。在目标列中,我想计算每个通用字段的平均值。我觉得这张图很好的说明了情况。

所以有很多方法可以达到您想要的点...我对让您到达初始点的搜索有点好奇,因为可能有一些更好的选择,您可以在没有中间点的情况下达到您想要的输出,正如我将在此处演示的那样...

首先,我将为您提供一个基本搜索,我将使用它...这会根据您的数据设置一个模拟数据集,但没有聚合。

| makeresults 
| eval raw=split("10.10.2016 05:55 SuffixA=17
10.10.2016 05:57 SuffixA=15
10.10.2016 05:55 SuffixB=16
10.10.2016 05:59 SuffixB=12
10.10.2016 06:01 SuffixB=11
10.10.2016 06:03 SuffixC=9
10.10.2016 06:05 SuffixC=18
10.10.2016 06:09 SuffixC=21","
") 
| mvexpand raw | rename raw -> _raw 
| rex "^(?<_time>\S+\s+\S+)" | eval _time=strptime(_time,"%m.%d.%Y %H:%M") 
| kv | table _time Suffix*

从这里我只有后缀和它们在某些数据点的相应值。要计算每个后缀的聚合,如果我可以将其转换为一个键(作为正在使用的特定后缀)和一个值,那将很方便......这就是 untable would do for me. ( For the curious, the opposite direction is of course xyseries )

<base search> | untable _time key value

现在我只需要按键执行聚合,在你的例子中是平均值。我想保留原始数据集中的所有原始行,所以这就是 eventstats 方便的地方

<base search> | untable _time key value
| eventstats avg(value) as average by key

我现在有 _time、key、value、average 的输出。接下来要取回单独的后缀列,我可以使用语法技巧 eval and assign a field named for the value of another field, and use fields 来删除现在多余的字段。

<base search> | untable _time key value
| eventstats avg(value) as average by key
| eval {key}=value | fields - key value

在上面的实验之后,让我们使用上面的一些技巧,进行一个新的碱基搜索来匹配你上面的当前状态。

| makeresults | eval raw=split("10.10.2016 05:55 SuffixA=17
10.10.2016 05:57 SuffixA=15
10.10.2016 05:55 SuffixB=16
10.10.2016 05:59 SuffixB=12
10.10.2016 06:01 SuffixB=11
10.10.2016 06:03 SuffixC=9
10.10.2016 06:05 SuffixC=18
10.10.2016 06:09 SuffixC=21","
") | mvexpand raw | rename raw -> _raw 
| rex "^(?<_time>\S+\s+\S+)" | eval _time=strptime(_time,"%m.%d.%Y %H:%M") 
| kv | table _time Suffix* | untable _time key value 
| eventstats avg(value) as average by key 
| eval {key}=value, StaticPart:{key}=average | fields - key value average 
| table _time StaticPart:* Suffix*

从这一点来看,另一种选择可能是使用 foreach 到 运行 对所有 StaticPart:* 字段进行评估以创建新的平均字段,并删除所有 StaticPart 字段像这样:

<base search> 
| foreach StaticPart:* [eval average=coalesce('<<FIELD>>',average)] 
| fields - StaticPart:*