PgqPrometheus

Build Status

Highly configurable Prometheus metrics for PGQ postgres extension

Installation

Add this line to your application's Gemfile:

gem 'pgq_prometheus'

And then execute:

$ bundle install

Or install it yourself as:

$ gem install pgq_prometheus

Usage

Basic usage with rails

config/initializers/pgq_prometheus.rb

require 'pgq_prometheus'
require 'pgq_prometheus/processor'

# If you use postgresql library/orm other then active_record
# look at PgqPrometheus::SqlCaller::ActiveRecord for example of what sql caller should return.
require 'pgq_prometheus/sql_caller/active_record'

# We will configure processor here
PgqPrometheus::Processor.tap do |processor|
  # you must set sql_caller to retrieve data from postgres
  processor.sql_caller = PgqPrometheus::SqlCaller::ActiveRecord.new('ApplicationRecord')
  # you can setup processor logger
  processor.logger = Rails.logger
  # you can do something custom when processor rescues and exception
  processor.on_error = proc { |e| ErrorMailer.notify(e).deliver_later }
end

# we keep configuration is separate file because both processor and collector should require it.
require 'pgq_prometheus_config' # @see lib/pgq_prometheus_configure.rb

# Will start thread which will collect pgq metrics every 30 seconds.
PgqPrometheus::Processor.start(frequency: 30)

lib/pgq_prometheus_config.rb

# We will keep metrics configuration here

PgqPrometheus.configure do |config|
  # these are default metrics - no need to define them manually
  config.register_gauge :new_events, 'new events qty for queue',
    from: :queue, column: :ev_new

  config.register_gauge :events_per_second, 'new events qty for queue',
    from: :queue, column: :ev_per_sec

  config.register_gauge :pending_events, 'pending events qty for queue and consumer',
                     from: :consumer

  # you can define custom metrics
  config.register_histogram :new_events_hist, 'PGQ new events histogram',
    from: :queue,
    labels: { custom_label_name: 'qwe' },
    buckets: [1_000, 100, 50, 10, 1, 0]
  config.register_counter :custom_queue_metric, 'something custom for queue',
    from: :queue,
    apply: proc { |queue_info| CustomQueueMetric.call queue_info[:queue_name] }
  config.register_counter :custom_consumer_metric, 'something custom',
    from: :queue,
    apply: proc { |consumer_info, queue_info| CustomConsumerMetric.call(queue_info, consumer_info) }

  # and remove metrics (event default ones)
  config.unregister_metric :new_events_hist

  # and override type
  config.type = 'postresql_queue'
end

lib/prometheus_collectors.rb

# Require all custom prometheus collectors here

require 'pgq_prometheus'
require 'pgq_prometheus/collector'
require_relative 'pgq_prometheus_config'
$ bundle exec prometheus_exporter -a /path/to/mypoject/lib/prometheus_collectors.rb
$ rails s

Development

After checking out the repo, run bin/setup to install dependencies. Then, run rake test 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/didww/pgq_prometheus. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the code of conduct.

License

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

Code of Conduct

Everyone interacting in the PgqPrometheus project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the code of conduct.