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



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.



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.



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



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



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