leafy-health 0.3.0 → 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (108) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +34 -4
  3. data/.travis.yml +19 -0
  4. data/CHANGELOG.md +7 -0
  5. data/Gemfile +1 -5
  6. data/README.md +10 -116
  7. data/examples/datadog/.gitignore +2 -0
  8. data/examples/datadog/Gemfile +12 -0
  9. data/examples/datadog/Mavenfile +22 -0
  10. data/examples/datadog/README.md +16 -0
  11. data/examples/datadog/lib/java_gauge.rb +20 -0
  12. data/examples/datadog/lib/metrics.rb +18 -0
  13. data/examples/datadog/lib/ruby_gauge.rb +19 -0
  14. data/examples/hellowarld/.gitignore +3 -0
  15. data/examples/hellowarld/Gemfile +15 -0
  16. data/examples/hellowarld/Mavenfile +162 -0
  17. data/examples/hellowarld/README.md +44 -0
  18. data/examples/hellowarld/Rakefile +13 -0
  19. data/examples/hellowarld/WEB-INF/web.xml +31 -0
  20. data/examples/hellowarld/app/hellowarld.rb +55 -0
  21. data/examples/hellowarld/app/views/person.erb +52 -0
  22. data/examples/hellowarld/config.ru +12 -0
  23. data/leafy-complete.gemspec +22 -0
  24. data/leafy-health/.gitignore +4 -0
  25. data/leafy-health/Gemfile +7 -0
  26. data/leafy-health/LICENSE +22 -0
  27. data/leafy-health/README.md +123 -0
  28. data/{Rakefile → leafy-health/Rakefile} +0 -0
  29. data/{leafy-health.gemspec → leafy-health/leafy-health.gemspec} +0 -0
  30. data/{lib → leafy-health/lib}/leafy-health.rb +0 -0
  31. data/{lib → leafy-health/lib}/leafy-health_jars.rb +0 -0
  32. data/{lib → leafy-health/lib}/leafy/health.rb +0 -0
  33. data/{lib → leafy-health/lib}/leafy/health/health_check.rb +0 -0
  34. data/{lib → leafy-health/lib}/leafy/health/registry.rb +0 -0
  35. data/{lib → leafy-health/lib}/leafy/health/version.rb +1 -1
  36. data/{spec → leafy-health/spec}/registry_spec.rb +0 -0
  37. data/{spec → leafy-health/spec}/setup.rb +0 -0
  38. data/leafy-logger/.gitignore +5 -0
  39. data/leafy-logger/Gemfile +9 -0
  40. data/leafy-logger/LICENSE +22 -0
  41. data/leafy-logger/README.md +174 -0
  42. data/leafy-logger/Rakefile +14 -0
  43. data/leafy-logger/leafy-logger.gemspec +32 -0
  44. data/leafy-logger/lib/leafy-logger.rb +1 -0
  45. data/leafy-logger/lib/leafy-logger_jars.rb +33 -0
  46. data/leafy-logger/lib/leafy/logger.rb +1 -0
  47. data/leafy-logger/lib/leafy/logger/appender_factories.rb +89 -0
  48. data/leafy-logger/lib/leafy/logger/factory.rb +141 -0
  49. data/leafy-logger/lib/leafy/logger/version.rb +6 -0
  50. data/leafy-logger/spec/appender_factories_spec.rb +147 -0
  51. data/leafy-logger/spec/factory_spec.rb +176 -0
  52. data/leafy-logger/spec/logging.yml +16 -0
  53. data/leafy-logger/spec/setup.rb +2 -0
  54. data/leafy-metrics/.gitignore +5 -0
  55. data/leafy-metrics/Gemfile +7 -0
  56. data/leafy-metrics/LICENSE +22 -0
  57. data/leafy-metrics/README.md +221 -0
  58. data/leafy-metrics/Rakefile +14 -0
  59. data/leafy-metrics/leafy-metrics.gemspec +29 -0
  60. data/leafy-metrics/lib/leafy-metrics.rb +2 -0
  61. data/leafy-metrics/lib/leafy-metrics_jars.rb +5 -0
  62. data/leafy-metrics/lib/leafy/metrics.rb +2 -0
  63. data/leafy-metrics/lib/leafy/metrics/console_reporter.rb +32 -0
  64. data/leafy-metrics/lib/leafy/metrics/csv_reporter.rb +26 -0
  65. data/leafy-metrics/lib/leafy/metrics/graphite/graphite.rb +28 -0
  66. data/leafy-metrics/lib/leafy/metrics/graphite/graphite_reporter.rb +43 -0
  67. data/leafy-metrics/lib/leafy/metrics/registry.rb +108 -0
  68. data/leafy-metrics/lib/leafy/metrics/reporter.rb +51 -0
  69. data/leafy-metrics/lib/leafy/metrics/version.rb +6 -0
  70. data/leafy-metrics/spec/console_reporter_spec.rb +72 -0
  71. data/leafy-metrics/spec/csv_reporter_spec.rb +75 -0
  72. data/leafy-metrics/spec/graphite_reporter_spec.rb +72 -0
  73. data/leafy-metrics/spec/graphite_spec.rb +23 -0
  74. data/leafy-metrics/spec/registry_spec.rb +106 -0
  75. data/leafy-metrics/spec/setup.rb +10 -0
  76. data/leafy-rack/.gitignore +4 -0
  77. data/leafy-rack/Gemfile +10 -0
  78. data/leafy-rack/LICENSE +22 -0
  79. data/leafy-rack/README.md +155 -0
  80. data/leafy-rack/Rakefile +14 -0
  81. data/leafy-rack/leafy-rack.gemspec +29 -0
  82. data/leafy-rack/lib/leafy-rack.rb +1 -0
  83. data/leafy-rack/lib/leafy-rack_jars.rb +10 -0
  84. data/leafy-rack/lib/leafy/instrumented/basic_instrumented.rb +38 -0
  85. data/leafy-rack/lib/leafy/instrumented/instrumented.rb +27 -0
  86. data/leafy-rack/lib/leafy/json/health_writer.rb +15 -0
  87. data/leafy-rack/lib/leafy/json/json_writer.rb +33 -0
  88. data/leafy-rack/lib/leafy/json/metrics_writer.rb +22 -0
  89. data/leafy-rack/lib/leafy/rack.rb +1 -0
  90. data/leafy-rack/lib/leafy/rack/admin.rb +73 -0
  91. data/leafy-rack/lib/leafy/rack/health.rb +43 -0
  92. data/leafy-rack/lib/leafy/rack/instrumented.rb +20 -0
  93. data/leafy-rack/lib/leafy/rack/metrics.rb +35 -0
  94. data/leafy-rack/lib/leafy/rack/ping.rb +29 -0
  95. data/leafy-rack/lib/leafy/rack/thread_dump.rb +56 -0
  96. data/leafy-rack/lib/leafy/rack/version.rb +6 -0
  97. data/leafy-rack/spec/admin_rack_spec.rb +141 -0
  98. data/leafy-rack/spec/basic_instrumented_spec.rb +31 -0
  99. data/leafy-rack/spec/health_rack_spec.rb +136 -0
  100. data/leafy-rack/spec/health_writer_spec.rb +47 -0
  101. data/leafy-rack/spec/instrumented_rack_spec.rb +37 -0
  102. data/leafy-rack/spec/instrumented_spec.rb +36 -0
  103. data/leafy-rack/spec/metrics_rack_spec.rb +110 -0
  104. data/leafy-rack/spec/metrics_writer_spec.rb +55 -0
  105. data/leafy-rack/spec/ping_rack_spec.rb +63 -0
  106. data/leafy-rack/spec/setup.rb +3 -0
  107. data/leafy-rack/spec/thread_dump_spec.rb +59 -0
  108. metadata +106 -12
