method_meter 0.4.0 → 0.4.3
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/lib/method_meter.rb +41 -37
- data/lib/method_meter/version.rb +1 -1
- data/method_meter.gemspec +1 -0
- metadata +16 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3a5ff992ee06f786d08c62136e9c793d3c0810ce19b70feefadf298004d83d58
|
4
|
+
data.tar.gz: 36882deddbc956bcfc5baa29326f03a713c27de09cd00f833d88da6acf722ae4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bb17a7e2982862a37acdadaf2adc7f981b06be55b57188a6e1ecb31cdcb1301ba9ad70f01fb21e06ca764931c4a3305bf7a01e88ba5897c9750b7dad2ffe2ccf
|
7
|
+
data.tar.gz: 41c3ed52140bbe3260f12152385261ac6360f8de87479674277277c146e81ea3589162b1cc35cddf1c442fd946fa05496ec670a09282f217f82076b0ab430686
|
data/lib/method_meter.rb
CHANGED
@@ -1,11 +1,10 @@
|
|
1
1
|
require 'method_meter/version'
|
2
2
|
|
3
3
|
require 'active_support'
|
4
|
-
require 'active_support/core_ext/string'
|
5
4
|
require 'defined_methods'
|
6
5
|
|
7
6
|
module MethodMeter
|
8
|
-
mattr_accessor :
|
7
|
+
mattr_accessor :metered_methods, :subscribers, :data, :exceptions
|
9
8
|
|
10
9
|
class << self
|
11
10
|
def observe(object, excepted_methods=[])
|
@@ -14,7 +13,7 @@ module MethodMeter
|
|
14
13
|
DefinedMethods.in(object).each do |group|
|
15
14
|
group[:object].module_eval do
|
16
15
|
group[:methods].each do |method|
|
17
|
-
MethodMeter.
|
16
|
+
MethodMeter.define_metering_method(group[:object], method, group[:private], group[:protected], group[:singleton])
|
18
17
|
end
|
19
18
|
end
|
20
19
|
end
|
@@ -23,10 +22,10 @@ module MethodMeter
|
|
23
22
|
def measure!(key)
|
24
23
|
data[key] = {}
|
25
24
|
|
26
|
-
|
27
|
-
subscribers << ActiveSupport::Notifications.subscribe(
|
28
|
-
data[key][
|
29
|
-
data[key][
|
25
|
+
metered_methods.each do |metered_method|
|
26
|
+
subscribers << ActiveSupport::Notifications.subscribe(metered_method) do |_, started_at, finished_at, _, _|
|
27
|
+
data[key][metered_method] = [] unless data[key].has_key?(metered_method)
|
28
|
+
data[key][metered_method] << (finished_at - started_at)
|
30
29
|
end
|
31
30
|
end
|
32
31
|
|
@@ -38,26 +37,28 @@ module MethodMeter
|
|
38
37
|
end
|
39
38
|
|
40
39
|
def measurement
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
{ key => _measurement }
|
40
|
+
measurement = {}
|
41
|
+
|
42
|
+
data.each do |key, measurement_records|
|
43
|
+
_measurement = measurement_records.collect do |method_name, records|
|
44
|
+
total_calls = records.size
|
45
|
+
total_runtime = records.reduce(:+) * 1000
|
46
|
+
average = total_runtime / total_calls
|
47
|
+
|
48
|
+
{
|
49
|
+
method: method_name,
|
50
|
+
min: records.min * 1000,
|
51
|
+
max: records.max * 1000,
|
52
|
+
average: average,
|
53
|
+
total_runtime: total_runtime,
|
54
|
+
total_calls: total_calls,
|
55
|
+
}
|
59
56
|
end
|
57
|
+
|
58
|
+
measurement[key] = _measurement
|
60
59
|
end
|
60
|
+
|
61
|
+
measurement
|
61
62
|
end
|
62
63
|
|
63
64
|
def profiling_method_names(method)
|
@@ -66,21 +67,24 @@ module MethodMeter
|
|
66
67
|
[method_with_profiling, method_without_profiling]
|
67
68
|
end
|
68
69
|
|
69
|
-
def
|
70
|
-
|
70
|
+
def meter_method?(method_name)
|
71
|
+
object_name, method = method_name.split('#')
|
72
|
+
object_name, method = method_name.split('.') if method.nil?
|
73
|
+
!exceptions.include?(method.to_sym) && !metered_methods.include?(method_name) && (method_name =~ /_profiling/).nil?
|
71
74
|
end
|
72
75
|
|
73
|
-
def
|
76
|
+
def define_metering_method(object, method, is_private, is_protected, is_singleton)
|
74
77
|
object.module_eval do
|
75
78
|
method_with_profiling, method_without_profiling = MethodMeter.profiling_method_names(method)
|
76
|
-
|
79
|
+
object_name = is_singleton ? object.to_s.split(':').last.gsub('>', '') : object.to_s
|
80
|
+
method_name = DefinedMethods.fqmn(object_name, method, is_singleton)
|
77
81
|
|
78
|
-
return unless MethodMeter.
|
82
|
+
return unless MethodMeter.meter_method?(method_name)
|
79
83
|
|
80
|
-
MethodMeter.
|
84
|
+
MethodMeter.metered_methods << method_name
|
81
85
|
|
82
86
|
define_method(method_with_profiling) do |*args, &block|
|
83
|
-
ActiveSupport::Notifications.instrument(
|
87
|
+
ActiveSupport::Notifications.instrument(method_name, args) do
|
84
88
|
send(method_without_profiling, *args, &block)
|
85
89
|
end
|
86
90
|
end
|
@@ -96,11 +100,11 @@ module MethodMeter
|
|
96
100
|
private
|
97
101
|
|
98
102
|
def init(excepted_methods)
|
99
|
-
self.
|
100
|
-
self.exceptions
|
101
|
-
self.exceptions
|
102
|
-
self.subscribers
|
103
|
-
self.data
|
103
|
+
self.metered_methods = [] if metered_methods.nil?
|
104
|
+
self.exceptions = [] if exceptions.nil?
|
105
|
+
self.exceptions |= excepted_methods
|
106
|
+
self.subscribers = []
|
107
|
+
self.data = {} if data.blank?
|
104
108
|
end
|
105
109
|
end
|
106
110
|
end
|
data/lib/method_meter/version.rb
CHANGED
data/method_meter.gemspec
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: method_meter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Wilfrido T. Nuqui Jr.
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-02-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -94,6 +94,20 @@ dependencies:
|
|
94
94
|
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '3.0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: pry
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
97
111
|
description: MethodMeter is a library module that instruments methods defined in a
|
98
112
|
given object.
|
99
113
|
email:
|