|
| 1 | +# frozen_string_literal: true |
| 2 | + |
| 3 | +require "sentry/rails/log_subscriber" |
| 4 | +require "sentry/rails/log_subscribers/active_record_subscriber" |
| 5 | +require "sentry/rails/log_subscribers/action_controller_subscriber" |
| 6 | +require "sentry/rails/log_subscribers/action_mailer_subscriber" |
| 7 | +require "sentry/rails/log_subscribers/active_job_subscriber" |
| 8 | + |
| 9 | +module Sentry |
| 10 | + module Rails |
| 11 | + class Logger |
| 12 | + class << self |
| 13 | + # Subscribe to tracing events for structured logging |
| 14 | + def subscribe_tracing_events |
| 15 | + return unless Sentry.configuration.rails.structured_logging.enabled? |
| 16 | + return unless Sentry.configuration.enable_logs |
| 17 | + |
| 18 | + attach_to = Sentry.configuration.rails.structured_logging.attach_to |
| 19 | + |
| 20 | + # Map of component names to their corresponding LogSubscriber classes |
| 21 | + subscriber_map = { |
| 22 | + active_record: LogSubscribers::ActiveRecordSubscriber, |
| 23 | + action_controller: LogSubscribers::ActionControllerSubscriber, |
| 24 | + action_mailer: LogSubscribers::ActionMailerSubscriber, |
| 25 | + active_job: LogSubscribers::ActiveJobSubscriber |
| 26 | + } |
| 27 | + |
| 28 | + # Attach subscribers for each enabled component |
| 29 | + attach_to.each do |component| |
| 30 | + if subscriber_class = subscriber_map[component] |
| 31 | + subscriber_class.attach_to component |
| 32 | + else |
| 33 | + Sentry.configuration.sdk_logger.warn("Unknown structured logging component: #{component}") |
| 34 | + end |
| 35 | + end |
| 36 | + rescue => e |
| 37 | + Sentry.configuration.sdk_logger.error("Failed to subscribe to tracing events: #{e.message}") |
| 38 | + Sentry.configuration.sdk_logger.error(e.backtrace.join("\n")) |
| 39 | + end |
| 40 | + |
| 41 | + # Unsubscribe from tracing events |
| 42 | + def unsubscribe_tracing_events |
| 43 | + # LogSubscribers automatically handle unsubscription through Rails' mechanism |
| 44 | + # We can manually detach if needed |
| 45 | + subscriber_map = { |
| 46 | + active_record: LogSubscribers::ActiveRecordSubscriber, |
| 47 | + action_controller: LogSubscribers::ActionControllerSubscriber, |
| 48 | + action_mailer: LogSubscribers::ActionMailerSubscriber, |
| 49 | + active_job: LogSubscribers::ActiveJobSubscriber |
| 50 | + } |
| 51 | + |
| 52 | + subscriber_map.each do |component, subscriber_class| |
| 53 | + if defined?(subscriber_class) |
| 54 | + subscriber_class.detach_from component |
| 55 | + end |
| 56 | + end |
| 57 | + rescue => e |
| 58 | + Sentry.configuration.sdk_logger.debug("Error during unsubscribe: #{e.message}") |
| 59 | + end |
| 60 | + end |
| 61 | + end |
| 62 | + end |
| 63 | +end |
0 commit comments