time_bandits 0.14.1 → 0.15.1
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/.github/workflows/run-tests.yml +14 -6
- data/Appraisals +10 -5
- data/Gemfile +17 -0
- data/docker-compose.yml +0 -2
- data/lib/time_bandits/monkey_patches/active_record/runtime_registry.rb +37 -17
- data/lib/time_bandits/version.rb +1 -1
- data/lib/time_bandits.rb +1 -0
- data/test/test_helper.rb +7 -1
- data/test/unit/database_test.rb +17 -4
- data/test/unit/memcached_test.rb +1 -0
- data/time_bandits.gemspec +2 -14
- metadata +7 -161
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c8accff0f311ddde1179df3cc05c0eb0a879400c8a46303722f2c75ceae0a01b
|
4
|
+
data.tar.gz: 972da28dd9edb00a26bb55370999837d2a79eb57c357fea44031dac538edfd64
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 76a298b94547bf8874be722d77785d464c5c6369d9df5edfd829634903d082b95050499fe5ba13ff98b842563f6ce15b8ad9b686b8f65e1a33d204af554da327
|
7
|
+
data.tar.gz: 914d0c357a3d61804a97b4f98ddcab98d8cad1c817eef78a73c6bb0307083abcec99f8699676ea3efe040fd7aa4276290a1bf0de9c1333caba3709bce5c91a56
|
@@ -9,17 +9,25 @@ on:
|
|
9
9
|
jobs:
|
10
10
|
test:
|
11
11
|
|
12
|
-
runs-on: ubuntu-latest
|
13
|
-
|
14
12
|
strategy:
|
15
13
|
matrix:
|
16
|
-
|
14
|
+
include:
|
15
|
+
- os: ubuntu-latest
|
16
|
+
ruby-version: 3.4.2
|
17
|
+
- os: ubuntu-latest
|
18
|
+
ruby-version: 3.3.7
|
19
|
+
- os: ubuntu-20.04
|
20
|
+
ruby-version: 3.2.7
|
21
|
+
- os: ubuntu-20.04
|
22
|
+
ruby-version: 3.1.6
|
23
|
+
|
24
|
+
runs-on: ${{ matrix.os }}
|
17
25
|
|
18
26
|
steps:
|
19
|
-
- uses: actions/checkout@
|
27
|
+
- uses: actions/checkout@v4
|
20
28
|
|
21
29
|
- name: Start containers
|
22
|
-
run: docker
|
30
|
+
run: docker compose -f docker-compose.yml up -d
|
23
31
|
|
24
32
|
- name: Set up Ruby ${{ matrix.ruby-version }}
|
25
33
|
uses: ruby/setup-ruby@v1
|
@@ -43,4 +51,4 @@ jobs:
|
|
43
51
|
|
44
52
|
- name: Stop containers
|
45
53
|
if: always()
|
46
|
-
run: docker
|
54
|
+
run: docker compose -f "docker-compose.yml" down
|
data/Appraisals
CHANGED
@@ -1,11 +1,16 @@
|
|
1
1
|
appraisals = [
|
2
|
-
"6.
|
3
|
-
"
|
4
|
-
"7.
|
5
|
-
"7.1.0"
|
2
|
+
"6.1.7.10",
|
3
|
+
"7.0.8.7",
|
4
|
+
"7.1.5.1",
|
6
5
|
]
|
7
6
|
|
8
|
-
|
7
|
+
if RUBY_VERSION >= "3.1"
|
8
|
+
appraisals << "7.2.2.1"
|
9
|
+
end
|
10
|
+
|
11
|
+
if RUBY_VERSION >= "3.2"
|
12
|
+
appraisals << "8.0.0.1"
|
13
|
+
end
|
9
14
|
|
10
15
|
appraisals.each do |rails_version|
|
11
16
|
%w(4.0 5.0).each do |redis_version|
|
data/Gemfile
CHANGED
@@ -3,4 +3,21 @@ source "https://rubygems.org"
|
|
3
3
|
# Specify your gem's dependencies in time_bandits.gemspec
|
4
4
|
gemspec
|
5
5
|
|
6
|
+
gem "ansi"
|
7
|
+
gem "appraisal"
|
8
|
+
gem "byebug"
|
9
|
+
gem "dalli"
|
10
|
+
gem "memcached", "~> 1.8.0" if RUBY_VERSION < "3.3.0"
|
11
|
+
gem "minitest"
|
12
|
+
gem "minitest-reporters"
|
13
|
+
gem "mocha"
|
14
|
+
gem "mysql2"
|
15
|
+
gem "rake"
|
16
|
+
gem "redis"
|
17
|
+
gem "sequel"
|
18
|
+
gem "activerecord"
|
19
|
+
gem "beetle", ">= 3.4.1"
|
20
|
+
gem "ostruct"
|
21
|
+
gem "logger"
|
22
|
+
|
6
23
|
gem "hiredis-client"
|
data/docker-compose.yml
CHANGED
@@ -1,29 +1,44 @@
|
|
1
1
|
# This file monkey patches class ActiveRecord::RuntimeRegistry to
|
2
2
|
# additionally store call counts and cache hits and subscribes an
|
3
|
-
# event listener to manage those counters.
|
3
|
+
# event listener to manage those counters. It is used if the active
|
4
|
+
# record version is 7.1.0 or higher.
|
4
5
|
|
5
6
|
require "active_record/runtime_registry"
|
6
7
|
|
7
8
|
module ActiveRecord
|
8
9
|
module RuntimeRegistry
|
9
10
|
|
10
|
-
|
11
|
-
|
12
|
-
|
11
|
+
if respond_to?(:queries_count)
|
12
|
+
alias_method :call_count, :queries_count
|
13
|
+
alias_method :call_count=, :queries_count=
|
14
|
+
else
|
15
|
+
def self.call_count
|
16
|
+
ActiveSupport::IsolatedExecutionState[:active_record_sql_call_count] ||= 0
|
17
|
+
end
|
13
18
|
|
14
|
-
|
15
|
-
|
19
|
+
def self.call_count=(value)
|
20
|
+
ActiveSupport::IsolatedExecutionState[:active_record_sql_call_count] = value
|
21
|
+
end
|
16
22
|
end
|
17
23
|
|
18
|
-
|
19
|
-
|
20
|
-
|
24
|
+
if respond_to?(:cached_queries_count)
|
25
|
+
alias_method :query_cache_hits, :cached_queries_count
|
26
|
+
alias_method :query_cache_hits=, :cached_queries_count=
|
27
|
+
else
|
28
|
+
def self.query_cache_hits
|
29
|
+
ActiveSupport::IsolatedExecutionState[:active_record_sql_query_cache_hits] ||= 0
|
30
|
+
end
|
21
31
|
|
22
|
-
|
23
|
-
|
24
|
-
|
32
|
+
def self.query_cache_hits=(value)
|
33
|
+
ActiveSupport::IsolatedExecutionState[:active_record_sql_query_cache_hits] = value
|
34
|
+
end
|
35
|
+
end
|
25
36
|
|
26
|
-
|
37
|
+
if respond_to?(:reset_runtimes)
|
38
|
+
alias_method :reset_runtime, :reset_runtimes
|
39
|
+
else
|
40
|
+
alias_method :reset_runtime, :reset
|
41
|
+
end
|
27
42
|
alias_method :runtime, :sql_runtime
|
28
43
|
alias_method :runtime=, :sql_runtime=
|
29
44
|
|
@@ -42,9 +57,14 @@ module ActiveRecord
|
|
42
57
|
end
|
43
58
|
end
|
44
59
|
|
45
|
-
require "active_support/notifications"
|
46
60
|
|
47
|
-
|
48
|
-
|
49
|
-
|
61
|
+
# Rails 7.2 already collects query counts and cache hits, so we no
|
62
|
+
# longer need our own event handler.
|
63
|
+
unless ActiveRecord::RuntimeRegistry.respond_to?(:queries_count)
|
64
|
+
require "active_support/notifications"
|
65
|
+
|
66
|
+
ActiveSupport::Notifications.monotonic_subscribe("sql.active_record") do |event|
|
67
|
+
ActiveRecord::RuntimeRegistry.call_count += 1
|
68
|
+
ActiveRecord::RuntimeRegistry.query_cache_hits += 1 if event.payload[:cached]
|
69
|
+
end
|
50
70
|
end
|
data/lib/time_bandits/version.rb
CHANGED
data/lib/time_bandits.rb
CHANGED
data/test/test_helper.rb
CHANGED
@@ -1,8 +1,14 @@
|
|
1
1
|
require 'minitest'
|
2
2
|
require 'mocha/minitest'
|
3
|
-
require 'minitest/pride'
|
4
3
|
require 'minitest/autorun'
|
5
4
|
|
5
|
+
require 'minitest/reporters'
|
6
|
+
if ENV['MINITEST_REPORTER']
|
7
|
+
Minitest::Reporters.use!
|
8
|
+
else
|
9
|
+
Minitest::Reporters.use!([Minitest::Reporters::DefaultReporter.new])
|
10
|
+
end
|
11
|
+
|
6
12
|
require 'active_support/testing/declarative'
|
7
13
|
module Test
|
8
14
|
module Unit
|
data/test/unit/database_test.rb
CHANGED
@@ -46,6 +46,8 @@ class DatabaseTest < Test::Unit::TestCase
|
|
46
46
|
|
47
47
|
test "accessing current runtime" do
|
48
48
|
metrics_store.runtime += 1.234
|
49
|
+
assert_equal 1.234, metrics_store.runtime
|
50
|
+
assert_equal 1.234, bandit.current_runtime
|
49
51
|
assert_equal 1.234, TimeBandits.consumed
|
50
52
|
assert_equal 0, metrics_store.runtime
|
51
53
|
metrics_store.runtime += 4.0
|
@@ -66,8 +68,13 @@ class DatabaseTest < Test::Unit::TestCase
|
|
66
68
|
ActiveRecord::Base.connection.execute "SELECT 1"
|
67
69
|
bandit.consumed
|
68
70
|
assert(bandit.current_runtime > 0)
|
69
|
-
|
70
|
-
|
71
|
+
if ActiveRecord::VERSION::STRING >= Gem::Version.new("7.2.0")
|
72
|
+
# registry ingores schema calls now
|
73
|
+
assert_equal 1, bandit.calls
|
74
|
+
else
|
75
|
+
# 2 calls, because one configures the connection
|
76
|
+
assert_equal 2, bandit.calls
|
77
|
+
end
|
71
78
|
assert_equal 0, bandit.sql_query_cache_hits
|
72
79
|
end
|
73
80
|
|
@@ -75,11 +82,17 @@ class DatabaseTest < Test::Unit::TestCase
|
|
75
82
|
skip if Gem::Version.new(ActiveRecord::VERSION::STRING) < Gem::Version.new("7.1.0")
|
76
83
|
ActiveRecord::Base.logger.level = Logger::ERROR
|
77
84
|
ActiveRecord::LogSubscriber.expects(:sql).never
|
85
|
+
assert_equal 0, bandit.calls
|
78
86
|
ActiveRecord::Base.connection.execute "SELECT 1"
|
79
87
|
bandit.consumed
|
80
88
|
assert(bandit.current_runtime > 0)
|
81
|
-
|
82
|
-
|
89
|
+
if ActiveRecord::VERSION::STRING >= Gem::Version.new("7.2.0")
|
90
|
+
# registry ingores schema calls now
|
91
|
+
assert_equal 1, bandit.calls
|
92
|
+
else
|
93
|
+
# 2 calls, because one configures the connection
|
94
|
+
assert_equal 2, bandit.calls
|
95
|
+
end
|
83
96
|
assert_equal 0, bandit.sql_query_cache_hits
|
84
97
|
end
|
85
98
|
|
data/test/unit/memcached_test.rb
CHANGED
@@ -2,6 +2,7 @@ require_relative '../test_helper'
|
|
2
2
|
|
3
3
|
class MemcachedTest < Test::Unit::TestCase
|
4
4
|
def setup
|
5
|
+
skip "memcached is currently not supported on Ruby #{RUBY_VERSION} as the gem does not compile" unless RUBY_VERSION < "3.3.0"
|
5
6
|
TimeBandits.time_bandits = []
|
6
7
|
TimeBandits.add TimeBandits::TimeConsumers::Memcached
|
7
8
|
TimeBandits.reset
|
data/time_bandits.gemspec
CHANGED
@@ -23,19 +23,7 @@ Gem::Specification.new do |s|
|
|
23
23
|
|
24
24
|
s.add_runtime_dependency("thread_variables")
|
25
25
|
s.add_runtime_dependency("activesupport", [">= 5.2.0"])
|
26
|
-
|
27
|
-
s.
|
28
|
-
s.add_development_dependency("appraisal")
|
29
|
-
s.add_development_dependency("byebug")
|
30
|
-
s.add_development_dependency("dalli")
|
31
|
-
s.add_development_dependency("memcached", "~> 1.8.0")
|
32
|
-
s.add_development_dependency("minitest")
|
33
|
-
s.add_development_dependency("mocha")
|
34
|
-
s.add_development_dependency("mysql2")
|
35
|
-
s.add_development_dependency("rake")
|
36
|
-
s.add_development_dependency("redis")
|
37
|
-
s.add_development_dependency("sequel")
|
38
|
-
s.add_development_dependency("activerecord")
|
39
|
-
s.add_development_dependency("beetle", ">= 3.4.1")
|
26
|
+
s.add_runtime_dependency("base64")
|
27
|
+
s.add_runtime_dependency("mutex_m")
|
40
28
|
end
|
41
29
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: time_bandits
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.15.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Stefan Kaes
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2025-03-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: thread_variables
|
@@ -39,153 +39,13 @@ dependencies:
|
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: 5.2.0
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
42
|
+
name: base64
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: '0'
|
48
|
-
type: :
|
49
|
-
prerelease: false
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
51
|
-
requirements:
|
52
|
-
- - ">="
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: '0'
|
55
|
-
- !ruby/object:Gem::Dependency
|
56
|
-
name: appraisal
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
58
|
-
requirements:
|
59
|
-
- - ">="
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: '0'
|
62
|
-
type: :development
|
63
|
-
prerelease: false
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
65
|
-
requirements:
|
66
|
-
- - ">="
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
version: '0'
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
|
-
name: byebug
|
71
|
-
requirement: !ruby/object:Gem::Requirement
|
72
|
-
requirements:
|
73
|
-
- - ">="
|
74
|
-
- !ruby/object:Gem::Version
|
75
|
-
version: '0'
|
76
|
-
type: :development
|
77
|
-
prerelease: false
|
78
|
-
version_requirements: !ruby/object:Gem::Requirement
|
79
|
-
requirements:
|
80
|
-
- - ">="
|
81
|
-
- !ruby/object:Gem::Version
|
82
|
-
version: '0'
|
83
|
-
- !ruby/object:Gem::Dependency
|
84
|
-
name: dalli
|
85
|
-
requirement: !ruby/object:Gem::Requirement
|
86
|
-
requirements:
|
87
|
-
- - ">="
|
88
|
-
- !ruby/object:Gem::Version
|
89
|
-
version: '0'
|
90
|
-
type: :development
|
91
|
-
prerelease: false
|
92
|
-
version_requirements: !ruby/object:Gem::Requirement
|
93
|
-
requirements:
|
94
|
-
- - ">="
|
95
|
-
- !ruby/object:Gem::Version
|
96
|
-
version: '0'
|
97
|
-
- !ruby/object:Gem::Dependency
|
98
|
-
name: memcached
|
99
|
-
requirement: !ruby/object:Gem::Requirement
|
100
|
-
requirements:
|
101
|
-
- - "~>"
|
102
|
-
- !ruby/object:Gem::Version
|
103
|
-
version: 1.8.0
|
104
|
-
type: :development
|
105
|
-
prerelease: false
|
106
|
-
version_requirements: !ruby/object:Gem::Requirement
|
107
|
-
requirements:
|
108
|
-
- - "~>"
|
109
|
-
- !ruby/object:Gem::Version
|
110
|
-
version: 1.8.0
|
111
|
-
- !ruby/object:Gem::Dependency
|
112
|
-
name: minitest
|
113
|
-
requirement: !ruby/object:Gem::Requirement
|
114
|
-
requirements:
|
115
|
-
- - ">="
|
116
|
-
- !ruby/object:Gem::Version
|
117
|
-
version: '0'
|
118
|
-
type: :development
|
119
|
-
prerelease: false
|
120
|
-
version_requirements: !ruby/object:Gem::Requirement
|
121
|
-
requirements:
|
122
|
-
- - ">="
|
123
|
-
- !ruby/object:Gem::Version
|
124
|
-
version: '0'
|
125
|
-
- !ruby/object:Gem::Dependency
|
126
|
-
name: mocha
|
127
|
-
requirement: !ruby/object:Gem::Requirement
|
128
|
-
requirements:
|
129
|
-
- - ">="
|
130
|
-
- !ruby/object:Gem::Version
|
131
|
-
version: '0'
|
132
|
-
type: :development
|
133
|
-
prerelease: false
|
134
|
-
version_requirements: !ruby/object:Gem::Requirement
|
135
|
-
requirements:
|
136
|
-
- - ">="
|
137
|
-
- !ruby/object:Gem::Version
|
138
|
-
version: '0'
|
139
|
-
- !ruby/object:Gem::Dependency
|
140
|
-
name: mysql2
|
141
|
-
requirement: !ruby/object:Gem::Requirement
|
142
|
-
requirements:
|
143
|
-
- - ">="
|
144
|
-
- !ruby/object:Gem::Version
|
145
|
-
version: '0'
|
146
|
-
type: :development
|
147
|
-
prerelease: false
|
148
|
-
version_requirements: !ruby/object:Gem::Requirement
|
149
|
-
requirements:
|
150
|
-
- - ">="
|
151
|
-
- !ruby/object:Gem::Version
|
152
|
-
version: '0'
|
153
|
-
- !ruby/object:Gem::Dependency
|
154
|
-
name: rake
|
155
|
-
requirement: !ruby/object:Gem::Requirement
|
156
|
-
requirements:
|
157
|
-
- - ">="
|
158
|
-
- !ruby/object:Gem::Version
|
159
|
-
version: '0'
|
160
|
-
type: :development
|
161
|
-
prerelease: false
|
162
|
-
version_requirements: !ruby/object:Gem::Requirement
|
163
|
-
requirements:
|
164
|
-
- - ">="
|
165
|
-
- !ruby/object:Gem::Version
|
166
|
-
version: '0'
|
167
|
-
- !ruby/object:Gem::Dependency
|
168
|
-
name: redis
|
169
|
-
requirement: !ruby/object:Gem::Requirement
|
170
|
-
requirements:
|
171
|
-
- - ">="
|
172
|
-
- !ruby/object:Gem::Version
|
173
|
-
version: '0'
|
174
|
-
type: :development
|
175
|
-
prerelease: false
|
176
|
-
version_requirements: !ruby/object:Gem::Requirement
|
177
|
-
requirements:
|
178
|
-
- - ">="
|
179
|
-
- !ruby/object:Gem::Version
|
180
|
-
version: '0'
|
181
|
-
- !ruby/object:Gem::Dependency
|
182
|
-
name: sequel
|
183
|
-
requirement: !ruby/object:Gem::Requirement
|
184
|
-
requirements:
|
185
|
-
- - ">="
|
186
|
-
- !ruby/object:Gem::Version
|
187
|
-
version: '0'
|
188
|
-
type: :development
|
48
|
+
type: :runtime
|
189
49
|
prerelease: false
|
190
50
|
version_requirements: !ruby/object:Gem::Requirement
|
191
51
|
requirements:
|
@@ -193,33 +53,19 @@ dependencies:
|
|
193
53
|
- !ruby/object:Gem::Version
|
194
54
|
version: '0'
|
195
55
|
- !ruby/object:Gem::Dependency
|
196
|
-
name:
|
56
|
+
name: mutex_m
|
197
57
|
requirement: !ruby/object:Gem::Requirement
|
198
58
|
requirements:
|
199
59
|
- - ">="
|
200
60
|
- !ruby/object:Gem::Version
|
201
61
|
version: '0'
|
202
|
-
type: :
|
62
|
+
type: :runtime
|
203
63
|
prerelease: false
|
204
64
|
version_requirements: !ruby/object:Gem::Requirement
|
205
65
|
requirements:
|
206
66
|
- - ">="
|
207
67
|
- !ruby/object:Gem::Version
|
208
68
|
version: '0'
|
209
|
-
- !ruby/object:Gem::Dependency
|
210
|
-
name: beetle
|
211
|
-
requirement: !ruby/object:Gem::Requirement
|
212
|
-
requirements:
|
213
|
-
- - ">="
|
214
|
-
- !ruby/object:Gem::Version
|
215
|
-
version: 3.4.1
|
216
|
-
type: :development
|
217
|
-
prerelease: false
|
218
|
-
version_requirements: !ruby/object:Gem::Requirement
|
219
|
-
requirements:
|
220
|
-
- - ">="
|
221
|
-
- !ruby/object:Gem::Version
|
222
|
-
version: 3.4.1
|
223
69
|
description: Rails Completed Line on Steroids
|
224
70
|
email:
|
225
71
|
- skaes@railsexpress.de
|
@@ -292,7 +138,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
292
138
|
- !ruby/object:Gem::Version
|
293
139
|
version: '0'
|
294
140
|
requirements: []
|
295
|
-
rubygems_version: 3.
|
141
|
+
rubygems_version: 3.5.20
|
296
142
|
signing_key:
|
297
143
|
specification_version: 4
|
298
144
|
summary: Custom performance logging for Rails
|