0.0
Low commit activity in last 3 years
Implements null-object pattern for Statsd client
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
 Dependencies

Development

~> 2.2
~> 13.1
~> 3.12
 Project Readme

NullStatsd

NullStatsd is a Null Object Pattern implementation of a Statsd client, allowing for conveniently stubbed Statsd objects in your development and testing environments.

Installation

You can install the gem directly with gem install null_statsd, or you can add gem 'null_statsd' to your application's Gemfile, and then bundle install.

Usage

Create a wrapper around your Statsd implementation:

module MyStatsd
  def self.new
    if ENV["STATSD_HOST"] && ENV["STATSD_PORT"]
      Statsd.new(ENV["STATSD_HOST"], ENV["STATSD_PORT"])
    else
      NullStatsd::Statsd.new(host: "fake.host", port: 1234, logger: Logger.new($stderr))
    end
  end
end

# or perhaps

if Rails.env.production? || Rails.env.staging?
  $statsd = Datadog::Statsd.new(ENV["DD_HOST"], ENV["DD_PORT"])
else
  $statsd = NullStatsd::Statsd.new(host: "fa.ke", port: 42, logger: Rails.logger)
end

Create an instance and use it as normal:

MyStatsd.new.increment(...)
$statsd.increment(...)

Notice that your statsd endpoint is not receiving data, but your logs are.

[NullStatsD host:42] Incrementing media.book.consumed with opts {"genre":"science_fiction"}
[NullStatsD host:42] Decrementing media.book.on_hand
[NullStatsD host:42] Recording timing info in book.checkout -> 0.512917 sec

Supported Calls

statsd = NullStatsd::Statsd.new(host: "a.co" port: 42, logger: Logger.new($stdout))
# => [NullStatsD a.co:42] Connecting to fake Statsd, pretending to be on fake.com:4242

statsd.increment "media.book.consumed", genre: "horror"
# => [NullStatsD a.co:42] Incrementing media.book.consumed with opts {"genre":"horror"}

statsd.decrement "media.book.on_hand", genre: "science fiction"
# => [NullStatsD a.co:42] Decrementing media.book.on_hand with opts {"genre":"science fiction"}

statsd.count "responses", 3
# => [NullStatsD a.co:42] Increasing responses by 3

statsd.gauge "media.book.return_time", 12, measurement: "days"
# => [NullStatsD a.co:42] Setting gauge media.book.return_time to 12 with opts {"measurement":"days"}

statsd.histogram "media.book.lent.hour", 42
# => [NullStatsD a.co:42] Logging histogram media.book.lent.hour -> 42

statsd.timing "book checkout", 94, tags: "speedy"
# => [NullStatsD a.co:42] Timing book checkout at 94 ms with opts {"tags":"speedy"}

statsd.set "media.book.lent", 10_000_000
# => [NullStatsD a.co:42] Setting media.book.lent to 10000000

statsd.service_check "door.locked", "ok"
# => [NullStatsD a.co:42] Service check door.locked: ok

statsd.event "Leak", "The library roof has a leak on the west end. Please take care"
# => [NullStatsD a.co:42] Event Leak: The library roof has a leak on the west end. Please take care

statsd.time("media.movie.consume") do
  Movie.new().watch
end
# => [NullStatsD a.co:42] Recording timing info in media.movie.consumed -> 12323.23 sec

statsd.close
# => [NullStatsD a.co:42] Close called

statsd.batch do |s|
  s.increment "foo.bar"
  s.increment "baz"
end
# This just executes the block, yielding the statsd instance to it.

Testing

rake spec

License

This gem is available as open source under the terms of the MIT License.

Contributing

Bug reports and pull requests are welcome on GitHub.