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