需要帮助编写一个可以帮助我正确测量统计信息的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
答案 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问题):)