Leafy-Metrics¶ ↑
installation¶ ↑
via rubygems
gem install leafy-metrics
or add to your Gemfile
gem 'leafy-metrics'
installing the gem also takes care of the jar dependencies with jruby-1.7.16+
usage¶ ↑
an instance of the registry Leafy::Metrics::Registry
can register various metrics like gauge, timer, meter, counter and histogram and remove them again.
registry = Leafy::Metrics::Registry.new
gauge¶ ↑
it can be other a given block or any object with a call method returning the gauge - a number
registry.register_gauge( 'app.uptime') do App.uptime end
or with an object
class UptimeGauge def call App.uptime enf end registry.register_gauge( 'app.uptime', UptimeGauge.new )
timer¶ ↑
a timer can measure the time an block needs to execute:
timer = registry.register_timer( 'app.timer' ) timer.time do App.update_data end
counter¶ ↑
a counter simply counts i.e. can be incremented or decremented
counter = registry.register_counter( 'active.users.counter' ) # one new user logged on counter.inc # three new users logged on counter.inc 3 # one user logged off counter.dec # two users logged off counter.dec 2
meter¶ ↑
used = registry.register_meter( 'app.used' )
mark the occurrence of an event
used.mark
mark the occurrence of 'n' events
used.mark n
histogram¶ ↑
measures the distribution of values in a stream of data using an exponentially decaying reservoir
histogram = registry.register_histogram( 'search.results' ) histogram.update( Search.last_result.size )
remove any metrics¶ ↑
registry.unregister( 'app.uptime )
note¶ ↑
currently there is not further introspection on the registry and its health-check. with the Leafy::Json::MetricsWriter
(from leafy-rack) you can get a json representation of the current metrics report
Leafy::Json::MetricsWriter.to_json( registry.metrics )
reporters¶ ↑
all reporters use a builder pattern. there are following timeunits for configuration:
-
Leafy::Metrics::Reporter::DAYS
-
Leafy::Metrics::Reporter::HOURS
-
Leafy::Metrics::Reporter::MINUTES
-
Leafy::Metrics::Reporter::SECONDS
-
Leafy::Metrics::Reporter::MILLISECONDS
-
Leafy::Metrics::Reporter::MICROSECONDS
-
Leafy::Metrics::Reporter::NANOSECONDS
in all examples below metrics = Leafy::Metrics::Registry.new
console reporter¶ ↑
require 'leafy/metrics/console_reporter' reporter = metrics.reporter_builder( Leafy::Metrics::ConsoleReporter ).build reporter.start( 1, Leafy::Metrics::Reporter::SECONDS ) .... reporter.stop
or with all the possible configuration
reporter = metrics.reporter_builder( Leafy::Metrics::ConsoleReporter ) .convert_rates_to( Leafy::Metrics::Reporter::MILLISECONDS ) .convert_durations_to( Leafy::Metrics::Reporter::MILLISECONDS ) .output_to( STDERR ) .build
or the config via a block
reporter = metrics.reporter_builder( Leafy::Metrics::ConsoleReporter ) do convert_rates_to( Leafy::Metrics::Reporter::MILLISECONDS ) convert_durations_to( Leafy::Metrics::Reporter::MILLISECONDS ) output_to( STDERR ) end.build
csv reporter¶ ↑
for each metric there will be a CSV file inside a given directory
require 'leafy/metrics/csv_reporter' reporter = metrics.reporter_builder( Leafy::Metrics::CSVReporter ) .build( 'metrics/directory' ) reporter.start( 1, Leafy::Metrics::Reporter::SECONDS ) .... reporter.stop
or with all possible configuration
reporter = metrics.reporter_builder( Leafy::Metrics::CSVReporter ) .convert_rates_to( Leafy::Metrics::Reporter::MILLISECONDS ) .convert_durations_to( Leafy::Metrics::Reporter::MILLISECONDS ) .build( 'metrics/directory' )
or configuration via block
reporter = metrics.reporter_builder( Leafy::Metrics::CSVReporter ) do convert_rates_to( Leafy::Metrics::Reporter::MILLISECONDS ) convert_durations_to( Leafy::Metrics::Reporter::MILLISECONDS ) end.build( 'metrics/directory' )
graphite reporter¶ ↑
there are three targets where to send the data
-
( hostname, port )
-
( hostname, port )
-
( hostname, port, batchsize )
the latter is collecting a few report event and sends them as batch. the sender
is one of the above targets.
require 'leafy/metrics/graphite_reporter' reporter = metrics.reporter_builder( Leafy::Metrics::GraphiteReporter ) .build_tcp( hostname, port ) reporter.start( 1, Leafy::Metrics::Reporter::SECONDS ) .... reporter.stop
or with full configuration
reporter = metrics.reporter_builder( Leafy::Metrics::GraphiteReporter ) .convert_rates_to( Leafy::Metrics::Reporter::MILLISECONDS ) .convert_durations_to( Leafy::Metrics::Reporter::MILLISECONDS ) .prefixed_with( 'myapp' ) .build( sender )
or with block configuration
reporter = metrics.reporter_builder( Leafy::Metrics::GraphiteReporter ) do convert_rates_to( Leafy::Metrics::Reporter::MILLISECONDS ) convert_durations_to( Leafy::Metrics::Reporter::MILLISECONDS ) prefixed_with( 'myapp' ) end.build_udp( host, port )
any third party reporter¶ ↑
reporter = metrics.reporter_builder( com.readytalk.metrics.StatsDReporter ) do convert_rates_to( Leafy::Metrics::Reporter::MILLISECONDS ) convert_durations_to( Leafy::Metrics::Reporter::MILLISECONDS ) end.build( host, port )
or using the Java module reference
reporter = metrics.reporter_builder( Java::ComReadytalkMetrics::StatsDReporter ) do convert_rates_to( Leafy::Metrics::Reporter::MILLISECONDS ) convert_durations_to( Leafy::Metrics::Reporter::MILLISECONDS ) prefixed_with( 'app' ) end.build( host, port )
developement¶ ↑
get all the gems and jars in place
gem install jar-dependencies --development bundle install
for running all specs
rake
or
rspec spec/reporter_spec.rb