Skip to content

Instantly share code, notes, and snippets.

@leucos
Created June 13, 2012 14:17
Show Gist options
  • Select an option

  • Save leucos/2924341 to your computer and use it in GitHub Desktop.

Select an option

Save leucos/2924341 to your computer and use it in GitHub Desktop.
# FNordmetric helper
#
# Define :fnord_redis_url trait in class where helper is used
# e.g. : trait :fnord_redis_url => "redis://redis.example.com:6332"
#
require 'fnordmetric'
module Ramaze
module Helper
module FnordmetricHelper
@@fnord = nil
def _connect
begin
url = ancestral_trait[:fnord_redis_url]
rescue
url = "redis://localhost:6379"
ensure
@@fnord = FnordMetric::API.new(:redis_url => url)
Ramaze::Log.info("Connected to FnordMetric")
end
end
def event(evt, *args)
evt = { :_type => evt.to_s, :_session => session.sid }
args.each do |a|
evt.merge!(a)
end
_connect unless @@fnord
Ramaze::Log.debug("Logging FM event %s" % evt.inspect)
@@fnord.event(evt)
end
def set_name(name)
event(:_set_name, :name => name)
end
def set_picture(url)
url = url.to_s if url.class.to_s == 'URI::HTTP'
event(:_set_picture, :url => url)
end
end
end
end
class Controller < Ramaze::Controller
layout :default
helper :xhtml, :flash, :user, :fnordmetric
engine :etanni
trait :fnord_redis_url => "redis://redis.example.com:6379"
# This overrides Ramaze's default 404 handler
def self.action_missing(path)
return if path == '/error_404'
try_resolve('/error_404')
end
def error_404
flash[:error] = "Sorry, this page doesn't exist"
event(:status_404)
render_file("#{Ramaze.options.views[0]}/error_404.xhtml")
end
end
#!/usr/bin/env ruby
# Usage : ruby bin/metrics.rb run
require 'fnordmetric'
FnordMetric.namespace :myapp do
# Logins
# numeric (delta) gauge, 1-day tick
gauge :logins_per_day, :tick => 1.day.to_i, :title => "Daily logins"
gauge :logins_per_hour, :tick => 1.hour.to_i, :title => "Hourly logins"
event(:login) do
incr :logins_per_day
incr :logins_per_hour
end
# Logins failed
# numeric (delta) gauge, 1-day tick
gauge :logins_failed_per_day, :tick => 1.day.to_i, :title => "Daily failed logins"
gauge :logins_failed_per_hour, :tick => 1.hour.to_i, :title => "Hourly failed logins"
event(:login_failed) do
incr :logins_failed_per_day
incr :logins_failed_per_hour
end
# Logouts
# numeric (delta) gauge, 1-day tick
gauge :logouts_per_day, :tick => 1.day.to_i, :title => "Daily logouts"
gauge :logouts_per_hour, :tick => 1.hour.to_i, :title => "Hourly logouts"
event(:logout) do
incr :logouts_per_day
incr :logouts_per_hour
end
# 404 sent
# numeric (delta) gauge, 1-day/hour tick
gauge :status_404_per_day, :tick => 1.day.to_i, :title => "Daily 404s"
gauge :status_404_per_hour, :tick => 1.hour.to_i, :title => "Hourly 404s"
event(:status_404) do
incr :status_404_per_day
incr :status_404_per_hour
end
# All events
# numeric (progressive) gauge, 1-day tick
gauge :events_total, :tick => 1.day.to_i, :progressive => true, :title => "Daily Events (total)"
# on _every_ event
event :"*" do
incr :events_total
end
# Unique pageviews
# numeric (delta) gauge, increments uniquely by session_key
gauge :pageviews_daily_unique, :tick => 1.day.to_i, :unique => true, :title => "Unique Visits (Daily)"
# three-dimensional (delta) gauge (time->key->value)
gauge :pageviews_per_url_daily, :tick => 1.day.to_i, :title => "Daily Pageviews per URL", :three_dimensional => true
event :_pageview do
# increment the daily_uniques gauge by 1 if session_key hasn't been seen
# in this tick yet
incr :pageviews_daily_unique
# increment the pageviews_per_url_daily gauge by 1 where key = 'page2'
incr_field :pageviews_per_url_daily, data[:url]
end
#
# WIDGETS
#
widget 'Overview', {
:title => "Events per day",
:type => :timeline,
:plot_style => :areaspline,
:gauges => :events_total,
:include_current => true,
:autoupdate => 10
}
widget 'Overview', {
:title => "Visits per day",
:type => :timeline,
:plot_style => :areaspline,
:gauges => :pageviews_daily_unique,
:include_current => true,
:autoupdate => 10
}
widget 'Users', {
:title => "Connection activity per day",
:type => :timeline,
:plot_style => :areaspline,
:gauges => [ :logins_per_day, :logins_failed_per_day, :logouts_per_day ],
:include_current => true,
:autoupdate => 2
}
widget 'Users', {
:title => "Connection activity per hour",
:type => :timeline,
:plot_style => :areaspline,
:gauges => [ :logins_per_hour, :logins_failed_per_hour, :logouts_per_hour ],
:include_current => true,
:autoupdate => 2
}
widget 'Pages', {
:title => "Top Pages",
:type => :toplist,
:autoupdate => 20,
:gauges => [ :pageviews_per_url_daily ]
}
widget 'Pages', {
:title => "404 per hour",
:type => :timeline,
:plot_style => :areaspline,
:autoupdate => 20,
:include_current => true,
:gauges => :status_404_per_hour
}
widget 'Pages', {
:title => "404 per day",
:type => :timeline,
:plot_style => :areaspline,
:autoupdate => 20,
:include_current => true,
:gauges => :status_404_per_day
}
end
FnordMetric.standalone
class Users < Controller
helper :form_helper, :user, :gravatar, :fnordmetric
def index
redirect r(:login)
end
def create
@title = 'Inscription'
@subtitle = 'S\'inscrire'
end
def login
Ramaze::Log.debug("In User#login")
@title = "Connexion"
redirect_referer if logged_in?
return unless request.post?
user_login(request.subset(:email, :password))
if logged_in?
set_name(user.email)
set_picture(gravatar(user.email))
event(:login)
else
# Login failed
Ramaze::Log.debug("OMG login failed")
event(:login_failed)
redirect r(:login)
end
redirect Profiles.r(:index)
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment