trifle-stats 0.4.1 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,13 @@
1
+ # Enable Powerlevel10k instant prompt. Should stay close to the top of ~/.zshrc.
2
+ # Initialization code that may require console input (password prompts, [y/n]
3
+ # confirmations, etc.) must go above this block; everything else may go below.
4
+ if [[ -r "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh" ]]; then
5
+ source "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh"
6
+ fi
7
+
8
+ source /root/powerlevel10k/powerlevel10k.zsh-theme
9
+
10
+ # To customize prompt, run `p10k configure` or edit ~/.p10k.zsh.
11
+ [[ ! -f /root/.p10k.zsh ]] || source /root/.p10k.zsh
12
+
13
+ POWERLEVEL9K_DISABLE_CONFIGURATION_WIZARD=true
@@ -0,0 +1,54 @@
1
+ FROM debian:latest
2
+
3
+ ENV TZ=Europe/Bratislava
4
+ RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
5
+
6
+ # install ubuntu packages
7
+ RUN apt-get update -q \
8
+ && apt-get install -y \
9
+ build-essential \
10
+ apt-transport-https \
11
+ zsh \
12
+ libpq-dev \
13
+ git \
14
+ curl \
15
+ wget \
16
+ unzip \
17
+ gpg \
18
+ gnupg2 \
19
+ locales \
20
+ autoconf \
21
+ libssl-dev \
22
+ libreadline-dev \
23
+ zlib1g-dev \
24
+ tmux \
25
+ htop \
26
+ vim \
27
+ && apt-get clean
28
+
29
+ #set the locale
30
+ RUN locale-gen en_US.UTF-8
31
+ ENV LANG en_US.UTF-8
32
+ ENV LANGUAGE en_US:en
33
+ ENV LC_ALL en_US.UTF-8
34
+
35
+ RUN wget https://github.com/robbyrussell/oh-my-zsh/raw/master/tools/install.sh -O - | zsh || true
36
+ RUN git clone --depth=1 https://github.com/romkatv/powerlevel10k.git /root/powerlevel10k
37
+ COPY .zshrc /root/.zshrc
38
+ COPY .p10k.zsh /root/p10k.zsh
39
+
40
+ #install asdf
41
+ ENV ASDF_ROOT /root/.asdf
42
+ ENV PATH "${ASDF_ROOT}/bin:${ASDF_ROOT}/shims:$PATH"
43
+ RUN git clone https://github.com/asdf-vm/asdf.git ${ASDF_ROOT} --branch v0.10.0
44
+
45
+ RUN asdf plugin-add ruby https://github.com/asdf-vm/asdf-ruby.git
46
+
47
+ # install ruby
48
+ ENV RUBY_VERSION 3.0.0
49
+ RUN ASDF_RUBY_BUILD_VERSION=v20201225 asdf install ruby ${RUBY_VERSION} \
50
+ && asdf global ruby ${RUBY_VERSION}
51
+
52
+ RUN gem install bundler
53
+
54
+ CMD ["zsh"]
File without changes
File without changes
data/.gitpod.yml CHANGED
@@ -1,5 +1,5 @@
1
1
  image:
2
- file: .gitpod/Dockerfile
2
+ file: .devops/docker/gitpod/Dockerfile
3
3
  tasks:
4
4
  - init: bundle install
5
5
  command: ./bin/console
data/Gemfile.lock CHANGED
@@ -1,10 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- trifle-stats (0.4.1)
5
- mongo (>= 2.14.0)
6
- pg (>= 1.2)
7
- redis (>= 4.2)
4
+ trifle-stats (1.0.0)
8
5
  tzinfo (~> 2.0)
9
6
 
10
7
  GEM
@@ -13,7 +10,7 @@ GEM
13
10
  ast (2.4.2)
14
11
  bson (4.12.1)
15
12
  byebug (11.1.3)
16
- concurrent-ruby (1.1.9)
13
+ concurrent-ruby (1.1.10)
17
14
  diff-lcs (1.4.4)
18
15
  dotenv (2.7.6)
19
16
  mongo (2.14.0)
@@ -64,7 +61,10 @@ DEPENDENCIES
64
61
  bundler (~> 2.1)
65
62
  byebug
66
63
  dotenv
64
+ mongo (>= 2.14.0)
65
+ pg (>= 1.2)
67
66
  rake (~> 12.0)
67
+ redis (>= 4.2)
68
68
  rspec (~> 3.0)
69
69
  rubocop (= 1.0.0)
70
70
  trifle-stats!
data/README.md CHANGED
@@ -8,7 +8,7 @@ Simple analytics backed by Redis, Postgres, MongoDB, Google Analytics, Segment,
8
8
 
9
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, Postgres and MongoDB for now 💔.
12
12
 
13
13
  ## Documentation
14
14
 
@@ -24,11 +24,22 @@ gem 'trifle-stats'
24
24
 
25
25
  And then execute:
26
26
 
27
- $ bundle install
27
+ ```sh
28
+ $ bundle install
29
+ ```
28
30
 
29
31
  Or install it yourself as:
30
32
 
31
- $ gem install trifle-stats
33
+ ```sh
34
+ $ gem install trifle-stats
35
+ ```
36
+
37
+ Depending on driver you would like to use, make sure you add required gems into your `Gemfile`.
38
+ ```ruby
39
+ gem 'mongo', '>= 2.14.0'
40
+ gem 'pg', '>= 1.2'
41
+ gem 'redis', '>= 4.2'
42
+ ```
32
43
 
33
44
  ## Usage
34
45
 
@@ -45,25 +56,72 @@ end
45
56
 
46
57
  ### Track values
47
58
 
48
- Available ranges are `:minute`, `:hour`, `:day`, `:week`, `:month`, `:quarter`, `:year`.
59
+ Track your first metrics
49
60
 
50
- Now track your first metrics
51
61
  ```ruby
52
62
  Trifle::Stats.track(key: 'event::logs', at: Time.now, values: {count: 1, duration: 2, lines: 241})
53
63
  => [{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}}]
54
- # or do it few more times
64
+ ```
65
+
66
+ Then do it few more times
67
+
68
+ ```ruby
55
69
  Trifle::Stats.track(key: 'event::logs', at: Time.now, values: {count: 1, duration: 1, lines: 56})
56
70
  => [{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}}]
57
71
  Trifle::Stats.track(key: 'event::logs', at: Time.now, values: {count: 1, duration: 5, lines: 361})
58
72
  => [{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}}]
59
73
  ```
60
74
 
61
- ### Get values
75
+ You can also store nested counters like
76
+
77
+ ```ruby
78
+ Trifle::Stats.track(key: 'event::logs', at: Time.now, values: {
79
+ count: 1,
80
+ duration: {
81
+ parsing: 21,
82
+ compression: 8,
83
+ upload: 1
84
+ },
85
+ lines: 25432754
86
+ })
87
+ ```
88
+
89
+ #### Get values
90
+
91
+ Retrieve your values for specific `range`. Adding increments above will return sum of all the values you've tracked.
92
+
93
+ ```ruby
94
+ Trifle::Stats.values(key: 'event::logs', from: Time.now, to: Time.now, range: :day)
95
+ => {:at=>[2021-01-25 00:00:00 +0200], :values=>[{"count"=>3, "duration"=>8, "lines"=>658}]}
96
+ ```
97
+
98
+ ### Assert values
99
+
100
+ Asserting values works same way like incrementing, but instead of increment, it sets the value. Duh.
101
+
102
+ Set your first metrics
103
+
104
+ ```ruby
105
+ Trifle::Stats.assert(key: 'event::logs', at: Time.now, values: {count: 1, duration: 2, lines: 241})
106
+ => [{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}}]
107
+ ```
108
+
109
+ Then do it few more times
110
+
111
+ ```ruby
112
+ Trifle::Stats.assert(key: 'event::logs', at: Time.now, values: {count: 1, duration: 1, lines: 56})
113
+ => [{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}}]
114
+ Trifle::Stats.assert(key: 'event::logs', at: Time.now, values: {count: 1, duration: 5, lines: 361})
115
+ => [{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}}]
116
+ ```
117
+
118
+ #### Get values
119
+
120
+ Retrieve your values for specific `range`. As you just used `assert` above, it will return latest value you've asserted.
62
121
 
63
- Retrieve your values for specific `range`.
64
122
  ```ruby
65
123
  Trifle::Stats.values(key: 'event::logs', from: Time.now, to: Time.now, range: :day)
66
- => [{2021-01-25 00:00:00 +0100=>{"count"=>3, "duration"=>8, "lines"=>658}}]
124
+ => {:at=>[2021-01-25 00:00:00 +0200], :values=>[{"count"=>1, "duration"=>5, "lines"=>361}]}
67
125
  ```
68
126
 
69
127
  ## Contributing
@@ -4,7 +4,7 @@ Driver is a wrapper class that persists and retrieves values from backend. It ne
4
4
 
5
5
  - `inc(key:, **values)` method increment values
6
6
  - `set(key:, **values)` method set values
7
- - `get(key:)` method to retrieve values
7
+ - `get(keys:)` method to retrieve values
8
8
 
9
9
  ## Documentation
10
10
 
@@ -43,13 +43,12 @@ module Trifle
43
43
  }
44
44
  end
45
45
 
46
- def get(key:)
47
- pkey = key.join(separator)
48
-
49
- data = collection.find(key: pkey).limit(1).first
50
- return {} if data.nil? || data['data'].nil?
46
+ def get(keys:)
47
+ pkeys = keys.map { |key| key.join(separator) }
48
+ data = collection.find(key: { '$in' => pkeys })
49
+ map = data.inject({}) { |o, d| o.merge(d['key'] => d['data']) }
51
50
 
52
- data['data']
51
+ pkeys.map { |pkey| map[pkey] || {} }
53
52
  end
54
53
 
55
54
  private
@@ -44,13 +44,15 @@ module Trifle
44
44
  client.exec(query)
45
45
  end
46
46
 
47
- def get(key:)
48
- pkey = key.join(separator)
47
+ def get(keys:)
48
+ keys.map do |key|
49
+ pkey = key.join(separator)
49
50
 
50
- data = _get(key: pkey)
51
- return {} if data.nil?
51
+ data = _get(key: pkey)
52
+ return {} if data.nil?
52
53
 
53
- self.class.unpack(hash: data)
54
+ self.class.unpack(hash: data)
55
+ end
54
56
  end
55
57
 
56
58
  def _get(key:)
@@ -28,10 +28,12 @@ module Trifle
28
28
  end
29
29
  end
30
30
 
31
- def get(key:)
32
- self.class.unpack(
33
- hash: @data.fetch(key.join(@separator), {})
34
- )
31
+ def get(keys:)
32
+ keys.map do |key|
33
+ self.class.unpack(
34
+ hash: @data.fetch(key.join(@separator), {})
35
+ )
36
+ end
35
37
  end
36
38
  end
37
39
  end
@@ -30,12 +30,14 @@ module Trifle
30
30
  client.hmset(pkey, *self.class.pack(hash: values))
31
31
  end
32
32
 
33
- def get(key:)
34
- pkey = ([prefix] + key).join(separator)
33
+ def get(keys:)
34
+ keys.map do |key|
35
+ pkey = ([prefix] + key).join(separator)
35
36
 
36
- self.class.unpack(
37
- hash: client.hgetall(pkey)
38
- )
37
+ self.class.unpack(
38
+ hash: client.hgetall(pkey)
39
+ )
40
+ end
39
41
  end
40
42
  end
41
43
  end
@@ -24,13 +24,14 @@ module Trifle
24
24
  end
25
25
 
26
26
  def perform
27
- timeline.map do |at|
28
- {
29
- at => config.driver.get(
30
- key: [key, range, at.to_i]
31
- )
32
- }
33
- end
27
+ {
28
+ at: timeline,
29
+ values: config.driver.get(
30
+ keys: timeline.map do |at|
31
+ [key, range, at.to_i]
32
+ end
33
+ )
34
+ }
34
35
  end
35
36
  end
36
37
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Trifle
4
4
  module Stats
5
- VERSION = '0.4.1'
5
+ VERSION = '1.0.0'
6
6
  end
7
7
  end
data/trifle-stats.gemspec CHANGED
@@ -31,12 +31,12 @@ Gem::Specification.new do |spec|
31
31
  spec.add_development_dependency('bundler', '~> 2.1')
32
32
  spec.add_development_dependency('byebug', '>= 0')
33
33
  spec.add_development_dependency('dotenv')
34
+ spec.add_development_dependency('mongo', '>= 2.14.0')
35
+ spec.add_development_dependency('pg', '>= 1.2')
34
36
  spec.add_development_dependency('rake', '~> 13.0')
37
+ spec.add_development_dependency('redis', '>= 4.2')
35
38
  spec.add_development_dependency('rspec', '~> 3.2')
