trifle-stats 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|
[](https://badge.fury.io/rb/trifle-stats)
|
4
4
|

|
@@ -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: []
|