@@ -0,0 +1,14 @@
1
+ #-*- mode: ruby -*-
2
+
3
+ require "rspec/core/rake_task"
4
+ RSpec::Core::RakeTask.new
5
+
6
+ require "yard"
7
+ YARD::Rake::YardocTask.new do |t|
8
+ t.files = ['lib/**/*.rb']
9
+ t.options += ["--title", "Leafy Metrics API"]
10
+ end
11
+
12
+ task :default => [ :spec ]
13
+
14
+ # vim: syntax=Ruby
@@ -0,0 +1,29 @@
1
+ #-*- mode: ruby -*-
2
+
3
+ require File.expand_path( '../lib/leafy/metrics/version', __FILE__ )
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = 'leafy-metrics'
7
+ s.version = Leafy::Metrics::VERSION
8
+ s.author = 'christian meier'
9
+ s.email = [ 'christian.meier@lookout.com' ]
10
+
11
+ s.license = 'MIT'
12
+ s.summary = %q(provide an API to register metrics)
13
+ s.homepage = 'https://github.com/lookout/leafy'
14
+ s.description = %q(provides an API to register metrics like meters, timers, gauge, counter using dropwizard-metrics. it also allows to setup reporters: console-reporter, csv-reporter and graphite-reporter)
15
+
16
+ s.files = `git ls-files`.split($/)
17
+
18
+ METRICS_VERSION = '3.1.0'
19
+ s.requirements << "jar io.dropwizard.metrics:metrics-core, #{METRICS_VERSION}"
20
+ s.requirements << "jar io.dropwizard.metrics:metrics-graphite, #{METRICS_VERSION}"
21
+ s.requirements << "jar org.slf4j, slf4j-simple, 1.7.7, :scope => :test"
22
+
23
+ s.add_runtime_dependency 'jar-dependencies', '~> 0.1.8'
24
+ s.add_development_dependency 'rspec', '~> 3.1.0'
25
+ s.add_development_dependency 'yard', '~> 0.8.7'
26
+ s.add_development_dependency 'rake', '~> 10.2'
27
+ end
28
+
29
+ # vim: syntax=Ruby
@@ -0,0 +1,2 @@
1
+ require 'leafy-metrics_jars'
2
+ require 'leafy/metrics/registry'
@@ -0,0 +1,5 @@
1
+ require 'jar_dependencies'
2
+
3
+ require_jar( 'io.dropwizard.metrics', 'metrics-graphite', '3.1.0' )
4
+ require_jar( 'org.slf4j', 'slf4j-api', '1.7.7' )
5
+ require_jar( 'io.dropwizard.metrics', 'metrics-core', '3.1.0' )
@@ -0,0 +1,2 @@
1
+ require 'leafy-metrics_jars'
2
+ require 'leafy/metrics/registry'
@@ -0,0 +1,32 @@
1
+ require 'leafy/metrics/reporter'
2
+
3
+ java_import com.codahale.metrics.ConsoleReporter
4
+
5
+ module Leafy
6
+ module Metrics
7
+ class ConsoleReporter < Reporter
8
+
9
+ class Builder < Reporter::Builder
10
+ def initialize( metrics )
11
+ super( ::ConsoleReporter, metrics )
12
+ end
13
+
14
+ def output_to( io )
15
+ # IO objects in jruby do have a to_outputstream method
16
+ @io = java.io.PrintStream.new( io.to_outputstream )
17
+ @builder.output_to( @io )
18
+ self
19
+ end
20
+
21
+ def build
22
+ Reporter.new( @builder.build )
23
+ end
24
+ end
25
+
26
+ def self.for_registry( metrics )
27
+ Builder.new( metrics )
28
+ end
29
+ end
30
+ end
31
+ end
32
+
@@ -0,0 +1,26 @@
1
+ require 'leafy/metrics/reporter'
2
+
3
+ java_import com.codahale.metrics.CsvReporter
4
+
5
+ module Leafy
6
+ module Metrics
7
+ class CSVReporter < Reporter
8
+
9
+ class Builder < Reporter::Builder
10
+ def initialize( metrics )
11
+ super( ::CsvReporter, metrics )
12
+ end
13
+
14
+ def build( directory )
15
+ directory = java.io.File.new( directory )
16
+ Reporter.new( @builder.build( directory ) )
17
+ end
18
+ end
19
+
20
+ def self.for_registry( metrics )
21
+ Builder.new( metrics )
22
+ end
23
+ end
24
+ end
25
+ end
26
+
@@ -0,0 +1,28 @@
1
+ module Leafy
2
+ module Metrics
3
+ class Graphite
4
+
5
+ attr_reader :sender
6
+
7
+ def initialize( sender )
8
+ unless sender.java_kind_of? Java::ComCodahaleMetricsGraphite::GraphiteSender
9
+ raise "not instance of 'Java::ComCodahaleMetricsGraphite::Graphite'"
10
+ end
11
+ @sender = sender
12
+ end
13
+
14
+ def self.new_tcp( hostname, port )
15
+ new com.codahale.metrics.graphite.Graphite.new( hostname, port )
16
+ end
17
+
18
+ def self.new_udp( hostname, port )
19
+ new com.codahale.metrics.graphite.GraphiteUDP.new( hostname, port )
20
+ end
21
+
22
+ def self.new_pickled( hostname, port, batchsize )
23
+ new com.codahale.metrics.graphite.PickledGraphite.new( hostname, port, batchsize )
24
+ end
25
+ end
26
+ end
27
+ end
28
+
@@ -0,0 +1,43 @@
1
+ require 'leafy/metrics/reporter'
2
+ require 'leafy/metrics/graphite/graphite'
3
+
4
+ java_import com.codahale.metrics.graphite.GraphiteReporter
5
+
6
+ module Leafy
7
+ module Metrics
8
+ class GraphiteReporter < Reporter
9
+
10
+ class Builder < Reporter::Builder
11
+ def initialize( metrics )
12
+ super( ::GraphiteReporter, metrics )
13
+ end
14
+
15
+ def prefixed_with( prefix )
16
+ @builder.prefixed_with( prefix )
17
+ self
18
+ end
19
+
20
+ def build( graphite )
21
+ Reporter.new( @builder.build( graphite.sender ) )
22
+ end
23
+
24
+ def build_tcp( host, port )
25
+ build( Leafy::Metrics::Graphite.new_tcp( host, port ) )
26
+ end
27
+
28
+ def build_udp( host, port )
29
+ build( Leafy::Metrics::Graphite.new_udp( host, port ) )
30
+ end
31
+
32
+ def build_pickled( host, port )
33
+ build( Leafy::Metrics::Graphite.new_pickled( host, port ) )
34
+ end
35
+ end
36
+
37
+ def self.for_registry( metrics )
38
+ Builder.new( metrics )
39
+ end
40
+ end
41
+ end
42
+ end
43
+
@@ -0,0 +1,108 @@
1
+ require 'leafy/metrics'
2
+ module Leafy
3
+ module Metrics
4
+
5
+ class Gauge
6
+ include com.codahale.metrics.Gauge
7
+ end
8
+
9
+ class Registry
10
+
11
+ class Timer
12
+
13
+ attr_reader :timer
14
+
15
+ def initialize( timer )
16
+ @timer = timer
17
+ end
18
+
19
+ def time( &block )
20
+ context = @timer.time
21
+
22
+ yield
23
+
24
+ ensure
25
+ context.stop
26
+ end
27
+ end
28
+
29
+ class GaugeWrapper < Leafy::Metrics::Gauge
30
+
31
+ def initialize( block )
32
+ @block = block
33
+ end
34
+
35
+ def value
36
+ @block.call
37
+ end
38
+ end
39
+
40
+ # state ofthe registry
41
+ attr_reader :metrics
42
+
43
+ def initialize
44
+ @metrics = com.codahale.metrics.MetricRegistry.new
45
+ end
46
+
47
+ # register a gauge under a given name
48
+ #
49
+ # @param [String] name
50
+ # @param [String] instead of block any gauge object which responds to 'call'
51
+ # @yieldreturn [Object] can be any object like Fixnum, String, Float
52
+ # @return [MetricsRegistry::Gauge] gauge object which has a 'value' method to retrieve the current value
53
+ def register_gauge( name, gauge = nil, &block )
54
+ if gauge and not block_given? and gauge.respond_to? :call
55
+ @metrics.register( name, GaugeWrapper.new( gauge ) )
56
+ elsif gauge and not block_given? and gauge.kind_of? com.codahale.metrics.Gauge
57
+ @metrics.register( name, gauge )
58
+ elsif gauge.nil? and block_given?
59
+ @metrics.register( name, GaugeWrapper.new( block ) )
60
+ else
61
+ raise 'needs either a block and object with call method'
62
+ end
63
+ end
64
+
65
+ # register a meter under a given name
66
+ #
67
+ # @param [String] name
68
+ # @return [Java::ComCodahaleMetrics::Meter] meter object which has a 'mark' method to mark the meter
69
+ def register_meter( name )
70
+ @metrics.meter( name )
71
+ end
72
+
73
+ # register a counter under a given name
74
+ #
75
+ # @param [String] name
76
+ # @return [Java::ComCodahaleMetrics::Counter] counter object which has an 'inc' and 'dec' method
77
+ def register_counter( name )
78
+ @metrics.counter( name )
79
+ end
80
+
81
+ # register a timer under a given name
82
+ #
83
+ # @param [String] name
84
+ # @return [Java::ComCodahaleMetrics::Timer] timer object which has an 'context' method which starts the timer. the context has a 'stop' method to stop it.
85
+ def register_timer( name )
86
+ Timer.new( @metrics.timer( name ) )
87
+ end
88
+
89
+ # register a histogram under a given name
90
+ #
91
+ # @param [String] name
92
+ # @return [Java::ComCodahaleMetrics::Counter] histogram object which has an 'update' method
93
+ def register_histogram( name )
94
+ @metrics.histogram( name )
95
+ end
96
+
97
+ def remove( name )
98
+ @metrics.remove( name )
99
+ end
100
+
101
+ def reporter_builder( clazz, &block )
102
+ r = clazz.for_registry( @metrics )
103
+ r.instance_eval( &block ) if block
104
+ r
105
+ end
106
+ end
107
+ end
108
+ end
@@ -0,0 +1,51 @@
1
+ require 'leafy/metrics/registry'
2
+
3
+ java_import java.util.concurrent.TimeUnit;
4
+
5
+ module Leafy
6
+ module Metrics
7
+ class Reporter
8
+ # copy the TimeUnit constants
9
+ TimeUnit.constants.each do |c|
10
+ const_set( c, TimeUnit.const_get( c ) )
11
+ end
12
+
13
+ def initialize( reporter )
14
+ @reporter = reporter
15
+ end
16
+
17
+ def start( period, time_unit )
18
+ @reporter.start( period, time_unit )
19
+ end
20
+
21
+ def stop
22
+ @reporter.stop
23
+ end
24
+
25
+ def report
26
+ @reporter.report
27
+ end
28
+
29
+ class Builder
30
+ def initialize( reporter_class, metrics )
31
+ # stay backward compatible
32
+ # FIXME remove for first proper release
33
+ metrics = metrics.metrics if metrics.is_a?( Leafy::Metrics::Registry )
34
+ @builder = reporter_class.for_registry( metrics )
35
+ self
36
+ end
37
+
38
+ def convert_rates_to( time_unit )
39
+ @builder.convert_rates_to( time_unit )
40
+ self
41
+ end
42
+
43
+ def convert_durations_to( time_unit )
44
+ @builder.convert_durations_to( time_unit )
45
+ self
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
51
+
@@ -0,0 +1,6 @@
1
+ module Leafy
2
+ module Metrics
3
+ VERSION = '0.3.1'.freeze
4
+ end
5
+ end
6
+
@@ -0,0 +1,72 @@
1
+ require_relative 'setup'
2
+ require 'leafy/metrics/console_reporter'
3
+
4
+ describe Leafy::Metrics::ConsoleReporter do
5
+
6
+ subject { Leafy::Metrics::ConsoleReporter }
7
+
8
+ let( :metrics ) { Leafy::Metrics::Registry.new }
9
+ let( :requests ) { metrics.register_meter( "requests" ) }
10
+
11
+ it 'run reporter with defaults' do
12
+ old_out = java.lang.System.out
13
+ bytes = StringIO.new
14
+ java.lang.System.out = java.io.PrintStream.new( bytes.to_outputstream )
15
+ begin
16
+ reporter = metrics.reporter_builder( subject ).build
17
+ requests.mark
18
+ reporter.start( 10, Leafy::Metrics::Reporter::MILLISECONDS )
19
+ sleep 0.02
20
+ reporter.stop
21
+ result = bytes.string.gsub( /\n/m, '')
22
+ expect( result ).to match /count = 1/
23
+ expect( result ).to match /second/
24
+ ensure
25
+ java.lang.System.out = old_out
26
+ reporter.stop if reporter
27
+ end
28
+ end
29
+
30
+ it 'run reporter via builder config' do
31
+ bytes = StringIO.new
32
+ begin
33
+ reporter = metrics.reporter_builder( subject )
34
+ .convert_rates_to( Leafy::Metrics::Reporter::MILLISECONDS )
35
+ .convert_durations_to( Leafy::Metrics::Reporter::MILLISECONDS )
36
+ .output_to( bytes )
37
+ .build
38
+
39
+ requests.mark
40
+ reporter.start( 10, Leafy::Metrics::Reporter::MILLISECONDS )
41
+ sleep 0.02
42
+ reporter.stop
43
+ result = bytes.string.gsub( /\n/m, '')
44
+ expect( result ).to match /count = 1/
45
+ expect( result ).to match /millisecond/
46
+ ensure
47
+ reporter.stop if reporter
48
+ end
49
+ end
50
+
51
+ it 'run reporter via block config' do
52
+ bytes = StringIO.new
53
+ begin
54
+ reporter = metrics.reporter_builder( subject ) do
55
+ convert_rates_to( Leafy::Metrics::Reporter::MILLISECONDS )
56
+ convert_durations_to( Leafy::Metrics::Reporter::MILLISECONDS )
57
+ output_to( bytes )
58
+ end.build
59
+
60
+ requests.mark
61
+ reporter.start( 10, Leafy::Metrics::Reporter::MILLISECONDS )
62
+ sleep 0.02
63
+ reporter.stop
64
+ result = bytes.string.gsub( /\n/m, '')
65
+ expect( result ).to match /count = 1/
66
+ expect( result ).to match /millisecond/
67
+ ensure
68
+ reporter.stop if reporter
69
+ end
70
+ end
71
+
72
+ end
@@ -0,0 +1,75 @@
1
+ require_relative 'setup'
2
+ require 'leafy/metrics/csv_reporter'
3
+ require 'fileutils'
4
+
5
+ describe Leafy::Metrics::CSVReporter do
6
+
7
+ subject { Leafy::Metrics::CSVReporter }
8
+
9
+ let( :metrics ) { Leafy::Metrics::Registry.new }
10
+ let( :requests ) { metrics.register_meter( "requests" ) }
11
+ let( :csvfile ) { File.expand_path( File.dirname( __FILE__ ) ) + "/tmp/requests.csv" }
12
+ let( :tmpdir ) do
13
+ dir = File.expand_path( File.dirname( csvfile ) )
14
+ FileUtils.mkdir_p( dir )
15
+ FileUtils.rm_f( csvfile )
16
+ dir
17
+ end
18
+
19
+ it 'run reporter with defaults' do
20
+ begin
21
+ reporter = metrics.reporter_builder( subject ).build( tmpdir )
22
+ requests.mark
23
+ reporter.start( 10, Leafy::Metrics::Reporter::MILLISECONDS )
24
+ sleep 0.02
25
+ reporter.stop
26
+ result = File.read( csvfile )
27
+ expect( result ).to match /t,count,mean_rate,m1_rate,m5_rate,m15_rate,rate_unit/
28
+ expect( result ).to match /second/
29
+ ensure
30
+ FileUtils.rm_rf( tmpdir )
31
+ reporter.stop if reporter
32
+ end
33
+ end
34
+
35
+ it 'run reporter via builder config' do
36
+ begin
37
+ reporter = metrics.reporter_builder( subject )
38
+ .convert_rates_to( Leafy::Metrics::Reporter::MILLISECONDS )
39
+ .convert_durations_to( Leafy::Metrics::Reporter::MILLISECONDS )
40
+ .build( tmpdir )
41
+
42
+ requests.mark
43
+ reporter.start( 10, Leafy::Metrics::Reporter::MILLISECONDS )
44
+ sleep 0.02
45
+ reporter.stop
46
+ result = File.read( csvfile )
47
+ expect( result ).to match /t,count,mean_rate,m1_rate,m5_rate,m15_rate,rate_unit/
48
+ expect( result ).to match /second/
49
+ ensure
50
+ FileUtils.rm_rf( tmpdir )
51
+ reporter.stop if reporter
52
+ end
53
+ end
54
+
55
+ it 'run reporter via block config' do
56
+ begin
57
+ reporter = metrics.reporter_builder( subject ) do
58
+ convert_rates_to( Leafy::Metrics::Reporter::MILLISECONDS )
59
+ convert_durations_to( Leafy::Metrics::Reporter::MILLISECONDS )
60
+ end.build( tmpdir )
61
+
62
+ requests.mark
63
+ reporter.start( 10, Leafy::Metrics::Reporter::MILLISECONDS )
64
+ sleep 0.02
65
+ reporter.stop
66
+ result = File.read( csvfile )
67
+ expect( result ).to match /t,count,mean_rate,m1_rate,m5_rate,m15_rate,rate_unit/
68
+ expect( result ).to match /second/
69
+ ensure
70
+ FileUtils.rm_rf( tmpdir )
71
+ reporter.stop if reporter
72
+ end
73
+ end
74
+
75
+ end