Splunk - Удалить события между первым входом в систему и последним выходом из системы, когда у пользователя открыт сеанс, в котором входы и выходы могут происходить несколько раз подряд? - PullRequest
0 голосов
/ 10 января 2019

Вопросы звучат немного запутанно, поэтому, чтобы разбить их, я пытаюсь найти разницу во времени между входами и выходами из системы. Улов двоякий. Возможно, что временной диапазон не улавливает первый вход в систему, который вышел из системы в течение этого временного диапазона, и наоборот, возможно, что временной диапазон не уловит последний выход из системы, который вошел в систему во временном диапазоне. В конечном итоге это может выглядеть так, как показано ниже.

| Action | Action Number |
|--------|---------------|
| Login  | 1             |- 1am
| Login  | 2             |- 1:01 am
| Logout | 1             |- 1:02 am
| Logout | 2             |- 1:03 am
| Logout | 3             |- 1:04 am
| Logout | 4             |- 1:05 am
| Login  | 3             |- 1:10 am
| Logout | 5             |- 1:11 am
| Login  | 4             |- 1:15 am
| Login  | 5             |- 1:16 am
| Logout | 6             |- 1:17 am
| Login  | 6             |- 1:18 am
| Logout | 7             |- 1:20 am
| Logout | 8             |- 1:22 am

Где номер действия - это номер входа / выхода из системы в течение периода времени. Например, первый вход в систему будет иметь номер действия 1, как и первый выход из системы, и так далее.

Я написал логику, чтобы получить это на месте, но мне нужна помощь в «удалении» событий между первым входом в систему и последним выходом из системы для каждого перерыва в активности (периоды, когда у пользователя не было сеансов, вошедших в систему). ).

Это будет означать, что первым логином (для временного диапазона) для этого пользователя будет Логин - 1, и он вошел в систему до выхода 4. Это означает, что я хотел бы удалить Логин 2 и Выход 1 и 2 Затем я могу рассчитать разницу во времени между двумя оставшимися событиями, чтобы найти общее время, в которое они были зарегистрированы для любого сеанса в этот период.

Подводя итог, я хочу получить следующий результат из приведенной выше таблицы, но не могу найти хороший способ сделать это.

| Action | Action Number | Flag for Deletion |
|--------|---------------|-------------------|
| Login  | 1             | False             |
| Login  | 2             | True              |
| Logout | 1             | True              |
| Logout | 2             | True              |
| Logout | 3             | True              |
| Logout | 4             | False             |
| Login  | 3             | False             |
| Logout | 5             | False             |
| Login  | 4             | False             |
| Login  | 5             | True              |
| Logout | 6             | True              |
| Login  | 6             | True              |
| Logout | 7             | True              |
| Logout | 8             | False             |

1 Ответ

0 голосов
/ 28 января 2019

Следующие 6 строк SPL создают ваш необработанный набор данных:

| makeresults count=1 
| eval data="Login,1|Login,2|Logout,1|Logout,2|Logout,3|Logout,4|Login,3|Logout,5|Login,4|Login,5|Logout,6|Login,6|Logout,7|Logout,8" 
| makemv delim="|" data 
| mvexpand data 
| rex field=data "(?<action>[^\,]+),(?<action_number>\d+)" 
| fields - _time, data 

Следующий SPL основан на этом, чтобы получить требуемый результат. Грубо говоря, это:

  1. Сохраняет количество активных сессий (streamstats)
  2. Гарантирует, что это не будет ниже нуля (streamstats, eval)
  3. Выполняет следующее действие (reverse, streamstats)
  4. Использует логику, основанную на количестве сеансов, текущем действии и следующем действии, чтобы решить, нужно ли вам использовать это событие в своих вычислениях (eval)
| eval actiontype=if(action=="Login",1,-1) 
| streamstats reset_after="("session_count<\"0\"")" sum(actiontype) AS session_count 
| eval session_count=if(session_count==-1,0,session_count) 
| reverse 
| streamstats current=f global=f window=1 max(actiontype) AS next_actiontype 
| eval "Flag for Deletion"=if(session_count>1 OR (session_count==0 AND next_actiontype==-1) OR (session_count==1 AND actiontype==-1),"True","False") 
| reverse 
| fields action, action_number,"Flag for Deletion"
...