Splunk查询 - 通过删除重复项和自定义查询来计算统计信息

时间:2016-02-16 18:56:22

标签: splunk

需要帮助编写一个可以帮助我正确测量统计信息的splunk查询。请注意,由于我们的服务器上的错误,有时会多次将数据发送到splunk

这是一个概述。 我有兴趣了解用户使用我的应用程序的时间。一个事件将有 user_id,连接状态(值已连接,暂停和终止),session_length,时间戳。可以从字段session_length检索用户的应用程序使用情况。

当用户处于暂停或终止状态时,它将包含会话长度值。如果用户状态包含序列的已连接,暂停和终止,则会话长度应从终止状态派生,否则会话长度应从暂停状态计算。

不幸的是,暂停和终止的数据不止一次发送到服务器。我想过滤这些数据。

样本数据写在下面。

考虑 - >如果对于该用户的一系列事件,将报告已终止/暂停状态两次,然后使用该序列的最早会话长度。

样本数据

User1 Terminated session_length=13 timestamp=10.13.
User1 Terminated session_length=11 timestamp=10.11.
User1 Paused     session_length=10 timestamp=10.10
User1 Connected                    timestamp=10.00
--
User1 Paused     session_length=5  timestamp=9.05
User1 Connected                    timestamp=9.00
--
User2 Terminated session_length=13 timestamp=10.13.
User2 Terminated session_length=11 timestamp=10.11.
User2 Paused     session_length=10 timestamp=10.10
User2 Connected                    timestamp=10.00
--
User1 Terminated session_length=6  timestamp=9.06
User1 Connected                    timestamp=8.00

-

对于上面的样本数据集,我使用了分隔符 - 过滤序列并解释如何计算持续时间。 1)对于User1(从上到下),考虑第一个序列。用户状态已连接,暂停,终止,终止。所以它的会话长度为11(考虑最早报告的会话长度)。 2)对于用户1,序列2,用户状态已连接,暂停。所以它的会话长度 - 5 3)对于用户2,序列2,User2状态被连接,暂停,终止,终止。会话长度 - 11。 4)对于用户1,序列4,用户状态被连接,终止。其会话长度为6

splunk查询应报告每个用户的会话长度总和

User_Id TotalSessionLength 用户1 22 User2 11

1 个答案:

答案 0 :(得分:1)

最直接的解决方案始于transaction命令:

index=my_user_events_index 
 | transaction user_id startswith="connection_state=Connected" unifyends=true

当您在上面对它们进行分组时,这会为每个会话创建一个事件。由于transaction将同一字段名称的所有值分组到一个多值字段中,因此我们无法分辨哪个session_length与哪个connection_state相关。为了解决这个问题,我们在点击事务之前根据connection_state重命名session_length字段:

index=my_user_events_index 
 | eval paused_session_length=case(connection_state=="Paused",session_length)
 | eval termination_session_length=case(connection_state=="Terminated",session_length)
 | transaction user_id startswith="connection_state=Connected" unifyends=true

几乎就在那里!现在我们有代表会话的事件,每个事件都有一个多值的paused_session_length和一个多值的terminated_session_length。我们需要使用一些广告multivalue evaluation functions

来应用我们的业务逻辑
index=my_user_events_index 
 | eval paused_session_length=case(connection_state=="Paused",session_length)
 | eval termination_session_length=case(connection_state=="Terminated",session_length)
 | transaction user_id startswith="connection_state=Connected" unifyends=true
 | eval session_length=coalesce(mvindex(mvsort(terminated_session_length),0),mvindex(mvsort(paused_session_length),0))

从这里开始,我们只需要一个简单的stats命令来按用户对会话长度求和:

index=my_user_events_index 
 | eval paused_session_length=case(connection_state=="Paused",session_length)
 | eval termination_session_length=case(connection_state=="Terminated",session_length)
 | transaction user_id startswith="connection_state=Connected" unifyends=true
 | eval session_length=coalesce(mvindex(mvsort(terminated_session_length),0),mvindex(mvsort(paused_session_length),0))
 | stats sum(session_length) as TotalSessionLength by user_id
对于大量数据,

Transactions可能相当慢,并且多值字段令人头疼。另一种方法是使用user_id的streamstats来转发最近的Connected事件的时间戳,然后使用stats聚合会话并计算会话长度。我将把它作为读者的练习(或另一个SO问题):)