FnordMetric легко настраиваемый и быстрый интерфейс для мониторинга событий в вашем приложении в режиме реального времени, написанный на Ruby и использующий Sinatra для реализации веб-фронтенда. В качестве бэкенда для хранения данных использует Redis. Схема работы проста: после какого-либо события в вашем приложении создается запись 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), и график станет выглядеть примерно вот так:
Мы разобрались с простыми событиями и виджетом графиков, и теперь можно рассмотреть событиями с параметрами.
Так как на вход 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
И график примет вид:
Таким образом, можно передавать вместе с событием любые параметры, и затем использовать их для построения графиков. Существуют также спецсобытия:
// событие об открытии страницы { "_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