Simple analytics backed by Redis, Postgres, MongoDB, Google Analytics, Segment, or whatever. 1
Trifle::Stats
is a way too simple timeline analytics that helps you track custom metrics. Automatically increments counters for each enabled range. It supports timezones and different week beginning.
You can find guides and documentation at https://trifle.io/trifle-stats
Add this line to your application's Gemfile:
gem 'trifle-stats'
And then execute:
$ bundle install
Or install it yourself as:
$ gem install trifle-stats
Depending on driver you would like to use, make sure you add required gems into your Gemfile
.
gem 'mongo', '>= 2.14.0'
gem 'pg', '>= 1.2'
gem 'redis', '>= 4.2'
You don't need to use it with Rails, but you still need to run Trifle::Stats.configure
. If youre running it with Rails, create config/initializers/trifle-stats.rb
and configure the gem.
Trifle::Stats.configure do |config|
config.driver = Trifle::Stats::Driver::Redis.new
config.track_ranges = [:hour, :day]
config.time_zone = 'Europe/Bratislava'
config.beginning_of_week = :monday
end
Track your first metrics
Trifle::Stats.track(key: 'event::logs', at: Time.now, values: {count: 1, duration: 2, lines: 241})
=> [{2021-01-25 16:00:00 +0100=>{:count=>1, :duration=>2, :lines=>241}}, {2021-01-25 00:00:00 +0100=>{:count=>1, :duration=>2, :lines=>241}}]
Then do it few more times
Trifle::Stats.track(key: 'event::logs', at: Time.now, values: {count: 1, duration: 1, lines: 56})
=> [{2021-01-25 16:00:00 +0100=>{:count=>1, :duration=>1, :lines=>56}}, {2021-01-25 00:00:00 +0100=>{:count=>1, :duration=>1, :lines=>56}}]
Trifle::Stats.track(key: 'event::logs', at: Time.now, values: {count: 1, duration: 5, lines: 361})
=> [{2021-01-25 16:00:00 +0100=>{:count=>1, :duration=>5, :lines=>361}}, {2021-01-25 00:00:00 +0100=>{:count=>1, :duration=>5, :lines=>361}}]
You can also store nested counters like
Trifle::Stats.track(key: 'event::logs', at: Time.now, values: {
count: 1,
duration: {
parsing: 21,
compression: 8,
upload: 1
},
lines: 25432754
})
Retrieve your values for specific range
. Adding increments above will return sum of all the values you've tracked.
Trifle::Stats.values(key: 'event::logs', from: Time.now, to: Time.now, range: :day)
=> {:at=>[2021-01-25 00:00:00 +0200], :values=>[{"count"=>3, "duration"=>8, "lines"=>658}]}
Asserting values works same way like incrementing, but instead of increment, it sets the value. Duh.
Set your first metrics
Trifle::Stats.assert(key: 'event::logs', at: Time.now, values: {count: 1, duration: 2, lines: 241})
=> [{2021-01-25 16:00:00 +0100=>{:count=>1, :duration=>2, :lines=>241}}, {2021-01-25 00:00:00 +0100=>{:count=>1, :duration=>2, :lines=>241}}]
Then do it few more times
Trifle::Stats.assert(key: 'event::logs', at: Time.now, values: {count: 1, duration: 1, lines: 56})
=> [{2021-01-25 16:00:00 +0100=>{:count=>1, :duration=>1, :lines=>56}}, {2021-01-25 00:00:00 +0100=>{:count=>1, :duration=>1, :lines=>56}}]
Trifle::Stats.assert(key: 'event::logs', at: Time.now, values: {count: 1, duration: 5, lines: 361})
=> [{2021-01-25 16:00:00 +0100=>{:count=>1, :duration=>5, :lines=>361}}, {2021-01-25 00:00:00 +0100=>{:count=>1, :duration=>5, :lines=>361}}]
Retrieve your values for specific range
. As you just used assert
above, it will return latest value you've asserted.
Trifle::Stats.values(key: 'event::logs', from: Time.now, to: Time.now, range: :day)
=> {:at=>[2021-01-25 00:00:00 +0200], :values=>[{"count"=>1, "duration"=>5, "lines"=>361}]}
Bug reports and pull requests are welcome on GitHub at https://github.com/trifle-io/trifle-stats.
Footnotes
-
TBH only Redis, Postgres and MongoDB for now 💔. ↩