Мотивом для этой публикации послужил доклад «Using the R Software for Log File Analysis» на конференции USENIX, который был обнаружен в интернете при поиске ответов на очередные вопросы. Поскольку была написана целая печатная статья, логично предположить, что тема обладает актуальность. Поэтому решил поделиться примерами решения подобного рода задач, решению которых не придавалось такого значения. Фактически, «заметки на полях».
R, действительно, очень хорошо подходит для подобных задач.


Является продолжением предыдущих публикаций.



Аналитика для Squid


Постановка задачи достаточно простая. Сетевому администратору необходимо оперативно знать, кто и сколько потребляют downlink трафика, какие сайты являются основными поглотителями и кто туда ходит. Большая история не нужна, нужен срез, максимум, за последнюю неделю. Эксперименты с различными опен-сорс анализаторами администратору радости не принесли (все чего-то не хватает).


Ок. Предоставляем свободный доступ по http к файлу access.log (squid), берем R и делаем интерактивное shiny приложение. К сожалению, специальный пакет webreadr на CRAN не заработал, но это не беда. tidyverse + руки решают задачку импорта в 5 строк. Для удобства публикуем полученное приложение на shiny free сервер.


3-4 часа работы и задача решена. Причем, с полноценным графическим UI, а не только хардкорной командной строкой. 2 кода экрана полностью решают существовавшую у администратора задачу.


squid plot


squid table


Код приложения здесь. Естественно, что код не оптимален, но и задачи такой не ставилось, надо было быстренько закрыть насущную проблему.


Аналитика кастомной Системы X


Задачка не стоила бы внимания, если бы несколько моментов:


  • cистема X состоит из несколько компонент, которые пишут несколько различных видов лог-файлов;
  • данные рассыпаны по нескольким десяткам тысяч файлов;
  • вид лог-файла несколько далек от нормализованного вида и съесть его прямым потоком весьма затруднительно.

Фрагмент содержания одного из таких файлов (количество нод в общем виде может изменяться во времени):


2017-12-29 15:00:00;param_1;param_2;param_2;param_4;param_5;param_6;param_7;param_param_8;param_9;param_10;param_11;param_12
Node 1;20645;328;20308;651213;6258;644876;1926;714;1505;541713;75;541697
Node 2;1965;0;1967;89820;236;89605;419;242;396;27714;44;27620
2017-12-29 15:05:00;param_1;param_2;param_2;param_4;param_5;param_6;param_7;param_param_8;param_9;param_10;param_11;param_12
Node 1;20334;1039;19327;590983;2895;588234;1916;3673;1507;498059;347;497720
Node 2;1701;0;1701;89685;259;89417;490;424;419;26013;93;25967

Наверное, автор подобного формата лог-файла руководствовался высокими мотивами, но вот анализировать на компьютере штатными инструментами подобное творчество крайне проблематично.


Но это не страшно, когда в руках есть R. Разбираться в мотивах и писать хитрый парсер на регулярках лень и некогда, используем лом data science. Тупо грузим все сырьем и используем инструменты tidyverse для срезания\трансформации. Всех делов на два экрана кода и пару часов работы (проанализировать, подумать, загрузить, нарисовать графики, сделать выводы).


тут код
loadMainData <- function(){
  flist <- dir(path="./data/", pattern="stats_component1_.*[.]csv", full.names=TRUE)
  raw_df <- flist %>% 
    purrr::map_dfr(read_delim, col_names=FALSE, 
                   col_types=stri_flatten(rep("c", 13)), 
                   delim=";", .id=NULL)

  df0 <- raw_df %>%
    # строка с датой и параметрами начинает новую запись
    mutate(tms=ifelse(X2=="param_1", X1, NA)) %>%
    fill(tms, .direction="down")

  # вытащим первую строку в качестве имен
  data_names <- df0 %>%
    slice(1) %>% 
    unlist(., use.names=FALSE)

  df1 <- df0 %>%
    # проверили, что каждую первую в тройке можно выкинуть, 
    # но, в общем виде, лучше маркировать мусор по содержанию
    purrr::set_names(c("node", data_names[2:13], "tms")) %>%
    mutate(idx=row_number() %% 3) %>%
    filter(idx!=1)

  df2 <- df1 %>%
    mutate(timestamp=anytime(tms, tz="Europe/Moscow", asUTC=FALSE)) %>%
    mutate_at(vars(-node, -timestamp), as.numeric) %>%
    select(-tms, -idx) %>%
    select(timestamp, node, everything()) 

  main_df <- df2 %>%
    tidyr::gather(key="key", value="value", -timestamp, -node)

  main_df
}

На выходе получаем такую картинку (явно виден разбаланс системы), по которой инженер уже конкретно начинает разбираться с Системой X.


сводка


P.S. Техника нынче пошла такая, что можно пренебречь оптимизацией времени исполнения на этапе первичной разработки. Для работы с лог файлами с совокупным объемом несколько гиг вполне достаточно ноутбука с оперативкой от 8Гб и запастись одной-двумя минутами на процессинг, анализ и рисование.


Предыдущая публикация — «HR-аналитика» средствами R.

