, , рубрики: rails, ruby, мониторинг приложения, метки: , , ,

Ruby / FnordMetric: красивый мониторинг событий для веб-приложенияRuby / FnordMetric: красивый мониторинг событий для веб приложенияRuby / FnordMetric: красивый мониторинг событий для веб-приложения

FnordMetric легко настраиваемый и быстрый интерфейс для мониторинга событий в вашем приложении в режиме реального времени, написанный на Ruby и использующий Sinatra для реализации веб-фронтенда. В качестве бэкенда для хранения данных использует Redis. Схема работы проста: после какого-либо события в вашем приложении создается запись FnordMetric, которая в тот же момент отобразится в веб-интерфейсе метрики.


Ruby / FnordMetric: красивый мониторинг событий для веб-приложенияRuby / FnordMetric: красивый мониторинг событий для веб приложенияRuby / FnordMetric: красивый мониторинг событий для веб-приложения

Веб-интерфейс FnordMetric состоит из двух частей: самой очереди событий, и набора виджетов, которые могут создавать графики и счетчики на основе этих событий.

Для установки этого интерфейса необходимо иметь Ruby версии 1.9 и Redis. Установим gem:
gem install fnordmetric

И создадим простой конфигурационный файл веб-интерфейса с именем my_stats_app.rb:

require "fnordmetric"  # не так давно появилась поддержка неймспейсов: будем использовать пространство myapp FnordMetric.namespace :myapp do   gauge :registrations_per_hour,      :tick => 1.hour.to_i,      :title => "Registrations per Hour"    event(:new_registration) do     # увеличивать счетчик registrations_per_hour на 1 при каждом событии     incr :registrations_per_hour    end    # добавим таймлайн-виджет со значением registrations_per_hour, обновляемый каждые 2 секунды   widget 'Overview', {     :title => "Registrations per Hour",     :type => :timeline,     :gauges => :registrations_per_hour,       :include_current => true,     :autoupdate => 2   } end  FnordMetric.standalone 

Запустим фронтенд: ruby my_stats_app.rb run. Теперь доступен по адресу localhost:4242/

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

Есть несколько вариантов записи события в бэкенд FnordMetric:

  • отправкой JSON через TCP-соединение:
    echo "{"_type": "new_registration"}" | nc localhost 1337
  • через API на PHP:
    $fnord = new FnordmetricApi('0.0.0.0', 1337); $fnord->event('new_registration'); $fnord->close(); 

  • HTTP-запросом:
    # POST http://localhost:2323/events _type=new_registration curl -X POST -d "_type=new_registration" http://localhost:4242/events  

  • через API на Ruby:
    api = FnordMetric::API.new({}) api.event({:_type => "new_registration"}) 

  • на C# – с записью напрямую в Redis:
    using(var client = new RedisClient("localhost:6379")) {     String guid = Guid.NewGuid().ToString("N");     String fnordId = String.Format("fnordmetric-event-{0}", guid)     client.Set(fnordId, "{"_type": "new_registration"}");     client.Expire(fnordId, new TimeSpan(0, 0, 60));     client.LPush("fnordmetric-queue", guid); } 

После создания нескольких событий с именем new_registration, оно появится в ленте событий (Active Users), и график станет выглядеть примерно вот так:
Ruby / FnordMetric: красивый мониторинг событий для веб-приложенияRuby / FnordMetric: красивый мониторинг событий для веб приложенияRuby / FnordMetric: красивый мониторинг событий для веб-приложения

Мы разобрались с простыми событиями и виджетом графиков, и теперь можно рассмотреть событиями с параметрами.

Так как на вход Fnordmetric принимет обычный JSON, ничего не мешает нам добавить какие-нибудь параметры. Например, источник регистрации: {"_type": "new_registration", "referer": "facebook"}

Имея информацию о referer’е, мы можем строить несколько график с несколькими источниками данных в зависимости от этого параметра.
Модифицируем наш my_stats_app.rb (не забудьте перезапустить процесс веб-сервера в консоли, иначе измнения не вступят в силу):

require "fnordmetric"  # с недавних пор появилась поддержка неймспейсов: будем использовать пространство myapp FnordMetric.namespace :myapp do   event(:new_registration) do     # при каждом событии увеличим счетчик registration_via_provider_name     incr "registrations_via_#{data[:referer]}".to_sym   end    # опишем данные для графика   gauge :registrations_via_habr,     :tick => 1.day.to_i,     :title => "Habr registrations"    gauge :registrations_via_facebook,     :tick => 1.day.to_i,     :title => "Facebook registrations"    widget 'Overview', {     :title => "Registrations",     :type => :timeline,     :gauges => [:registrations_via_habr, :registrations_via_facebook], # график включит в себя 2 значения     :include_current => true,     :autoupdate => 2   } end  FnordMetric.standalone 

Сгенерируем событий:

$ echo "{"_type": "new_registration", "referer": "habr"}" | nc localhost 1337 $ echo "{"_type": "new_registration", "referer": "habr"}" | nc localhost 1337 $ echo "{"_type": "new_registration", "referer": "facebook"}" | nc localhost 1337 

И график примет вид:
Ruby / FnordMetric: красивый мониторинг событий для веб-приложенияRuby / FnordMetric: красивый мониторинг событий для веб приложенияRuby / FnordMetric: красивый мониторинг событий для веб-приложения

Таким образом, можно передавать вместе с событием любые параметры, и затем использовать их для построения графиков. Существуют также спецсобытия:

// событие об открытии страницы { "_type": "_pageview", "url": "/blob/my_super_seo_article", "_session": "mysessiontoken" }  // установка имени пользователя { "_type": "_set_name", "name": "Tingle Tangle Bob", "_session": "mysessiontoken" }  // установка аватары пользователя { "_type": "_set_picture", "url": "http://myhost/123.jpg", "_session": "mysessiontoken" } 

FnordMetric умеет разделять события по пользователям — достаточно передавать в параметре _session user_id, совершившего данное действие. Не забудьте сделать _set_name для user_id с параметрами _session и name, содержащим его имя — так вы сможете фильтровать события по авторам, список которых указан в правой колонке в веб-интерфейса.

Полезные ссылки

Скринкаст от создателей проекта
Страница на Github
Google Group

Автор: RazoR_Empire

Поделиться новостью

* - обязательные к заполнению поля

Current ye@r *