Splunk:如何获取每个组的 N 个最新值?

Splunk: How to get N-most-recent values for each group?

我已经为这个查询苦苦思索了几个小时,看起来它应该相当简单,但出于某种原因,我发现它非常困难。我的客户想要查看每个 clientType 的前 2 个最新“密钥”。

(真的是前 N - 但不仅仅是“第一”或“最后”)

虽然在我询问的步骤之前完成了一些翻译,但我的数据看起来像这样作为查询的输出(注意:由于专有原因,我无法提供上面的实际步骤,也不是这是真实的数据,但我认为它应该翻译 OK)。我已经为应该出现在输出中的记录加注星标。

out?  clientType  key            _time
----  ----------  -------------  -----------------
 *    Mobile      asfk129458715  2020-10-13 12:10Z
 *    Online      askg259750505  2020-10-12 11:59Z
 *    Email       dh8iwwih33e99  2020-10-12 11:58Z
      Online      schf38hrnf98u  2020-10-12 11:00Z
 *    Online      vn8n34rf9v83j  2020-10-12 11:56Z
 *    Mobile      sjvn98h3idv9d  2020-10-12 11:56Z
 *    Email       92hnfi928rdh9  2020-10-12 11:55Z
 *    Fax         jkcni983iiff4  2020-10-09 06:54Z

现在,我已经能够在更小的范围内(比如 1 天)完成这项工作。但是有些 clientTypes 不是很频繁,我们也需要查看最近的那些。此输出用于某些审计目的,我发现当我将搜索扩展到多天(返回 > 10,000 个事件)时,输出不稳定,我看到的结果是乱序的, 不是最近的,或者是歪斜的。

我想看到的是 - 每个客户类型只有前 2 名,在每个组中按时间降序排列

clientType  key            _time
----------  -------------  --------------
Mobile      asfk129458715  2020-10-13 12:10Z
Mobile      sjvn98h3idv9d  2020-10-12 11:56Z
Online      askg259750505  2020-10-12 11:59Z
Online      vn8n34rf9v83j  2020-10-12 11:56Z
Email       dh8iwwih33e99  2020-10-12 11:58Z
Email       92hnfi928rdh9  2020-10-12 11:55Z
Fax         jkcni983iiff4  2020-10-09 06:54Z

对于一些“我尝试过的”,我尝试以各种顺序使用一些查询代码,主要围绕 stats list(key)sort 0 -_time 等,使用各种“by”子句。此查询的输出还将经过一些额外的转换以用于我们的审计系统,它采用一个键列表,每个键都用单引号括起来并以逗号分隔。

我已经使用 stats delim="','"mvcombine 在查询中取得了一些成功,得到的结果最终看起来像这样。我想将此作为问题的一部分包括在内,以便清楚最终状态需要是什么样子,以防需要在分组和排序部分的某处进行更改以使其更容易。

clientType  keys           
----------  -------------
Mobile      'asfk129458715','sjvn98h3idv9d'
Online      'askg259750505','vn8n34rf9v83j'
Email       'dh8iwwih33e99','92hnfi928rdh9'
Fax         'jkcni983iiff4'

要按某个字段获取两个(或'N')最近的事件,首先按时间排序然后使用dedup命令select前N个结果。

<your query>
| sort - _time
| dedup 2 clientType

虽然 @RichG 的 dedup 选项可能有效,但这里有一个使用 statsmvindex 的选项:

index=ndx sourcetype=srctp clientType=* key=*
| eval comb=_time+" | "+key
| stats values(comb) as comb by clientType

在其范围形式中使用 mvindex,而不是只选择最后一项

| eval mostrecents=mvindex(comb,-1-N,-1)

(当然 - sub-in for N 无论你需要什么)

| fields - comb
| mvexpand mostrecents
| rex field=mostrecent "(?<timemost>\d+)\s\|\s(?<keymost>.+)"
| table clientType timemost keymost
| eval timemost=strftime(timemost,"%c")