Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/palkan/influxer

InfluxDB ActiveRecord-style
https://github.com/palkan/influxer

hacktoberfest influxdb rails ruby

Last synced: 25 days ago
JSON representation

InfluxDB ActiveRecord-style

Awesome Lists containing this project

README

        

![Build](https://github.com/palkan/influxer/workflows/Rspec/badge.svg)

# Influxer

Influxer provides an ActiveRecord-style way to work with [InfluxDB](https://influxdb.com/) with many useful features, such as:

## Installation

Adding to a gem:

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

Or adding to your project:

```ruby
# 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):

```ruby
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:

```ruby
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](https://github.com/palkan/influxer/wiki/Query-methods) for more.

### Scopes support

You can define scopes to re-use query conditions:

```ruby
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:

```ruby
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](https://github.com/palkan/influxer/wiki/ActiveRecord-integration).

## Contributing

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

## License

The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).