36
39
  spec.add_development_dependency('rubocop', '1.0.0')
37
40
 
38
- spec.add_runtime_dependency('mongo', '>= 2.14.0')
39
- spec.add_runtime_dependency('pg', '>= 1.2')
40
- spec.add_runtime_dependency('redis', '>= 4.2')
41
41
  spec.add_runtime_dependency('tzinfo', '~> 2.0')
42
42
  end
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.1
4
+ version: 1.0.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-07-11 00:00:00.000000000 Z
11
+ date: 2022-06-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -53,89 +53,89 @@ dependencies:
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
- name: rake
56
+ name: mongo
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - "~>"
59
+ - - ">="
60
60
  - !ruby/object:Gem::Version
61
- version: '13.0'
61
+ version: 2.14.0
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - "~>"
66
+ - - ">="
67
67
  - !ruby/object:Gem::Version
68
- version: '13.0'
68
+ version: 2.14.0
69
69
  - !ruby/object:Gem::Dependency
70
- name: rspec
70
+ name: pg
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - "~>"
73
+ - - ">="
74
74
  - !ruby/object:Gem::Version
75
- version: '3.2'
75
+ version: '1.2'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - "~>"
80
+ - - ">="
81
81
  - !ruby/object:Gem::Version
82
- version: '3.2'
82
+ version: '1.2'
83
83
  - !ruby/object:Gem::Dependency
84
- name: rubocop
84
+ name: rake
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - '='
87
+ - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: 1.0.0
89
+ version: '13.0'
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
- - - '='
94
+ - - "~>"
95
95
  - !ruby/object:Gem::Version
96
- version: 1.0.0
96
+ version: '13.0'
97
97
  - !ruby/object:Gem::Dependency
98
- name: mongo
98
+ name: redis
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
101
  - - ">="
102
102
  - !ruby/object:Gem::Version
103
- version: 2.14.0
104
- type: :runtime
103
+ version: '4.2'
104
+ type: :development
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
108
  - - ">="
109
109
  - !ruby/object:Gem::Version
110
- version: 2.14.0
110
+ version: '4.2'
111
111
  - !ruby/object:Gem::Dependency
112
- name: pg
112
+ name: rspec
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  requirements:
115
- - - ">="
115
+ - - "~>"
116
116
  - !ruby/object:Gem::Version
117
- version: '1.2'
118
- type: :runtime
117
+ version: '3.2'
118
+ type: :development
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
- - - ">="
122
+ - - "~>"
123
123
  - !ruby/object:Gem::Version
124
- version: '1.2'
124
+ version: '3.2'
125
125
  - !ruby/object:Gem::Dependency
126
- name: redis
126
+ name: rubocop
127
127
  requirement: !ruby/object:Gem::Requirement
128
128
  requirements:
129
- - - ">="
129
+ - - '='
130
130
  - !ruby/object:Gem::Version
131
- version: '4.2'
132
- type: :runtime
131
+ version: 1.0.0
132
+ type: :development
133
133
  prerelease: false
134
134
  version_requirements: !ruby/object:Gem::Requirement
135
135
  requirements:
136
- - - ">="
136
+ - - '='
137
137
  - !ruby/object:Gem::Version
138
- version: '4.2'
138
+ version: 1.0.0
139
139
  - !ruby/object:Gem::Dependency
140
140
  name: tzinfo
141
141
  requirement: !ruby/object:Gem::Requirement
@@ -159,11 +159,17 @@ executables: []
159
159
  extensions: []
160
160
  extra_rdoc_files: []
161
161
  files:
162
+ - ".devcontainer.json"
163
+ - ".devops/docker/codespaces/Dockerfile"
164
+ - ".devops/docker/codespaces/docker-compose.yml"
165
+ - ".devops/docker/environment/.p10k.zsh"
166
+ - ".devops/docker/environment/.zshrc"
167
+ - ".devops/docker/environment/Dockerfile"
168
+ - ".devops/docker/gitpod/Dockerfile"
169
+ - ".devops/docker/gitpod/base/Dockerfile"
162
170
  - ".github/workflows/ruby.yml"
163
171
  - ".gitignore"
164
172
  - ".gitpod.yml"
165
- - ".gitpod/Dockerfile"
166
- - ".gitpod/base/Dockerfile"
167
173
  - ".rspec"
168
174
  - ".rubocop.yml"
169
175
  - ".ruby-version"