Статьи

Интеграция Logstash, ElasticSearch и Kibana для загрузки потока кликов

В этом блоге я собираюсь продемонстрировать, как мы можем разработать быстрое и простое демо-приложение для загрузки, поиска и визуализации блогов. Мы добьемся этого, используя Logstash для входа в систему, сохраним его в ElasticSearch и создадим симпатичную панель с помощью Kibana . Для веб-журнала clickstream я использую данные журналов из ECML / PKDD 2005 Discovery Challenge .

Вы можете скачать полные блоги после регистрации там. Эти блоги разделены точкой с запятой (;) и имеют следующие поля по порядку:

  • shop_id
  • UnixTime
  • IP-адрес клиента
  • сессия
  • просмотренная страница
  • ссылающейся

Вот несколько примеров строк журнала:

15;1075658406;212.96.166.162;052ecba084545d8348806f087b6e09bb;/ls/?&id=77&view=2,6,31&pozice=20;http://www.shop5.cz/ls/?id=77
12;1075658406;195.146.109.248;05aa4f4db0162e5723331042eb9ce8a7;/ct/?c=153;http://www.shop3.cz/
12;1075658407;212.65.194.144;86140090a2e102f1644f29e5ddadad9b;/ls/?id=34;http://www.shop3.cz/ct/?c=155
14;1075658407;80.188.85.210;f07f39ec63abf67f965684f3fa5729c4;/findp/?&id=63&view=1,2,3,14,20,15&p_14=nerez;http://www.shop4.cz/ls/?&p_14=nerez&id=63&view=1%2C2%2C3%2C14%2C20%2C15&&aktul=0
17;1075658408;194.108.232.234;be0970125c4eb3ee4fc380be05b3c58f;/ls/?id=155&sort=45;http://www.shop7.cz/ls/?id=155&sort=45
12;1075658409;62.24.70.41;851f20e644eb8bf82bfdbe4379050e2e;/txt/?c=734;http://www.shop3.cz/onakupu/

Для создания этой демонстрации нам нужно создать файл конфигурации logstash (назовем этот файл clickstream.conf), который состоит из указания входов, фильтров и выходов. Файл clickstream.conf выглядит так:

input { 
  file {# path for clickstream log
    path =>"/home/rishav.rohit/Desktop/clickstream/_2004_02_01_19_click_stream.log"# define a type for all events handeled by this input
    type =>"weblog"
    start_position =>"beginning"# the clickstream log is in character set ISO-8859-1
    codec => plain {charset =>"ISO-8859-1"}
  }
}

filter {
  csv {# define columns present in weblog
    columns =>[shop_id, unixtime, client_ip, session, page, referrer]
    separator =>";"
  }
  grok {# get visited page and page parameters
    match =>["page","%{URIPATH:page_visited}(?:%{URIPARAM:page_params})?"]
     remove_field =>["page"]
  }
  date {# as we are getting unixtime field in epoch seconds we will convert it to normal timestamp
    match =>["unixtime","UNIX"]
  }
  geoip {# this will convert ip to longitude-latitude using GeoLiteCity database from Maxmind
    source =>"client_ip"
    fields =>["latitude","longitude"]
    target =>"geoip"
    add_field =>["[geoip][coordinates]","%{[geoip][longitude]}"]
    add_field =>["[geoip][coordinates]","%{[geoip][latitude]}"]
  }
  mutate {# this will convert geoip.coordinates to float values
    convert =>["[geoip][coordinates]","float"]}
  }

output {# store output in local elasticsearch cluster
  elasticsearch {
    host =>"127.0.0.1"
  }
}

Для запуска агента logstash мы запускаем следующую команду:

java -jar logstash-1.2.2-flatjar.jar agent -f clickstream.conf

Теперь журнал будет проиндексирован для ElasticSearch. Пример записи в ElasticSearch выглядит следующим образом:

{

    _index: logstash-2004.02.01
    _type: logs
    _id: I1N0MboUR0O1O3RZ-qXqnw
    _version:1
    _score:1
    _source:{
        message:[14;1075658407;80.188.85.210;f07f39ec63abf67f965684f3fa5729c4;/findp/?&id=63&view=1,2,3,14,20,15&p_14=nerez;http://www.shop4.cz/ls/?&p_14=nerez&id=63&view=1%2C2%2C3%2C14%2C20%2C15&&aktul=0 ]@timestamp:2004-02-01T18:00:07.000Z@version:1
        type: weblog
        host: HMECL000315.happiestminds.com
        path:/home/rishav.rohit/Desktop/clickstream/_2004_02_01_19_click_stream.log
        shop_id:14
        unixtime:1075658407
        client_ip:80.188.85.210
        session: f07f39ec63abf67f965684f3fa5729c4
        referrer: http://www.shop4.cz/ls/?&p_14=nerez&id=63&view=1%2C2%2C3%2C14%2C20%2C15&&aktul=0
        page_visited:/findp/
        page_params:?&id=63&view=1,2,3,14,20,15&p_14=nerez
        geoip:{
            latitude:50.08330000000001
            longitude:14.466700000000003
            coordinates:[14.46670000000000350.08330000000001]
        }
     }
}

Таким образом, мы разбили сложное сообщение журнала на более простые компоненты и преобразовали поля, такие как unixtime в datetime, IP в latitude-longitude и получили страницу, которую посетил клиент. Теперь, используя Kibana, мы можем быстро создать панель с этими панелями.

Эта гистограмма показывает количество посадок страниц за разные промежутки времени

Это карта, указывающая на расположение клиентов

И в этой таблице мы видим различные атрибуты для каждого потока кликов.