README.md in harness-0.0.1 vs README.md in harness-0.1.0
- old
+ new
@@ -1,9 +1,15 @@
# Harness
-TODO: Write a gem description
+Harness connects measurements coming from `ActiveSupport::Notifications`
+to external metric tracking services. Counters are stored locally with
+redis before being sent to the service.
+Currently Supported Services:
+
+* Librato
+
## Installation
Add this line to your application's Gemfile:
gem 'harness'
@@ -16,10 +22,154 @@
$ gem install harness
## Usage
-TODO: Write usage instructions here
+In the metrics world there are two types of things: Gauges and Counters.
+Gauges are time senstive and represent something at a specific point in
+time. Counters keep track of things and should be increasing. Counters
+can be reset back to zero. You can combine counters and/or gauges to
+correlate data about your application.
+
+Harness makes this process easily. Harness' primary goal it make it dead
+simple to start measuring different parts of your application.
+`ActiveSupport::Notifications` makes this very easy because it provides
+measurements and implements the observer pattern.
+
+## Tracking Things
+
+I guess you read the `ActiveSupport::Notifications`
+[documentation](http://api.rubyonrails.org/classes/ActiveSupport/Notifications.html)
+before going any further or this will seems like php to you. Harness
+hooks into your notifications and looks for `:gauge` or `:counter`
+options. If either is present, it will be sent to the external service.
+For example, you can track how long it's taking to do a specific thing:
+
+```ruby
+class MyClass
+ def important_method(stuff)
+ ActiveSupport::Notifications.instrument "important_method.my_class", :gauge => true do
+ do_important_stuff
+ end
+ end
+end
+```
+
+You can do the same with a counter. Counter values are automatically
+stored in redis and incremented. This means you can simply pass
+`:counter => true` in instrumentations if you'd like to count it. You
+may also pass `:counter => 5` if you'd like to provide your own value.
+This value is stored in redis so the next time `:counter => true` will
+work correctly. You can reset all the counters back to zero by calling:
+`Harness.reset_counters!`.
+
+```ruby
+class MyClass
+ def important_method(stuff)
+ ActiveSupport::Notifications.instrument "important_method.my_class", :counter => true do
+ do_important_stuff
+ end
+ end
+end
+```
+
+The instuments name will be sent as the name (`important_method.my_class`)
+for that gauge or counter.
+
+Harness will do all the extra work in sending these metrics to whatever
+service you're using.
+
+## Customzing
+
+You can pash a hash to `:counter` or `:gauge` to initialize the
+measurement your own way.
+
+```ruby
+class MyClass
+ def important_method(stuff)
+ ActiveSupport::Notifications.instrument "important_method.my_class", :gauge => { :id => 'custom-id', :name => "My Measurement" } do
+ do_important_stuff
+ end
+ end
+end
+```
+
+## One Off Gauges and Counters
+
+You can instantiate `Harness::Counter` and `Harness::Guage` wherever you
+want. Events from `ActiveSupport` are just converted to these classes
+under the covers anyways. You can use these class if you want to take
+peridocial measurements or tracking something that happens outside the
+application.
+
+```ruby
+gauge = Harness::Gauge.new
+gauge.id = "foo.bar"
+gauge.name = "Foo's Bar"
+gauge.time # defaults to Time.now
+gauge.value = readings_from_my_server
+gauge.units = 'bytes'
+gauge.log
+
+counter = Harness::Counter.new
+counter.id = "foo.bar"
+counter.name = "# of Foo bars"
+counter.time # defaults to Time.now
+counter.value = read_total_users_in_database
+counter.log
+
+# Both class take an option hash
+
+gauge = Harness::Guage.new :time => Time.now, :id => 'foo.bar'
+counter = Harness::Counter.new :time => Time.now, :id => 'foo.bar'
+```
+
+## Configuration
+
+```ruby
+Harness.config.adapter = :librato
+
+Harness.config.librato.email = 'example@example.com'
+Harness.config.librato.token = 'your-api-key'
+
+Harness.redis = Redis.new
+```
+
+## Rails Integration
+
+Harness will automatically log metrics coming from `ActionPack`,
+`ActiveRecord`, `ActiveSupport` and `ActionMailer`.
+
+You can configure Harness from `application.rb`
+
+```ruby
+config.harness.adapter = :librato
+config.librato.email = 'example@example.com'
+config.librato.token = 'your-api-key'
+```
+
+Redis will be automatically configured if you `REDISTOGO_URL` or
+`REDIS_URL` environment variables at set. They are wrapped in a
+namespace so there will be no conflicts. If they are not present, the
+default values are used. You can customize this in an initializer:
+
+```ruby
+# config/initializers/harness.rb
+require 'erb'
+
+file = Rails.root.join 'config', 'resque.yml'
+config = YAML.load(ERB.new(File.read(Rails.root.join('config', 'resque.yml'))).result)
+
+Harness.redis = Redis.new(:url => config[Rails.env])
+```
+
+`rake harness:reset_counters` is also added.
+
+### Rails Environments
+
+Measurements are completely ignored in the test env. They are processed
+in development mode, but not sent to the external service. Everything is
+logged in production.
## Contributing
1. Fork it
2. Create your feature branch (`git checkout -b my-new-feature`)