Class: Tasker::MetricsExportJob

Inherits:
ApplicationJob show all
Includes:
Concerns::StructuredLogging
Defined in:
app/jobs/tasker/metrics_export_job.rb

Overview

ActiveJob for exporting metrics with distributed coordination

Phase 4.2.2.3.3: Thin wrapper around MetricsExportService that handles ActiveJob concerns (queueing, retries, timeouts) while delegating the actual export business logic to the service.

Key Features:

  • Rails ActiveJob integration for any backend (Sidekiq, SQS, etc.)
  • Distributed coordination through ExportCoordinator
  • Retry handling with exponential backoff
  • Timeout protection
  • Comprehensive logging

Examples:

Scheduled by ExportCoordinator

MetricsExportJob.set(wait_until: 5.minutes.from_now).perform_later(
  format: :prometheus,
  coordinator_instance: "web-1-12345",
  timing: { export_time: Time.current + 5.minutes }
)

Constant Summary

Constants included from Concerns::StructuredLogging

Concerns::StructuredLogging::CORRELATION_ID_KEY

Instance Method Summary collapse

Methods included from Concerns::StructuredLogging

#correlation_id, #correlation_id=, #log_exception, #log_orchestration_event, #log_performance_event, #log_step_event, #log_structured, #log_task_event, #with_correlation_id

Instance Method Details

#perform(format:, coordinator_instance:, scheduled_by: nil, timing: nil, include_instances: false) ⇒ Object

Parameters:

  • format (Symbol)

    Export format (:prometheus, :json, :csv)

  • coordinator_instance (String)

    ExportCoordinator instance identifier

  • scheduled_by (String) (defaults to: nil)

    Who scheduled this job

  • timing (Hash) (defaults to: nil)

    Export timing information

  • include_instances (Boolean) (defaults to: false)

    Include per-instance metrics breakdown



45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
# File 'app/jobs/tasker/metrics_export_job.rb', line 45

def perform(format:, coordinator_instance:, scheduled_by: nil, timing: nil, include_instances: false)
  @format = format.to_sym
  @coordinator_instance = coordinator_instance
  @scheduled_by = scheduled_by
  @timing = timing
  @include_instances = include_instances
  @job_start_time = Time.current

  log_job_started

  # Get metrics data from coordinator
  coordinator = Tasker::Telemetry::ExportCoordinator.instance
  export_result = coordinator.execute_coordinated_export(
    format: @format,
    include_instances: @include_instances
  )

  if export_result[:success]
    # Delegate actual export to service
    service_result = export_with_service(export_result[:result])
    log_job_completed(service_result)
  else
    # Export coordination failed
    handle_failed_coordination(export_result)
  end
rescue StandardError => e
  log_job_error(e)

  # Extend cache TTL before retry to prevent data loss
  extend_cache_ttl_for_retry

  raise # Re-raise to trigger ActiveJob retry logic
end