Комментарии (15)


  1. GrgPlus93
    02.02.2018 11:48

    Предоставляем к squid access.log файл свободный доступ по http

    Чисто такой, сисадминский подход. Сурово


    1. i_shutov Автор
      02.02.2018 11:51

      можно и по scp\ftp\..., но никому в компании, кроме сисадмина, этот файл даже за доплату не интересен


      1. tacitus
        02.02.2018 12:01

        есть такое, да ))


        1. throttle
          02.02.2018 13:35

          Есть такая шутка — бессмысленно рассказывать о высоком моральном облике коллектива человеку, который имеет доступ к логам прокси-сервера.
          Многие удивляются, когда узнают, что я за ними не слежу по логам. Админу обычно и без этого есть чем заняться. Но у обывателя несколько другое представление. :)


          1. i_shutov Автор
            02.02.2018 14:31

            Это хорошо, что на http обратили внимание, но смысл заметки вовсе не в этом. squid — всего-лишь какой-то генератор логов, не более. Это могла быть любая программа.


            Админ сделал такой доступ к логу, значит счел приемлемым. Никто не мешал сделать ограничение на файрволе только на shiny сервер.


            1. throttle
              02.02.2018 18:25
              +1

              всю ночь вручную (+ perl в лучшем случае) сводил логи и excel

              Вручную — это жесть. Лучше день (ночь) потерять, но потом за полчаса долететь. ИМХО. Мне думается, в приведенном примере куда логичнее потратить ночь на поиск и освоение нового инструмента, который потом все это за тебя будет делать.


  1. amarao
    02.02.2018 15:11
    +1

    Главная проблема состоит в том, что освоение R и системное администрирование — разные задачи, причём в разных «билдах персонажей». Человек, который много и хорошо знает R, либо overqualified для работы сисадмином, либо у него компетенция в R, а не в системном администрировании.


    1. i_shutov Автор
      02.02.2018 15:37

      Сомнительный тезис и вот почему:


      1. Заметка началась с сисадминского западного доклада (USENIX) аж 14 года, где R предлагают использовать для решения сисадминских задач.
      2. R ничуть не сложнее чем применяемые сисадминами bash\perl\python, если использовать его для локальных задачек.
      3. Нет никакой проблемы вообще. Каждый может выбрать свой вариант — делать руками\мышкой или немного изучить нового и потом упростить себе жизнь. Заметка — для вторых. Цель — показать, что задача гораздо легче чем кажется.


      1. amarao
        02.02.2018 15:38

        bash, perl и python используются в системном администрировании для множества других вещей.

        Я с трудом себе представляю crontab, делающий бэкап и отсылающий результаты, написанный на однострочнике 'R'.


        1. i_shutov Автор
          02.02.2018 15:52

          Пример некорректный. С бэкапом вполне справляется shell скрипт.


          На западе специалисты вовсе не считают зазорным использовать разные подходы:



          Опять же, я не ратую за огульное применение R, но показываю, что можно красиво решать типичные инженерные задачки по поддержке.


          1. amarao
            02.02.2018 17:57

            А вот тут кто-то предлагает писать скрипты на хаскеле. Ура, сисадмины, семигрупоидным моноидом ударим по сегфолтам!

            www.linux-magazin.de/ausgaben/2012/05/shell-scripting-with-type-safety-using-haskell

            Люди играются с тем, что знают. Это не повод остальным бросаться и учить маргинальные технологии* по первому чиху.

            * маргинальные для системного администрирования.


  1. guglez
    02.02.2018 19:32
    +1

    Чем этот велосипед лучше, чем www.webalizer.org?


    1. i_shutov Автор
      02.02.2018 19:46

      1. Это не велосипед, это пример использования data science стека общего назначения (инструмент) на конкретной утилитарной задаче. 50 строчек кода не составляют продукт.
      2. Касательно squid, вторым шагом было разыменовывание ip в ФИО по внешнему справочнику и классификация сайтов по категориям, но это все не вошло в приложенный скрипт. Админа вебалайзер не устроил, почему, меня совершенно не интересовало. На каждый чих иметь отдельную программу слишком накладно. Если владеешь инструментом, проще потратить 3 часа и сделать ровно то, что надо.
      3. Второй пример приведён не случайно. Такой аццкий лог стандартные лог парсеры съесть не могут ни при каком раскладе. Они ожидают четкую структуру, а не хаос.


  1. igan
    03.02.2018 12:34

    goaccess.io
    Оставлю ссылку. Анализ аксесслогов разных форматов + htop-like cli gui + web GUI = <3. Ставится из epel. Я узнал про него недавно так что и вам простительно.

    Немного пришлось повозиться чтобы сделать реалтайм но все решаемо.

    R прекрасен но для сисадмина не сильно перспективно. А уж надеятся что будут 2 сисадмина которые смогут это поддерживать в одном пространственно временном континууме- полная утопия.


  1. i_shutov Автор
    05.02.2018 11:42
    +1

    1. Ссылка интересная, наверно будет полезна администраторам.
    2. Иногда удается изменить мнение людей просто демонстрацией альтернативным способом решения их задач. Любопытство присуще человеку, поскольку является одним из проявлений высшей нервной деятельности.
    3. Истины здесь в спорах никто не найдет, все останутся при своем мнении, проверено неоднократно.
    4. Да и не в логах дело вовсе, это всего-лишь один из возможных источников данных. Если кто-нибудь увидел возможный способ решения каких-либо своих задач посредством DS стека и хочет попробовать — welcome.