Home

Awesome

Yabeda::Sidekiq

Built-in metrics for Sidekiq monitoring out of the box! Part of the yabeda suite.

Sample Grafana dashboard ID: 11667

Installation

gem 'yabeda-sidekiq'
# Then add monitoring system adapter, e.g.:
# gem 'yabeda-prometheus'

And then execute:

$ bundle

If you're not on Rails then configure Yabeda after your application was initialized:

Yabeda.configure!

If you're using Ruby on Rails then Yabeda will configure itself automatically!

And that is it! Sidekiq metrics are being collected!

Additionally, depending on your adapter, you may want to setup metrics export. E.g. for yabeda-prometheus:

# config/initializers/sidekiq or elsewhere
Sidekiq.configure_server do |_config|
  Yabeda::Prometheus::Exporter.start_metrics_server!
end

Metrics

Local per-process metrics

Metrics representing state of current Sidekiq worker process and stats of executed or executing jobs:

Global cluster-wide metrics

Metrics representing state of the whole Sidekiq installation (queues, processes, etc):

By default all sidekiq worker processes (servers) collects global metrics about whole Sidekiq installation. This can be overridden by setting collect_cluster_metrics config key to true for non-Sidekiq processes or to false for Sidekiq processes (e.g. by setting YABEDA_SIDEKIQ_COLLECT_CLUSTER_METRICS env variable to no, see other methods in anyway_config docs).

Client metrics

Metrics collected where jobs are being pushed to queues (everywhere):

Custom tags

You can add additional tags to these metrics by declaring yabeda_tags method in your worker.

# This block is optional but some adapters (like Prometheus) requires that all tags should be declared in advance
Yabeda.configure do
  default_tag :importance, nil
end

class MyWorker
  include Sidekiq::Worker

  def yabeda_tags(*params) # This method will be called first, before +perform+
    { importance: extract_importance(params) }
  end

  def perform(*params)
    # Your logic here
  end
end

Configuration

Configuration is handled by anyway_config gem. With it you can load settings from environment variables (upcased and prefixed with YABEDA_SIDEKIQ_), YAML files, and other sources. See anyway_config docs for details.

Config keyTypeDefaultDescription
collect_cluster_metricsbooleanEnabled in Sidekiq worker processes, disabled otherwiseDefines whether this Ruby process should collect and expose metrics representing state of the whole Sidekiq installation (queues, processes, etc).
declare_process_metricsbooleanEnabled in Sidekiq worker processes, disabled otherwiseDeclare metrics that are only tracked inside worker process even outside of them. Useful for multiprocess metric collection.
retries_segmented_by_queuebooleanDisabledDefines wheter retries are segemented by queue or reported as a single metric
label_for_error_class_on_sidekiq_jobs_failedbooleanDisabledDefines whether error label should be added to sidekiq_jobs_failed_total metric.

Roadmap (TODO or Help wanted)

Development

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.

Contributing

Bug reports and pull requests are welcome on GitHub at https://github.com/yabeda-rb/yabeda-sidekiq.

Releasing

  1. Bump version number in lib/yabeda/sidekiq/version.rb

    In case of pre-releases keep in mind rubygems/rubygems#3086 and check version with command like Gem::Version.new(Yabeda::Sidekiq::VERSION).to_s

  2. Fill CHANGELOG.md with missing changes, add header with version and date.

  3. Make a commit:

    git add lib/yabeda/sidekiq/version.rb CHANGELOG.md
    version=$(ruby -r ./lib/yabeda/sidekiq/version.rb -e "puts Gem::Version.new(Yabeda::Sidekiq::VERSION)")
    git commit --message="${version}: " --edit
    
  4. Create annotated tag:

    git tag v${version} --annotate --message="${version}: " --edit --sign
    
  5. Fill version name into subject line and (optionally) some description (list of changes will be taken from changelog and appended automatically)

  6. Push it:

    git push --follow-tags
    
  7. GitHub Actions will create a new release, build and push gem into RubyGems! You're done!

License

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