This software is Work in Progress: features will appear and disappear, API will be changed, your feedback is always welcome!
Extendable solution for easy setup of monitoring in your Ruby apps.
Read more about Yabeda and the reasoning behind it in Martian Chronicles: “Meet Yabeda: Modular framework for instrumenting Ruby applications”
Most of the time you don't need to add this gem to your Gemfile directly (unless you're only collecting your custom metrics):
gem 'yabeda'
# Then add monitoring system adapter, e.g.:
# gem 'yabeda-prometheus'
And then execute:
$ bundle
-
Declare your metrics:
Yabeda.configure do group :your_app do counter :bells_rang_count, comment: "Total number of bells being rang", tags: %i[bell_size] gauge :whistles_active, comment: "Number of whistles ready to whistle" histogram :whistle_runtime do comment "How long whistles are being active" unit :seconds end end end
-
After your application was initialized and all metrics was declared, you need to apply Yabeda configuration:
Yabeda.configure!
If you're using Ruby on Rails then it will be configured automatically!
-
Access metric in your app and use it!
def ring_the_bell(id) bell = Bell.find(id) bell.ring! Yabeda.your_app.bells_rang_count.increment({bell_size: bell.size}, by: 1) end def whistle! Yabeda.your_app.whistle_runtime.measure do # Run your code end end
-
Setup collecting of metrics that do not tied to specific events in you application. E.g.: reporting your app's current state
Yabeda.configure do # This block will be executed periodically few times in a minute # (by timer or external request depending on adapter you're using) # Keep it fast and simple! collect do your_app.whistles_active.set({}, Whistle.where(state: :active).count) end end
-
Optionally setup default tags for all appropriate metrics
Yabeda.configure do # matches all metrics in all groups default_tag :rails_environment, 'production' # matches all metrics in the :your_app group default_tag :tag_name, 'override', group: :your_app end # You can redefine them for limited amount of time Yabeda.with_tags(rails_environment: 'staging') do Yabeda.your_app.bells_rang_count.increment({bell_size: bell.size}, by: 1) end
Note: any usage of
with_tags
must have all those tags defined on all metrics that are generated in the block. -
Optionally override default tags using precedence:
The tag precedence from high to low is:
- Manually specified tags
- Thread local tags (specified by
Yabeda.with_tags
) - Group specific tags
- Global tags
-
See the docs for the adapter you're using
-
Enjoy!
- Prometheus:
- yabeda-prometheus — wraps official Ruby client for Prometheus.
- yabeda-prometheus-mmap — wraps GitLab's fork of Prometheus Ruby client which may work better for multi-process application servers.
- Datadog
- NewRelic
These are developed and maintained by other awesome folks:
- Statsd
- …and more! You can write your own adapter and open a pull request to add it into this list.
- yabeda-rails — basic request metrics for Ruby on Rails applications.
- yabeda-sidekiq — comprehensive set of metrics for monitoring Sidekiq jobs execution and queues.
- yabeda-faktory — metrics for monitoring jobs execution by Ruby workers of Faktory.
- yabeda-graphql — metrics to query and field-level monitoring for apps using GraphQL-Ruby.
- yabeda-puma-plugin — metrics for internal state and performance of Puma application server.
- yabeda-http_requests — monitor how many outgoing HTTP calls your application does (uses Sniffer).
- yabeda-schked — monitor number and duration of Cron jobs executed by Schked.
These are developed and maintained by other awesome folks:
- yabeda-grape — metrics for Grape framework.
- yabeda-gruf — metrics for gRPC Ruby Framework
- yabeda-gc — metrics for Ruby garbage collection.
- …and more! You can write your own adapter and open a pull request to add it into this list.
-
Ability to change metric settings for individual adapters
histogram :foo, comment: "say what?" do adapter :prometheus do buckets [0.01, 0.5, …, 60, 300, 3600] end end
-
Ability to route some metrics only for given adapter:
adapter :prometheus do include_group :sidekiq end
After checking out the repo, run bin/setup
to install dependencies. Then, run rake spec
to run the tests. You can also run bin/console
for an interactive prompt that will allow you to experiment.
To install this gem onto your local machine, run bundle exec rake install
. To release a new version, update the version number in version.rb
, and then run bundle exec rake release
, which will create a git tag for the version, push git commits and tags, and push the .gem
file to rubygems.org.
-
Bump version number in
lib/yabeda/version.rb
In case of pre-releases keep in mind rubygems/rubygems#3086 and check version with command like
Gem::Version.new(Yabeda::VERSION).to_s
-
Fill
CHANGELOG.md
with missing changes, add header with version and date. -
Make a commit:
git add lib/yabeda/version.rb CHANGELOG.md version=$(ruby -r ./lib/yabeda/version.rb -e "puts Gem::Version.new(Yabeda::VERSION)") git commit --message="${version}: " --edit
-
Create annotated tag:
git tag v${version} --annotate --message="${version}: " --edit --sign
-
Fill version name into subject line and (optionally) some description (changes will be taken from changelog and appended automatically)
-
Push it:
git push --follow-tags
Bug reports and pull requests are welcome on GitHub at https://github.com/yabeda-rb/yabeda.
The gem is available as open source under the terms of the MIT License.