measure_method 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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: []