diff --git a/saas/fizzy-saas.gemspec b/saas/fizzy-saas.gemspec index 890b6fec2..0263f70e8 100644 --- a/saas/fizzy-saas.gemspec +++ b/saas/fizzy-saas.gemspec @@ -24,4 +24,15 @@ Gem::Specification.new do |spec| spec.add_dependency "rails", ">= 8.1.0.beta1" spec.add_dependency "queenbee" spec.add_dependency "rails_structured_logging" + spec.add_dependency "sentry-ruby" + spec.add_dependency "sentry-rails" + spec.add_dependency "yabeda" + spec.add_dependency "yabeda-actioncable" + spec.add_dependency "yabeda-activejob" + spec.add_dependency "yabeda-gc" + spec.add_dependency "yabeda-http_requests" + spec.add_dependency "yabeda-prometheus-mmap" + spec.add_dependency "yabeda-puma-plugin" + spec.add_dependency "yabeda-rails" + spec.add_dependency "prometheus-client-mmap" end diff --git a/saas/lib/fizzy/saas/engine.rb b/saas/lib/fizzy/saas/engine.rb index c0941f84e..ce8a22062 100644 --- a/saas/lib/fizzy/saas/engine.rb +++ b/saas/lib/fizzy/saas/engine.rb @@ -18,6 +18,42 @@ module Fizzy app.config.middleware.insert_after(ActiveRecord::Middleware::DatabaseSelector, TransactionPinning::Middleware) end + initializer "fizzy_saas.sentry" do + if !Rails.env.local? && ENV["SKIP_TELEMETRY"].blank? + Sentry.init do |config| + config.dsn = ENV["SENTRY_DSN"] + config.breadcrumbs_logger = %i[ active_support_logger http_logger ] + config.send_default_pii = false + config.release = ENV["GIT_REVISION"] + config.excluded_exceptions += [ "ActiveRecord::ConcurrentMigrationError" ] + end + end + end + + initializer "fizzy_saas.yabeda" do + require "prometheus/client/support/puma" + + Prometheus::Client.configuration.logger = Rails.logger + Prometheus::Client.configuration.pid_provider = Prometheus::Client::Support::Puma.method(:worker_pid_provider) + Yabeda::Rails.config.controller_name_case = :camel + + Yabeda::ActiveJob.install! + + require "yabeda/solid_queue" + Yabeda::SolidQueue.install! + + Yabeda::ActionCable.configure do |config| + config.channel_class_name = "ActionCable::Channel::Base" + end + end + + initializer "fizzy_saas.solid_queue" do + SolidQueue.on_start do + Process.warmup + Yabeda::Prometheus::Exporter.start_metrics_server! + end + end + initializer "fizzy_saas.production_config", before: :load_config_initializers do |app| if Rails.env.local? if Rails.root.join("tmp/structured-logging.txt").exist? diff --git a/saas/lib/yabeda/solid_queue.rb b/saas/lib/yabeda/solid_queue.rb new file mode 100644 index 000000000..082ac8936 --- /dev/null +++ b/saas/lib/yabeda/solid_queue.rb @@ -0,0 +1,27 @@ +module Yabeda + module SolidQueue + def self.install! + Yabeda.configure do + group :solid_queue + + gauge :jobs_failed_count, comment: "Number of failed jobs" + gauge :jobs_unreleased_count, comment: "Number of claimed jobs that don't belong to any process" + gauge :jobs_scheduled_and_delayed_count, comment: "Number of scheduled jobs that have over 5 minutes delay" + gauge :recurring_tasks_count, comment: "Number of recurring jobs scheduled" + gauge :recurring_tasks_delayed_count, comment: "Number of recurring jobs that haven't been enqueued within their schedule" + + collect do + if ::SolidQueue.supervisor? + solid_queue.jobs_failed_count.set({}, ::SolidQueue::FailedExecution.count) + solid_queue.jobs_unreleased_count.set({}, ::SolidQueue::ClaimedExecution.where(process: nil).count) + solid_queue.jobs_scheduled_and_delayed_count.set({}, ::SolidQueue::ScheduledExecution.where(scheduled_at: ..5.minutes.ago).count) + solid_queue.recurring_tasks_count.set({}, ::SolidQueue::RecurringTask.count) + solid_queue.recurring_tasks_delayed_count.set({}, ::SolidQueue::RecurringTask.count do |task| + task.last_enqueued_time.present? && (task.previous_time - task.last_enqueued_time) > 5.minutes + end) + end + end + end + end + end +end