Dispatch

Observability

OpenTelemetry metrics and tracing for Dispatch.

Dispatch provides two layers of observability:

  1. System-wide metrics via observability.MetricsExtension — counters for every lifecycle event.
  2. Per-job tracing and metrics via middleware.Tracing() and middleware.Metrics() — spans and histograms per execution.

System-wide metrics (extension)

Register MetricsExtension as a lifecycle extension:

import "github.com/xraph/dispatch/observability"

metricsExt := observability.NewMetricsExtension(
    observability.WithTracerProvider(tp),
    observability.WithMetricFactory(factory),
)

eng := engine.Build(d,
    engine.WithExtension(metricsExt),
)

Metrics recorded

EventMetricLabels
Job enqueueddispatch_jobs_enqueued_totalname, queue
Job completeddispatch_jobs_completed_totalname, queue
Job faileddispatch_jobs_failed_totalname, queue
Job retryingdispatch_jobs_retried_totalname, queue
Job DLQdispatch_jobs_dlq_totalname, queue
Workflow starteddispatch_workflows_started_totalname
Workflow completeddispatch_workflows_completed_totalname
Workflow faileddispatch_workflows_failed_totalname
Cron fireddispatch_crons_fired_totalname

Per-job tracing (middleware)

Add middleware.Tracing() to the engine:

eng := engine.Build(d,
    engine.WithMiddleware(middleware.Tracing()),
    engine.WithTracerProvider(tp),
)

Each job execution creates an OpenTelemetry span with attributes:

  • dispatch.job.name
  • dispatch.job.queue
  • dispatch.job.id
  • dispatch.job.retry_count
  • error (if the job failed)

Per-job metrics (middleware)

Add middleware.Metrics() to the engine:

eng := engine.Build(d,
    engine.WithMiddleware(middleware.Metrics()),
    engine.WithMetricFactory(factory),
)

Records a histogram dispatch_job_duration_seconds labelled by name, queue, and status (completed / failed).

Combining both layers

For full observability, use both:

eng := engine.Build(d,
    engine.WithExtension(observability.NewMetricsExtension(
        observability.WithTracerProvider(tp),
    )),
    engine.WithMiddleware(middleware.Tracing()),
    engine.WithMiddleware(middleware.Metrics()),
    engine.WithTracerProvider(tp),
)

On this page