Project

influxer

0.06
A long-lived project that still receives updates
InfluxDB the Rails way
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
 Dependencies

Development

~> 10.1
>= 3.1.0
~> 0.2.0
~> 0.0.39
~> 2.1

Runtime

 Project Readme

Build

Influxer

Influxer provides an ActiveRecord-style way to work with InfluxDB with many useful features, such as:

Installation

Adding to a gem:

# my-cool-gem.gemspec
Gem::Specification.new do |spec|
  # ...
  spec.add_dependency "influxer", ">= 1.2.0"
  # ...
end

Or adding to your project:

# Gemfile
gem "influxer", "~> 1.2"

Usage

Metrics classes

To query InfluxDB or write to it, you should define a metrics class first. Each metrics class represents a measurement/series (or multiple related measurements):

class VisitsMetrics < Influxer::Metrics
  # Define tags...
  tags :account_id, :page_id
  # ...and attributes
  attributes :user_id, :browser
end

Querying

Now you can use your metrics classes in a similar way to Active Record models to build queries. For example:

VisitsMetrics.select(:account_id, :user_id).where(page_id: /^home\/.*/)

Influxer provides special query methods for dealing with time series:

  • Group by time: Metrics.time(:hour) => # select * ... group by time(1h).
  • Select only points for the last hour/minute/whatever: Metrics.past(:day) => # select * ... where time > now() - 1d.
  • Select only points since the specified time: Metrics.since(Time.utc(2014,12,31)) => # select * ... where time > 1419984000s.
  • and more.

See our Wiki for more.

Scopes support

You can define scopes to re-use query conditions:

class Metrics < Influxer::Metrics
  tags :account_id
  attributes :value

  default_scope -> { time(:hour).limit(1000) }

  scope :unlimited, -> { limit(nil) }
  scope :by_account, ->(id) { where(account_id: id) if id.present? }
end

Metrics.by_account(1)
# => select * from "metrics" group by time(1h) where account_id=1 limit 1000

Metrics.unlimited.by_account(1).time(:week)
# => select * from "metrics" group by time(1w) where account_id=1

Active Record integration

You can association metrics with Active Record models:

class UserVisits < Influxer::Metrics
end

class User < ActiveRecord::Base
  has_metrics :visits
end

user = User.find(1)
user.visits.write(page_id: "home")
#=> < creates point {user_id: 1, page_id: 'home'} in 'user_visits' series >

user.visits.where(page_id: "home")
#=> select * from user_visits where page_id='home'

Find more on Wiki.

Contributing

Bug reports and pull requests are welcome on GitHub at https://github.com/palkan/influxer.

License

The gem is available as open source under the terms of the MIT License.