trifle-stats 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/README.md +7 -65
- data/lib/trifle/stats.rb +10 -0
- data/lib/trifle/stats/driver/README.md +5 -53
- data/lib/trifle/stats/driver/redis.rb +6 -0
- data/lib/trifle/stats/operations/timeseries/set.rb +34 -0
- data/lib/trifle/stats/version.rb +1 -1
- data/trifle-stats.gemspec +8 -6
- metadata +10 -8
- data/.travis.yml +0 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 61ed8d636a39a6b304b1877d29f6c70b6653b59c0a0a4e18bf9099cf0c903c7d
|
4
|
+
data.tar.gz: 99488122d8ac47e900dd3764cc61f3012a00a47433dd8b6a857185220fc72335
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7e4885fb88963d054b811c68a717e7e77dc9ddad55c11a499f98d599531f2fda6c12dd14e8cb680c367a7260976a6a411f7008845913323813bcaa9d1854e1bb
|
7
|
+
data.tar.gz: ca1153f0d6ea56daf21d1fd507e0603e82bcfda0670a2093e6148a199928350d31ca7a980067d90add1e8c810fb719024602596764e8b025a490b7f9e3970780
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Trifle
|
1
|
+
# Trifle::Stats
|
2
2
|
|
3
3
|
[![Gem Version](https://badge.fury.io/rb/trifle-stats.svg)](https://badge.fury.io/rb/trifle-stats)
|
4
4
|
![Ruby](https://github.com/trifle-io/trifle-stats/workflows/Ruby/badge.svg?branch=main)
|
@@ -6,9 +6,13 @@
|
|
6
6
|
|
7
7
|
Simple analytics backed by Redis, Postgres, MongoDB, Google Analytics, Segment, or whatever. [^1]
|
8
8
|
|
9
|
-
Trifle 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.
|
9
|
+
`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.
|
10
10
|
|
11
|
-
[^1] TBH only Redis for now 💔.
|
11
|
+
[^1]: TBH only Redis for now 💔.
|
12
|
+
|
13
|
+
## Documentation
|
14
|
+
|
15
|
+
You can find guides and documentation at https://trifle.io/docs/stats
|
12
16
|
|
13
17
|
## Installation
|
14
18
|
|
@@ -54,19 +58,6 @@ Trifle::Stats.track(key: 'event::logs', at: Time.now, values: {count: 1, duratio
|
|
54
58
|
=> [{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}}]
|
55
59
|
```
|
56
60
|
|
57
|
-
You can also store nested counters like
|
58
|
-
```ruby
|
59
|
-
Trifle::Stats.track(key: 'event::logs', at: Time.now, values: {
|
60
|
-
count: 1,
|
61
|
-
duration: {
|
62
|
-
parsing: 21,
|
63
|
-
compression: 8,
|
64
|
-
upload: 1
|
65
|
-
},
|
66
|
-
lines: 25432754
|
67
|
-
})
|
68
|
-
```
|
69
|
-
|
70
61
|
### Get values
|
71
62
|
|
72
63
|
Retrieve your values for specific `range`.
|
@@ -75,55 +66,6 @@ Trifle::Stats.values(key: 'event::logs', from: Time.now, to: Time.now, range: :d
|
|
75
66
|
=> [{2021-01-25 00:00:00 +0100=>{"count"=>3, "duration"=>8, "lines"=>658}}]
|
76
67
|
```
|
77
68
|
|
78
|
-
### Configuration
|
79
|
-
|
80
|
-
Configuration allows you to specify:
|
81
|
-
- `driver` - backend driver used to persist and retrieve data.
|
82
|
-
- `track_ranges` - list of timeline ranges you would like to track. Value must be list of symbols, defaults to `[:minute, :hour, :day, :week, :month, :quarter, :year]`.
|
83
|
-
- `separator` - keys can get serialized in backend, separator is used to join these values. Value must be string, defaults to `::`.
|
84
|
-
- `time_zone` - TZInfo zone to properly generate range for timeline values. Value must be valid TZ string identifier, otherwise it defaults and fallbacks to `'GMT'`.
|
85
|
-
- `beginning_of_week` - first day of week. Value must be string, defaults to `:monday`.
|
86
|
-
|
87
|
-
Gem expecs global configuration to be present. You can do this by creating initializer, or calling it on the beginning of your ruby script.
|
88
|
-
|
89
|
-
Custom configuration can be passed as a keyword argument to `Resource` objects and all module methods (`track`, `values`). This way you can pass different driver or ranges for different type of data youre storing - ie set different ranges or set expiration date on your data.
|
90
|
-
|
91
|
-
```ruby
|
92
|
-
configuration = Trifle::Stats::Configuration.new
|
93
|
-
configuration.driver = Trifle::Stats::Driver::Redis.new
|
94
|
-
configuration.track_ranges = [:day]
|
95
|
-
configuration.time_zone = 'GMT'
|
96
|
-
configuration.separator = '#'
|
97
|
-
|
98
|
-
# or use different driver
|
99
|
-
mongo_configuration = Trifle::Stats::Configuration.new
|
100
|
-
mongo_configuration.driver = Trifle::Stats::Driver::MongoDB.new
|
101
|
-
mongo_configuration.time_zone = 'Asia/Dubai'
|
102
|
-
```
|
103
|
-
|
104
|
-
You can then pass it into module methods.
|
105
|
-
```ruby
|
106
|
-
Trifle::Stats.track(key: 'event#checkout', at: Time.now, values: {count: 1}, config: configuration)
|
107
|
-
|
108
|
-
Trifle::Stats.track(key: 'event#checkout', at: Time.now, values: {count: 1}, config: mongo_configuration)
|
109
|
-
```
|
110
|
-
|
111
|
-
### Driver
|
112
|
-
|
113
|
-
Driver is a wrapper around existing client libraries that talk to DB or API. It is used to store and retrieve values. You can read more in [Driver Readme](https://github.com/trifle-io/trifle-stats/tree/main/lib/trifle/ruby/driver).
|
114
|
-
|
115
|
-
## Development
|
116
|
-
|
117
|
-
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
118
|
-
|
119
|
-
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
120
|
-
|
121
|
-
## Gitpod
|
122
|
-
|
123
|
-
This repository comes Gitpod ready. If you wanna try and get your hands dirty with Trifle, click [here](https://gitpod.io/#https://github.com/trifle-io/trifle-stats) and watch magic happening.
|
124
|
-
|
125
|
-
It launches from custom base image that includes Redis, MongoDB, Postgres & MariaDB. This should give you enough playground to launch `./bin/console` and start messing around. You can see the Gitpod image in the [hub](https://hub.docker.com/r/trifle/gitpod).
|
126
|
-
|
127
69
|
## Contributing
|
128
70
|
|
129
71
|
Bug reports and pull requests are welcome on GitHub at https://github.com/trifle-io/trifle-stats.
|
data/lib/trifle/stats.rb
CHANGED
@@ -6,6 +6,7 @@ require 'trifle/stats/mixins/packer'
|
|
6
6
|
require 'trifle/stats/nocturnal'
|
7
7
|
require 'trifle/stats/configuration'
|
8
8
|
require 'trifle/stats/operations/timeseries/increment'
|
9
|
+
require 'trifle/stats/operations/timeseries/set'
|
9
10
|
require 'trifle/stats/operations/timeseries/values'
|
10
11
|
require 'trifle/stats/version'
|
11
12
|
|
@@ -33,6 +34,15 @@ module Trifle
|
|
33
34
|
).perform
|
34
35
|
end
|
35
36
|
|
37
|
+
def self.assert(key:, at:, values:, config: nil)
|
38
|
+
Trifle::Stats::Operations::Timeseries::Set.new(
|
39
|
+
key: key,
|
40
|
+
at: at,
|
41
|
+
values: values,
|
42
|
+
config: config
|
43
|
+
).perform
|
44
|
+
end
|
45
|
+
|
36
46
|
def self.values(key:, from:, to:, range:, config: nil)
|
37
47
|
Trifle::Stats::Operations::Timeseries::Values.new(
|
38
48
|
key: key,
|
@@ -1,59 +1,11 @@
|
|
1
1
|
# Driver
|
2
2
|
|
3
3
|
Driver is a wrapper class that persists and retrieves values from backend. It needs to implement:
|
4
|
-
- `inc(key:, **values)` method to store values
|
5
|
-
- `get(key:)` method to retrieve values
|
6
|
-
|
7
|
-
## Packer Mixin
|
8
|
-
|
9
|
-
Some databases cannot store nested hashes/values. Or they cannot perform increment on nested values that does not exist. For this reason you can use Packer mixin that helps you convert values to dot notation.
|
10
|
-
|
11
|
-
```ruby
|
12
|
-
class Sample
|
13
|
-
include Trifle::Stats::Mixins::Packer
|
14
|
-
end
|
15
|
-
|
16
|
-
values = { a: 1, b: { c: 22, d: 33 } }
|
17
|
-
=> {:a=>1, :b=>{:c=>22, :d=>33}}
|
18
|
-
|
19
|
-
packed = Sample.pack(hash: values)
|
20
|
-
=> {"a"=>1, "b.c"=>22, "b.d"=>33}
|
21
|
-
|
22
|
-
Sample.unpack(hash: packed)
|
23
|
-
=> {"a"=>1, "b"=>{"c"=>22, "d"=>33}}
|
24
|
-
```
|
25
4
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
```ruby
|
31
|
-
irb(main):001:1* class Dummy
|
32
|
-
irb(main):002:2* def inc(key:, **values)
|
33
|
-
irb(main):003:2* puts "Dumping #{key} => #{values}"
|
34
|
-
irb(main):004:1* end
|
35
|
-
irb(main):005:2* def get(key:)
|
36
|
-
irb(main):006:2* puts "Random for #{key}"
|
37
|
-
irb(main):007:2* { count: rand(1000) }
|
38
|
-
irb(main):008:1* end
|
39
|
-
irb(main):009:0> end
|
40
|
-
=> :get
|
41
|
-
|
42
|
-
irb(main):010:0> c = Trifle::Stats::Configuration.new
|
43
|
-
=> #<Trifle::Stats::Configuration:0x00007fe179aed848 @separator="::", @ranges=[:minute, :hour, :day, :week, :month, :quarter, :year], @beginning_of_week=:monday, @time_zone="GMT">
|
44
|
-
|
45
|
-
irb(main):011:0> c.driver = Dummy.new
|
46
|
-
=> #<Dummy:0x00007fe176302ac8>
|
47
|
-
|
48
|
-
irb(main):012:0> c.track_ranges = [:minute, :hour]
|
49
|
-
=> [:minute, :hour]
|
5
|
+
- `inc(key:, **values)` method add values
|
6
|
+
- `set(key:, **values)` method set values
|
7
|
+
- `get(key:)` method to retrieve values
|
50
8
|
|
51
|
-
|
52
|
-
Dumping sample::minute::1611696240 => {:count=>1}
|
53
|
-
Dumping sample::hour::1611694800 => {:count=>1}
|
54
|
-
=> [{2021-01-26 21:24:00 +0000=>{:count=>1}}, {2021-01-26 21:00:00 +0000=>{:count=>1}}]
|
9
|
+
## Documentation
|
55
10
|
|
56
|
-
|
57
|
-
Random for sample::hour::1611694800
|
58
|
-
=> [{2021-01-26 21:00:00 +0000=>{:count=>405}}]
|
59
|
-
```
|
11
|
+
For more details about Drivers, please refer to https://trifle.io/docs/stats/drivers
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Trifle
|
4
|
+
module Stats
|
5
|
+
module Operations
|
6
|
+
module Timeseries
|
7
|
+
class Set
|
8
|
+
attr_reader :key, :values
|
9
|
+
|
10
|
+
def initialize(**keywords)
|
11
|
+
@key = keywords.fetch(:key)
|
12
|
+
@at = keywords.fetch(:at)
|
13
|
+
@values = keywords.fetch(:values)
|
14
|
+
@config = keywords[:config]
|
15
|
+
end
|
16
|
+
|
17
|
+
def config
|
18
|
+
@config || Trifle::Stats.default
|
19
|
+
end
|
20
|
+
|
21
|
+
def perform
|
22
|
+
config.ranges.map do |range|
|
23
|
+
at = Nocturnal.new(@at, config: config).send(range)
|
24
|
+
config.driver.set(
|
25
|
+
key: [key, range, at.to_i].join(config.separator),
|
26
|
+
**values
|
27
|
+
)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
data/lib/trifle/stats/version.rb
CHANGED
data/trifle-stats.gemspec
CHANGED
@@ -6,15 +6,17 @@ Gem::Specification.new do |spec|
|
|
6
6
|
spec.authors = ['Jozef Vaclavik']
|
7
7
|
spec.email = ['jozef@hey.com']
|
8
8
|
|
9
|
-
spec.summary = 'Simple analytics
|
10
|
-
|
11
|
-
|
12
|
-
'
|
13
|
-
|
9
|
+
spec.summary = 'Simple analytics backed by Redis, Postgres, MongoDB, '\
|
10
|
+
'Google Analytics, Segment, or whatever.'
|
11
|
+
spec.description = 'Trifle::Stats is a way too simple timeline analytics '\
|
12
|
+
'that helps you track custom metrics. Automatically '\
|
13
|
+
'increments counters for each enabled range. '\
|
14
|
+
'It supports timezones and different week beginning.'
|
15
|
+
spec.homepage = "https://trifle.io"
|
14
16
|
spec.required_ruby_version = Gem::Requirement.new('>= 2.6')
|
15
17
|
|
16
18
|
spec.metadata['homepage_uri'] = spec.homepage
|
17
|
-
spec.metadata['source_code_uri'] =
|
19
|
+
spec.metadata['source_code_uri'] = 'https://github.com/trifle-io/trifle-stats'
|
18
20
|
|
19
21
|
# Specify which files should be added to the gem when it is released.
|
20
22
|
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: trifle-stats
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jozef Vaclavik
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-04-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -122,8 +122,9 @@ dependencies:
|
|
122
122
|
- - "~>"
|
123
123
|
- !ruby/object:Gem::Version
|
124
124
|
version: '2.0'
|
125
|
-
description: Trifle
|
126
|
-
for each range.
|
125
|
+
description: Trifle::Stats is a way too simple timeline analytics that helps you track
|
126
|
+
custom metrics. Automatically increments counters for each enabled range. It supports
|
127
|
+
timezones and different week beginning.
|
127
128
|
email:
|
128
129
|
- jozef@hey.com
|
129
130
|
executables: []
|
@@ -139,7 +140,6 @@ files:
|
|
139
140
|
- ".rubocop.yml"
|
140
141
|
- ".ruby-version"
|
141
142
|
- ".tool-versions"
|
142
|
-
- ".travis.yml"
|
143
143
|
- Gemfile
|
144
144
|
- Gemfile.lock
|
145
145
|
- LICENSE
|
@@ -155,13 +155,14 @@ files:
|
|
155
155
|
- lib/trifle/stats/mixins/packer.rb
|
156
156
|
- lib/trifle/stats/nocturnal.rb
|
157
157
|
- lib/trifle/stats/operations/timeseries/increment.rb
|
158
|
+
- lib/trifle/stats/operations/timeseries/set.rb
|
158
159
|
- lib/trifle/stats/operations/timeseries/values.rb
|
159
160
|
- lib/trifle/stats/version.rb
|
160
161
|
- trifle-stats.gemspec
|
161
|
-
homepage: https://
|
162
|
+
homepage: https://trifle.io
|
162
163
|
licenses: []
|
163
164
|
metadata:
|
164
|
-
homepage_uri: https://
|
165
|
+
homepage_uri: https://trifle.io
|
165
166
|
source_code_uri: https://github.com/trifle-io/trifle-stats
|
166
167
|
post_install_message:
|
167
168
|
rdoc_options: []
|
@@ -181,5 +182,6 @@ requirements: []
|
|
181
182
|
rubygems_version: 3.2.3
|
182
183
|
signing_key:
|
183
184
|
specification_version: 4
|
184
|
-
summary: Simple analytics
|
185
|
+
summary: Simple analytics backed by Redis, Postgres, MongoDB, Google Analytics, Segment,
|
186
|
+
or whatever.
|
185
187
|
test_files: []
|