Для каждого факта известно имя пользователя, IP адрес с которого осуществлялся вход и время входа.
На основе данного файла требуется найти все IP адреса, с которых происходило больше одного входа за заданное временное окно (например – 1 час).
Результатом должен служить файл в формате CSV со следующими полями:
- IP address – адрес, для которого обнаружен факт множественного входа
- Start – время первого множественного входа в серии
- Stop – время последнего множественного входа в серии
- Users – список имён пользователей и времени входа. Элементы списка разделены запятыми, имя пользователя и время входя разделено двоеточием (':')
Результат должен содержать все обнаруженные серии множественных входов.
- --input-file - путь до файла с информацией о входах
- --output-file - путь до файла с результатами анализа
- --window-size - размер окна в формате scala.concurrent.duration.Duration, например: "1.minute", "1.hour", "2.hours", "1.day"
- --time-zone (опциональный, по умолчанию UTC) - временная зона в которой находятся даты из входного файла
- --start-date (опциональны, формат: 2015-11-30T23:00:00) - опциональный параметр для указания момента времени с которого начинается первое окно. Если параметр не указан, то берется самое первое время и окна считаются от него. Используется в случае если первый логин в коллекции произошел, например в "00:12:11", а окно нужно начать считать с "00:00:00"
С параметрами по умолчанию
sbt "run --input-file=/data/logins0.csv --output-file=/data/result1.csv --window-size=1.hour"
Со всеми параметрами
sbt "run --input-file=/data/logins0.csv --output-file=/data/result2.csv --window-size=1.hour --start-date=2015-11-30T23:00:00 --time-zone=Europe/Moscow"
Сборка jar
sbt assembly
Запуск jar
java -jar target/scala-2.11/login-analyzer-assembly-0.1.0-SNAPSHOT.jar --input-file=/Users/jaitl/Downloads/logins0.csv --output-file=/Users/jaitl/Downloads/result4.csv --window-size=1.hour
- Считывается файл с входными данными
- Данные нарезаются на окна заданного размера
- Внутри каждого окна выполняется группировка по ip, отфильтровываются записи у которых один вход с одного ip, остаются только ip со множественным входом
- Результаты сохраняются в файл
- LoginInfo - запись о факте входа
- WindowLoginInfo - окно, внутри которого находятся факты входа
- IpLoginSeries - информациа о IP, с которых был произведен множественный вход с одного IP в определенном окне
- TimeWindowService - сервис нарезающий коллекцию с фактами логина LoginInfo на окна по заданному размеру окна.
- LoginAnalysisService - сервис для анализа количества входов с одного ip за заданное окно.
Класс Main отвечает за считывание входных аргументов, вызов парсера, запуск логики анализа, вызов логики сохранения, обработку ошибок.