measure_method 0.1.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 +7 -0
- data/lib/measure_method.rb +53 -0
- data/lib/measure_method/logger.rb +23 -0
- data/lib/measure_method/metrics.rb +49 -0
- metadata +47 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 0994c6dc85f1dfe4653e442975d1f75b48cb6566
|
4
|
+
data.tar.gz: 0e94fc45032add7147267d87e92dbc1e7da99904
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 003eb4eae20dcb6edebbe7302bfc8f191c5296db3aabee7daf7466cb0a0a0e4adf94eb030541ae63629b829b71385799709a884e5fccfe7ecf66e872368c519e
|
7
|
+
data.tar.gz: 19d60a34fc9a0e26e97c67848f93ce2c9e6a91e379d0b41837fe4979d5db2f3b43011fd7ee281303c7fd4d167562d1b28052361c4bfa68488bf82378111c78bd
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'measure_method/logger'
|
2
|
+
require 'measure_method/metrics'
|
3
|
+
|
4
|
+
module MeasureMethod
|
5
|
+
def self.included(base)
|
6
|
+
base.extend ClassMethods
|
7
|
+
end
|
8
|
+
|
9
|
+
module Measurement
|
10
|
+
def self.class_name(obj)
|
11
|
+
obj.kind_of?(Class) ? obj.name : obj.class.name
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.name(obj, method)
|
15
|
+
Metrics.metricfy("#{class_name(obj)}.#{method}")
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
module ClassMethods
|
20
|
+
def measure_methods(*args)
|
21
|
+
@measured_methods ||= []
|
22
|
+
@methods_to_measure ||= []
|
23
|
+
@methods_to_measure += args.map(&:to_sym)
|
24
|
+
end
|
25
|
+
|
26
|
+
def method_added(name)
|
27
|
+
define_measure_method(name, self)
|
28
|
+
end
|
29
|
+
|
30
|
+
def singleton_method_added(name)
|
31
|
+
define_measure_method(name, self.singleton_class)
|
32
|
+
end
|
33
|
+
|
34
|
+
def define_measure_method(name, obj)
|
35
|
+
return if @adding_measurers
|
36
|
+
return if @measured_methods.include?(name)
|
37
|
+
@adding_measurers = true
|
38
|
+
if @methods_to_measure.include? name.to_sym
|
39
|
+
unmeasured_name = "unmeasured_#{name}"
|
40
|
+
obj.send(:alias_method, unmeasured_name, name)
|
41
|
+
|
42
|
+
obj.send(:define_method, name) do |*args, &block|
|
43
|
+
Metrics.measure_block(
|
44
|
+
name: Measurement.name(self, name)
|
45
|
+
) {send unmeasured_name, *args, &block}
|
46
|
+
end
|
47
|
+
|
48
|
+
@measured_methods << name
|
49
|
+
end
|
50
|
+
@adding_measurers = nil
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module MeasureMethod
|
2
|
+
module Logger
|
3
|
+
extend self
|
4
|
+
|
5
|
+
def log(data)
|
6
|
+
puts(stringify(data))
|
7
|
+
end
|
8
|
+
|
9
|
+
def stringify(data)
|
10
|
+
data.map do |k,v|
|
11
|
+
if v.to_s =~ /[^0-9A-Z._-]/i
|
12
|
+
[k, '=', '"', v, '"'].join
|
13
|
+
else
|
14
|
+
"#{k}=#{v}"
|
15
|
+
end
|
16
|
+
end.join(' ')
|
17
|
+
end
|
18
|
+
|
19
|
+
def puts(str)
|
20
|
+
$stdout.puts(str)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
module MeasureMethod
|
2
|
+
module Metrics
|
3
|
+
def self.out=(o)
|
4
|
+
@out = o
|
5
|
+
end
|
6
|
+
|
7
|
+
def self.out
|
8
|
+
@out || Logger
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.sample(name:, val:, data: {})
|
12
|
+
met_log("sample", name, val, data)
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.count(name:, val: 1, data: {})
|
16
|
+
met_log("count", name, val, data)
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.measure(name:, val: nil, data: {}, &block)
|
20
|
+
return measure_block(name: name, data: data, &block) if block
|
21
|
+
met_log("measure", name, val, data)
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.metricfy(name)
|
25
|
+
name.
|
26
|
+
gsub('::', '.').
|
27
|
+
gsub(' ', '.').
|
28
|
+
gsub(/(\/)/, '.').
|
29
|
+
gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
|
30
|
+
gsub(/([a-z\d])([A-Z])/,'\1_\2').
|
31
|
+
gsub(/_/,"-").
|
32
|
+
downcase
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.met_log(type, name, val, data)
|
36
|
+
data["#{type}##{name}"] = val
|
37
|
+
out.log(data)
|
38
|
+
end
|
39
|
+
|
40
|
+
def self.measure_block(name:, data: {}, &block)
|
41
|
+
out.log(data.merge({starting: name}))
|
42
|
+
start = Time.now
|
43
|
+
result = yield
|
44
|
+
elapsed = (Time.now.to_f - start.to_f) * 1000
|
45
|
+
measure(name: name, val: elapsed.round.to_s+"ms", data: data)
|
46
|
+
result
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
metadata
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: measure_method
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Eric Rykwalder
|
8
|
+
- Ryan R. Smith
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2014-10-17 00:00:00.000000000 Z
|
13
|
+
dependencies: []
|
14
|
+
description: Measure ruby methods and report their metrics
|
15
|
+
email: eric@chain.com
|
16
|
+
executables: []
|
17
|
+
extensions: []
|
18
|
+
extra_rdoc_files: []
|
19
|
+
files:
|
20
|
+
- lib/measure_method.rb
|
21
|
+
- lib/measure_method/logger.rb
|
22
|
+
- lib/measure_method/metrics.rb
|
23
|
+
homepage: http://github.com/chain-engineering/measure_method
|
24
|
+
licenses:
|
25
|
+
- MIT
|
26
|
+
metadata: {}
|
27
|
+
post_install_message:
|
28
|
+
rdoc_options: []
|
29
|
+
require_paths:
|
30
|
+
- lib
|
31
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
32
|
+
requirements:
|
33
|
+
- - ">="
|
34
|
+
- !ruby/object:Gem::Version
|
35
|
+
version: '0'
|
36
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
requirements: []
|
42
|
+
rubyforge_project:
|
43
|
+
rubygems_version: 2.2.2
|
44
|
+
signing_key:
|
45
|
+
specification_version: 4
|
46
|
+
summary: Measure ruby methods and report their metrics
|
47
|
+
test_files: []
|