Как протестировать 5-минутные интервалы с SQL, учитывая временные метки событий в Windows Event Manager в AWS Athena - PullRequest
0 голосов
/ 10 апреля 2019

Я использую Athena в AWS с журналами Windows Event Manager для создания некоторых запросов для событий безопасности. Одним из них является то, что я хочу запросить машины, сообщающие о 3 или более неудачных попытках входа в систему менее чем за 5 минут.

Столбец метки времени отформатирован так: 2019-03-25T19:18:10.7954381Z

Я уже завершил поиск машин с определенным идентификатором события: SELECT machinename, COUNT(eventid) FROM windows WHERE eventid = 4625 GROUP BY machinename HAVING COUNT(eventid = 4625) >= 3;

Он просто возвращает все машины с этой четностью, большей или равной 3, для любой отметки времени.

Моя проблема заключается в следующем: как бы я реализовал логику в SQL, чтобы проверить, произошла ли конкретная вечерняя ошибка в течение 5 минут с таким типом отметки времени, а не просто отображать все времена?

Это мой первый набег в SQL; любая помощь очень ценится. Спасибо!

EDIT: У Тео было решение. Размещение здесь:

SELECT FROM_UNIXTIME( FLOOR( TO_UNIXTIME( DATE_PARSE(substr(timecreated, 1, 16), '%Y-%m-%dT%H:%i') )/300 ) * 300 ) AS five_minute_window, machine-name, COUNT(event-id) AS event_count FROM table WHERE event-id = 4625 GROUP BY 1, machine-name HAVING COUNT(event-id = 4625) >= 3;

Мне пришлось сбрить доли секунды, поскольку были некоторые аномальные метки времени, которые не были отформатированы как таковые (только целые секунды).

Ответы [ 2 ]

0 голосов
/ 11 апреля 2019

В Афине вы можете использовать функцию DATE_TRUNC для усечения отметки времени до целых минут, часов и т. Д. К сожалению, она не поддерживает кратные единицы, поэтому пять минут невозможны.

Обычно я делаюэто так: FROM_UNIXTIME(FLOOR(TO_UNIXTIME("timestamp")/300) * 300).Что он делает, что он преобразует в метку времени UNIX, то есть количество секунд с 1970 года, делит на 300, чтобы получить число пятиминутных интервалов с 1970 года, округляет его до целого числа и снова умножает на 300, чтобы преобразовать обратно в секунды, а затем преобразовать обратно в метку времени.Это работает для любого интервала, просто измените 300 на 1800 на округление до получаса и т. Д.

Ваш формат метки времени не поддерживается изначально Athena, поэтому вам потребуется проанализировать его, что делается с помощью DATE_PARSE - например DATE_PARSE("timestamp_column", '%Y-%m-%dT%H:%M:%S.%fZ').

Полный пример может выглядеть примерно так:

SELECT
  FROM_UNIXTIME(
    FLOOR(
      TO_UNIXTIME(
        DATE_PARSE("timestamp_column", '%Y-%m-%dT%H:%M:%S.%fZ')
      )/300
    ) * 300
  ) AS five_minute_window,
  COUNT(*) AS event_count
FROM some_table
GROUP BY 1

Это даст вам количество строк в каждом пятиминутном окне.Вы можете добавить WHERE для фильтрации по определенным строкам и внешние запросы для поиска окон со многими событиями и т. Д.

0 голосов
/ 10 апреля 2019

То есть вы хотите округлить время за n минут, верно?Я приведу ниже синтаксис оракула, но учтите, что все базы данных имеют схожие функции.Подход заключается в том, чтобы «округлить» или «усечь» данные в эту минуту.Итак, 10:43 - возвращение 10:40.Как только вы получите возможность группировки по этому * sysdate

  • в oracle, возвращает текущую дату / время - для тестирования
  • to_char преобразует дату или число в заданный формат
  • trunc(или округление) используются для усечения числовой операции
  • to_date - преобразование строки в формате в дату
select actual_date,
       to_date(to_char(actual_date,'YYYYMMDDHH24') || min_trunc_5,'YYYYMMDDHH24MI') rouded_to_5_dt,
       min_trunc_5
from
(
    select sysdate  actual_date, 
           ltrim(to_char(trunc(to_number(to_char(sysdate,'MI')/5))*5,'09')) min_trunc_5
    from dual
) x

она вернулась для меня

actual_date      rounded_to_5_dt min_trunc_5
20190410084837   20190410084500  45

Посмотрите, как 48 стало 45. Теперь, если выполнить этот тип операции для любой даты и группы, я буду группировать все данные в этом 5-минутном диапазоне

...