Nightfury provides a reporting framework built on Redis for Ruby/Ruby on Rails applications. The framework is designed to store different metrics in a time series or as a single value which can be easily queried. The following are the key terms:
A identity is an entity for which you want to store reports.
- In a ticketing system this might be
Company
or aTicket
or anAgent
- It has an id (can auto-generate but generally provided so you can map it to your db ids etc). So each
Company
can have its ownCompanyIdentity
- It has many metrics.
An identity has many metrics.
- Metric can be a single value or a time series.
- The value can be aggregate (average)
Identities can be tagged and have multiple tags. You can ask for stats for identities with certain tags over a particular time range (if the metric is a series)
Lets have a CompanyIdentity
to track metrics of a company
class CompanyIdentity < Nightfury::Identity::Base
metric :number_of_users
metric :tickets_count, :count_time_series, step: :day
metric :first_response_time, :avg_time_series, step: :day
end
You can store single valued metric, generally used to store counts. In the above example number_of_users
is a single valued metric. You can do the following operations on the metric.
c = CompanyIdentity.new(1) # where 1 is the id
c.number_of_users.set(0)
# increment by 1
c.number_of_users.incr
# increment by 10
c.number_of_users.incr(10)
# decrement by 1
c.number_of_users.decr
# decrement by 5
c.number_of_users.decr(5)
puts "Ticket Count; should be 5 \n #{c.ticket_count.get}"
You can track a metric over time. NightFury stores the values in an time series. You can define the period between the day points using the step
parameter.
In the above example tickets_count
is a count_time_series
with a step day
. You can do the following operations on the metric.
time_now = Time.now
yesterday = time_now - 1.day
tomorrow = time_now + 1.day
# Increment yesterday's ticket count by 1
c.tickets_count.incr(1, yesterday)
# Increment yesterday's ticket count by 2
c.tickets_count.incr(1, yesterday)
# Decrement yesterday's ticket count by 1
c.tickets_count.decr(1, yesterday)
# Increment today's ticket count by 1
# By default the incr_by argument is 1 and timestamp argument is Time.now
# NightFury figures out the right datapoint to act on depending the timestamp and step of the metric
c.tickets_count.incr
# Get all datapoints between yesterday and tomorrow
c.tickets_count.get_range(yesterday, tomorrow)
# Get all datapoints
c.tickets_count.get_all
NightFury also supports avg_time_series
. When you set a value of a avg_time_series
metric, NightFury atomatically calculates the average for that step and stores it.
# set the first_response_time of today
c.first_response_time.set(1)
c.first_response_time.set(2)
# get the latest data point
c.get #=> {'1380176549' => '1.5'}
See example.rb for more usage
Add this line to your application's Gemfile:
gem 'nightfury'
And then execute:
$ bundle
Or install it yourself as:
$ gem install nightfury
We built NightFury to power the reporting of SupportBee
It is also used to provide analytics in WhatsNew
- Fork it
- Create your feature branch (
git checkout -b my-new-feature
) - Commit your changes (
git commit -am 'Added some feature'
) - Push to the branch (
git push origin my-new-feature
) - Create new Pull Request