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 问题)的练习:)
在编写 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 问题)的练习:)