首页 > 解决方案 > 加入具有多个条件的 2 个表

问题描述

假设如果我index=endpoints在搜索栏中键入并按 Enter,我将得到如下所示的结果:

{
  "user": Jack,
  "os_name": "Windows",
  "hostname": "Windows-JACK-01",
  "pid": "30219",
  "app": "/usr/bin/curl",
  "cmdline": "curl google.com",
  "epoch": "1503452096",
  "type": "processes"
}

. . .

{
  "hostname": "Windows-JACK-01",
  "pid": "30219",
  "app": "/usr/bin/curl",
  "epoch": "1503452096",
  "ip": "123.123.123.123",
  "port": "1234",
  "type": "sockets"
}

. . .

同一索引下有两种类型的数据——套接字和进程。我想找到一种方法来组合这两种类型的数据(相关的),以便我可以获得包含所有信息的更丰富的数据。

+-------------------------+-----------------+---------+
| hostname | pid | app | osname | ip | port | etc.... |
+-------------------------+-----------------+---------+
| ...      | ... | ... | ...    | x  | y    | ...     |
+-------------------------+-----------------+---------+

问题是如果我只是做类似的事情:

index=endpoints type="processes"
| join left=L right=L WHERE L.pid=R.pid [ search index=endpoints type="sockets" ]

大多数时候,我会在 theapp和 the之间得到错误的映射,pid因为任何应用程序在可用时都可以分配给相同pid的应用程序。

我在想也许如果我添加更多条件,它会降低不准确率。例如,而不L.pid=R.pid只是,也许我可以做L.pid=R.pid AND L.hostname=R.hostname AND ...

我天真的方法是在 WHERE 部分添加更多条件

index=endpoints type="processes"
| join left=L right=L WHERE (L.pid=R.pid AND L.x=R.x AND...)
  [ search index=endpoints type="sockets" ]

但是,它似乎不是这样工作的。有什么建议吗?

标签: splunksplunk-query

解决方案


从您的示例查询中,我猜您是一位经验丰富的 SQL 用户,他是 Splunk 的新手,并且没有阅读有关该join命令的手册。 join不接受where条款,也没有leftright选项。作为一种最佳实践,应该尽可能避免join,因为它非常低效。

尝试使用stats, 代替。我们使用stats它的分组功能而不是计算统计数据。

index=endpoints (type="processes" OR type="sockets")
| stats values(*) as * by hostname, pid

推荐阅读