【问题标题】:How do I transform array in search or elsewhere in dashboard如何在搜索或仪表板的其他地方转换数组
【发布时间】:2021-09-25 00:46:21
【问题描述】:

我的搜索工作正常

index=event_db environment=prod release = 2020150015 
| timechart count as Events

但是,我想对其进行修改以搜索版本数组中的任何版本。我知道“in”运算符。

问题是我提供的版本数组(“Releases”)的格式略有不同,如下所示:

[ver2020.15.0015, ver2020.15.0016, ver2020.22.0019]  // in general, many more than 3!

有没有办法使用 in 运算符和一些映射来获取 发布于

[2020150015, 2020150016, 2020220019] ?

这个可以放在搜索里吗?

这是面板的一部分,所以如果它更简单,我可以在其他地方使用代码将 [ver2020.15.0015, ver2020.15.0016, ver2020.22.0019] 转换为 [2020150015, 2020150016, 2020220019]

但是,正如我所提到的,我是一个新手,所以我对在哪里放置代码来转换数组的了解是有限的 :)

我有一个字段集部分和一个带有查询的面板。

“Releases”数组被填充到 fieldset 部分,如下所示:

<input type="text" token="Releases">
  <label>Release or Releases</label>
  <default>*</default>
</input>

用户输入 ver2020.15.0015 或者可能是 ver2020.15.*。

我不能只让用户输入 2020150015,因为 ver2020.15.0015 格式在其他地方使用。

也许有办法在得到这个之后立即创建新字段Releases_Alt

让我知道我可以提供的任何其他信息。正如我所说,我是 Splunk 的新手,所以我仍在为术语而苦恼。

【问题讨论】:

  • 有多少个可能的版本?所有版本都提前知道吗?
  • @RichG 可能有数百个版本。释放由用户输入(参见上面的“输入类型”)。他/她可以输入 ver2020.15.0015 或 ver2020.15.0015、ver2020.15.0016 或 ver2020.* 或其他内容。我可以要求他们简单地输入 2020150015,这肯定适用于这个查询。但是,其他面板中的其他查询需要其他格式 ver2020.15.0015。我们使用了两个不同的索引 index=event_db 和 index=other_db 你猜对了,它们以不同的格式保存发布版本:)
  • 我正在尝试了解版本名称输入是否可以是由查找文件填充的多选。查找文件将具有两种版本名称格式,并且查询将使用对该面板有意义的一种。
  • @RichG 如果我理解正确,那似乎很有希望。我是 Splunk 的新手。我必须弄清楚如何创建、填充和使用查找文件。你有例子吗?谢谢
  • 我的想法是某种查找功能。毕竟,我们只需要删除 '.'和每个版本的“ver”。然后是通过使用该函数删除“。”的地图将 [ver2020.15.0015, ver2020.15.0016, ver2020.22.0019] 映射到 [2020150015, 2020150016, 2020220019] 的地图。和'ver'。我在 Splunk 中看到了所有这些单独的想法(修剪、映射、函数),但我无法将它们全部放在一起。

标签: splunk splunk-query splunk-dashboard


【解决方案1】:

试试这个查询。它使用子搜索来构建IN 参数。 Splunk 中的子搜索在主搜索之前运行,并且子搜索的输出会替换子搜索本身。

index=event_db environment=prod release IN ( 
    [ | makeresults 
    | eval Releases=replace ($Releases|s$, "[ver\.]+","") 
    | return $Releases ] )
| timechart count as Events

makeresults 命令之所以存在,是因为即使是子搜索也必须从生成命令开始。 makeresults 创建一个允许其他命令工作的“虚拟”事件。

eval 命令将发布版本转换为所需格式。请注意 |s 与 Releases 令牌的使用。此构造确保标记的内容包含在引号中,这是 replace 函数所期望的。

最后,带有$return 命令返回eval 的结果,但没有字段名本身。没有它,子搜索将返回 releases="2020150015, 2020150016, 2020220019",这是行不通的。

【讨论】:

  • 我得到一个“未知的搜索命令's'。”信息。很确定它与“|s”有关,因为删除它会给出“未找到结果”。但查询运行。
  • 在仪表板中使用|s。以交互方式运行查询时,请使用 "$Releases$"
  • 效果很好!感谢你的帮助。非常感谢标记为答案!
  • 顺便说一下,我尝试了您最初的想法,即把东西放在仪表板源代码中。我用 Garbage 添加了一个 部分。然后在输入的更改部分,我把 replace ($Releases$, "[ver\.]+","") 没有 |s 我得到结果,但句号是未删除。使用 |s 我没有得到任何结果。有什么马上想到的吗?我的想法是在查询本身中使用 NewReleases。我说没有删除基于使用 NewReleases 作为面板标题的句点。
  • 试试"$Releases$"
猜你喜欢
  • 1970-01-01
  • 2011-02-14
  • 2011-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-22
  • 1970-01-01
  • 2010-12-18
相关资源
最近更新 更多