lib/commanded/middleware.ex

defmodule OpentelemetryCommanded.Middleware do
  @moduledoc """
  A middleware for propagating span context to Aggregates, Event Handlers, etc

  Usage:

  ```elixir
  # In your commanded router

  middleware OpentelemetryCommanded.Middleware
  ```
  """

  @behaviour Commanded.Middleware

  require OpenTelemetry.Tracer

  import Commanded.Middleware.Pipeline
  import OpentelemetryCommanded.Util

  alias Commanded.Middleware.Pipeline

  def before_dispatch(%Pipeline{} = pipeline) do
    trace_headers = :otel_propagator_text_map.inject([])

    assign_metadata(pipeline, "trace_ctx", encode_headers(trace_headers))
  end

  def after_dispatch(pipeline) do
    pipeline
  end

  def after_failure(pipeline) do
    pipeline
  end
end