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

Splunk Query - Compute stats by removing duplicates and custom query

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

这里是概述。 我想知道用户使用我的应用程序的时长。一个事件会有 user_id,连接状态(值为连接、暂停和终止),session_length,时间戳。可以从字段 session_length.

中检索用户的应用程序使用情况

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

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

示例数据写在下面。

考虑 --> 如果对于该用户的一系列事件,terminated/paused 状态被报告两次,则对该序列使用最旧的会话长度。

示例数据

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(从上到下),考虑第一个序列。用户状态有connected、paused、terminated、Terminated。所以它的会话长度为 11(考虑最早报告的会话长度)。 2)对于User 1,sequence 2,用户状态是connected,paused。所以它的会话长度 - 5 3)对于user 2,sequence 2,User2的状态是connected,paused,terminated,terminated。它的会话长度 - 11。 4)对于User 1,sequence 4,用户状态是connected,terminated。它的会话长度是 6

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

User_Id 总会话长度 用户 1 22 用户 2 11

最直接的解决方案从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

快到了!现在我们有了表示会话的事件,每个事件都有一个多值暂停_session_length 和一个多值终止_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))

从这里开始,我们只需要一个简单的统计命令来按用户汇总会话长度:

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 can be fairly slow with a lot of data, and the multivalued fields are a headache. Another alternative is to use streamstats by user_id to carry forward the timestamp of the most recent Connected event, then use stats 聚合会话并计算会话长度。我将把它留作 reader(或另一个 SO 问题)的练习:)