Class: Tasker::Events::Subscribers::MetricsSubscriber

Inherits:
BaseSubscriber
  • Object
show all
Defined in:
lib/tasker/events/subscribers/metrics_subscriber.rb

Overview

MetricsSubscriber bridges events to the EventRouter for automatic metrics collection

This subscriber is the critical bridge between Tasker's event publishing system and the EventRouter-based metrics collection. It subscribes to all events that should route to metrics and forwards them to EventRouter.route_event().

Architecture:

  • TelemetrySubscriber: Creates OpenTelemetry spans for debugging
  • MetricsSubscriber: Routes events to EventRouter for metrics collection
  • EventRouter: Intelligent routing to MetricsBackend based on configuration
  • MetricsBackend: Thread-safe native metrics storage

This subscriber automatically subscribes to all events configured in EventRouter that route to metrics, ensuring zero-configuration metrics collection.

Instance Method Summary collapse

Methods inherited from BaseSubscriber

#build_event_subscriptions, #build_metric_name, #custom_event?, #event_subscriptions, #extract_core_attributes, #extract_error_metrics, #extract_metric_tags, #extract_numeric_metric, #extract_performance_metrics, #extract_step_attributes, #extract_timing_metrics, filter_events, #generate_handler_method_name, #resolve_internal_event_constant, #safe_get, #should_handle_event?, subscribe, subscribe_to, #subscribe_to_publisher

Constructor Details

#initializeMetricsSubscriber

Returns a new instance of MetricsSubscriber.



23
24
25
26
27
28
29
# File 'lib/tasker/events/subscribers/metrics_subscriber.rb', line 23

def initialize
  super
  @event_router = Tasker::Telemetry::EventRouter.instance

  # Dynamically subscribe to all events that route to metrics
  subscribe_to_metrics_events
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(method_name, *args) ⇒ void

This method returns an undefined value.

Override method_missing to handle dynamic event methods

Since we subscribe to events dynamically, we need to handle the resulting method calls dynamically as well.

Parameters:

  • method_name (Symbol)

    The method name

  • args (Array)

    Method arguments



57
58
59
60
61
62
63
64
65
# File 'lib/tasker/events/subscribers/metrics_subscriber.rb', line 57

def method_missing(method_name, *args)
  if method_name.to_s.start_with?('handle_')
    # Extract event name from method name
    event_name = method_name.to_s.sub(/^handle_/, '').tr('_', '.')
    handle_event(event_name, args.first)
  else
    super
  end
end

Instance Method Details

#handle_event(event_name, event) ⇒ void

This method returns an undefined value.

Handle any event by routing it through EventRouter

This is a catch-all handler that routes events to the EventRouter based on the configured mappings.

Parameters:

  • event_name (String)

    The event name

  • event (Hash, Dry::Events::Event)

    The event payload



39
40
41
42
43
44
45
46
47
# File 'lib/tasker/events/subscribers/metrics_subscriber.rb', line 39

def handle_event(event_name, event)
  return unless should_process_event?(event_name)

  # Extract payload from event object if needed
  payload = event.respond_to?(:payload) ? event.payload : event

  # Route to EventRouter for intelligent backend routing
  @event_router.route_event(event_name, payload)
end

#respond_to_missing?(method_name, include_private = false) ⇒ Boolean

Check if we respond to dynamic event handler methods

Parameters:

  • method_name (Symbol)

    The method name

  • include_private (Boolean) (defaults to: false)

    Whether to include private methods

Returns:

  • (Boolean)

    True if we respond to the method



72
73
74
# File 'lib/tasker/events/subscribers/metrics_subscriber.rb', line 72

def respond_to_missing?(method_name, include_private = false)
  method_name.to_s.start_with?('handle_') || super
end

#should_process_event?(event_constant) ⇒ Boolean

Override BaseSubscriber to check EventRouter configuration

Parameters:

  • event_constant (String)

    The event constant or name

Returns:

  • (Boolean)

    True if the event should be processed



80
81
82
83
84
85
86
87
88
89
# File 'lib/tasker/events/subscribers/metrics_subscriber.rb', line 80

def should_process_event?(event_constant)
  # Only process if telemetry is enabled
  return false unless Tasker::Configuration.configuration.telemetry.enabled

  # Convert constant to event name if needed
  event_name = event_constant.respond_to?(:name) ? event_constant.name : event_constant.to_s

  # Check if EventRouter routes this event to metrics
  @event_router.routes_to_metrics?(event_name)
end