updawg
A simple way to see what’s up, dawg (and what’s not.)
Define a list of checks and create a controller that renders the results. Ping the controller with the monitoring tool of your choice, perhaps setting a 503 response when one of the checks fails.
Some options can be set:
UpDawg.configure do |config|
config.success_text = 'OK'
end
Checks are defined with a simple DSL:
monitor = Updawg.monitor do
check 'MySQL' do
# Will raise an exception if the connection is unavailable resulting in a failed check
ActiveRecord::Base.connection.execute('SELECT 1 FROM DUAL')
end
check 'Some threshold' do
result ||= error('Threshold exceeded y') if threshold_value > y
result ||= warning('Threshold exceeded x') if threshold_value > x
result
end
# alternatively, use warning!/error!/pass! to break out of the check immediately
check 'Something else' do
warning!('Something kind of bad happened') if threshold_value > x
error! ('Something really bad happened') if threshold_value > y
pass!('Everything is just fine')
end
# Specify a threshold check for captured purchases in the last 24 hours
threshold 'Captured Purchases (24 hours)', :warn_under => 10, :error_under => 1 do
Purchase.captured_at_after(24.hours.ago)
end
# Specify a "sweet spot threshold check" to alert when a business metric goes out of normal range
threshold 'Transactions (24 hours)',
:warn_under => 100, :error_under => 1,
:warn_over => 1000, :error_over => 2000 do
Transaction.created_at_after(24.hours.ago)
end
# Specify a std deviation check to alert when a value is outside of 2 std deviations from the mean
# The block should yield an array of values, the last of which is considered the sample.
# Supports options:
# scale_factor - multiple of the std_dev to user (default: 2)
# smoothing - whether to ignore outliers in the dataset (default: true)
# skip_if_minimum_below - set to a value to skip this check for values that would be very small (default: false)
# skip_if_maximum_above - set to a value to skip this check for values that would be very large (default: false)
deviation 'Hourly Transaction Value' do
Transaction.group('hour').order('hour ASC') # will report if the last hour of data is our of range
end
end
results = monitor.perform
results.success? => true if no checks error
results.warning? => true if no checks error and at least one has a warning
results.error? => true if at least one check fails
Render with:
results.to_html
<table class="updawg monitor">
<tr class="check error">
<td class="name">MySQL</td>
<td class="message">ActiveRecord::StatementInvalid: Mysql::Error: You have an error in your SQL syntax</td>
<td class="status">ERROR</td>
</tr>
<tr class="check pass">
<td class="name">Some threshold</td>
<td class="message"></td>
<td class="status">PASS</td>
</tr>
</table>
Nagios Integration
Use Updawg to easily script nagios checks in Ruby. Create your checks as usual and call #nagios_report!
on the result. Updawg will print a status line formatted for nagios and exit with an appropriate status code.
Note on Patches/Pull Requests
-
Fork the project.
-
Create a feature branch and make your feature addition or bug fix there.
-
Add tests for it. This is important so I don’t break it in a future version unintentionally.
-
Commit, do not mess with rakefile, version, or history. (if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
-
Send me a pull request.
Authors
Matt Griffin github.com/betamatt ([email protected])
Copyright
Copyright © 2010 Viximo, Inc. See LICENSE for details.