diff --git a/Gemfile b/Gemfile index 57b85832..efc7ffeb 100644 --- a/Gemfile +++ b/Gemfile @@ -12,6 +12,7 @@ gem "sinatra", "~> 4.2" group :development, :test do gem "database_cleaner", "~> 2.0" + gem "dogstatsd-ruby", "~> 5.7", ">= 5.7.1" gem "dotenv", "~> 3.0" gem "factory_bot", "~> 6.0" gem "foreman", "~> 0.0" diff --git a/Gemfile.lock b/Gemfile.lock index da3e51fb..f8553ac3 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -46,6 +46,7 @@ GEM database_cleaner-core (2.0.1) diff-lcs (1.5.1) docile (1.4.0) + dogstatsd-ruby (5.7.1) dotenv (3.1.2) drb (2.2.3) factory_bot (6.4.6) @@ -169,6 +170,7 @@ PLATFORMS DEPENDENCIES coveralls_reborn database_cleaner (~> 2.0) + dogstatsd-ruby (~> 5.7, >= 5.7.1) dotenv (~> 3.0) factory_bot (~> 6.0) foreman (~> 0.0) diff --git a/bin/outboxer_datadog_metrics b/bin/outboxer_datadog_metrics new file mode 100755 index 00000000..b5699b79 --- /dev/null +++ b/bin/outboxer_datadog_metrics @@ -0,0 +1,60 @@ +#!/usr/bin/env ruby + +require "bundler/setup" + +begin + require "datadog/statsd" +rescue LoadError + abort <<~MSG + dogstatsd-ruby is not installed. + + Add it to your Gemfile: + + gem "dogstatsd-ruby" + + Then run bundle install. + MSG +end + +require "outboxer" + +environment = ENV["RAILS_ENV"] || "development" +db_config = Outboxer::Database.config(environment: environment, pool: 1) +Outboxer::Database.connect(config: db_config) + +running = true + +["TERM", "INT"].each do |sig| + Signal.trap(sig) { running = false } +end + +dogstatsd = Datadog::Statsd.new( + "127.0.0.1", 8125, + tags: ["env:#{environment}", "service:outboxer", "version:#{Outboxer::VERSION}"] +) + +sleep_interval = 60 +tick_interval = 1 + +logger = Outboxer::Logger.new($stdout, level: 1) +logger.info "Sending outboxer.messages.* statsd metrics to datadog..." + +while running + Outboxer::Message.metrics_by_status.each do |status, metrics| + dogstatsd.gauge("outboxer.messages.count", metrics[:count], tags: ["status:#{status}"]) + + if metrics[:latency] + dogstatsd.gauge("outboxer.messages.latency", metrics[:latency], tags: ["status:#{status}"]) + end + end + + slept = 0 + + while running && slept < sleep_interval + sleep tick_interval + + slept += tick_interval + end +end + +logger.info "Shutting down" diff --git a/generators/datadog_metrics_generator.rb b/generators/datadog_metrics_generator.rb new file mode 100644 index 00000000..6576c270 --- /dev/null +++ b/generators/datadog_metrics_generator.rb @@ -0,0 +1,30 @@ +module Outboxer + class InstallDatadogMetricsGenerator < Rails::Generators::Base + source_root File.expand_path("../", __dir__) + + def copy_bin_file + template "bin/outboxer_datadog_metrics", "bin/outboxer_datadog_metrics" + run "chmod +x bin/outboxer_datadog_metrics" + end + + def print_instructions + say <<~MSG + + To complete setup: + + 1. Add to Gemfile: + gem "dogstatsd-ruby" + + 2. Run: + bundle install + + 3. Start: + bin/outboxer_datadog_metrics + + MSG + end + end +end + +# bundle exec rails g outboxer:install_datadog_metrics +# bin/outboxer_datadog_metrics diff --git a/generators/install_generator.rb b/generators/install_generator.rb index 710a6ad5..1e64b92c 100644 --- a/generators/install_generator.rb +++ b/generators/install_generator.rb @@ -48,3 +48,5 @@ def copy_bin_file end end end + +# bundle exec rails g outboxer:install