From 8c7fd53e655b4d8c50ab65b853c049e61eb6f3c0 Mon Sep 17 00:00:00 2001 From: Yordis Prieto Date: Tue, 14 Apr 2026 23:45:05 -0400 Subject: [PATCH 1/2] fix(telemetry): isolate test OpenTelemetry configuration Signed-off-by: Yordis Prieto --- config/test.exs | 2 + test/support/opentelemetry_case.ex | 61 ++++++++++++++++++++++++++---- 2 files changed, 56 insertions(+), 7 deletions(-) diff --git a/config/test.exs b/config/test.exs index ec55c6ca..004b4f63 100644 --- a/config/test.exs +++ b/config/test.exs @@ -14,6 +14,8 @@ config :ex_unit, capture_log: [level: :debug], exclude: [:distributed, :eventstore_adapter] +config :opentelemetry, processors: [] + config :commanded, assert_receive_event_timeout: 100, refute_receive_event_timeout: 100, diff --git a/test/support/opentelemetry_case.ex b/test/support/opentelemetry_case.ex index a8d59d5e..bf81060a 100644 --- a/test/support/opentelemetry_case.ex +++ b/test/support/opentelemetry_case.ex @@ -25,14 +25,15 @@ defmodule Commanded.OpenTelemetryCase do end setup do - :application.stop(:opentelemetry) - :application.set_env(:opentelemetry, :tracer, :otel_tracer_default) + previous_env = Application.get_all_env(:opentelemetry) + previously_started? = started?(:opentelemetry) - :application.set_env(:opentelemetry, :processors, [ - {:otel_batch_processor, %{scheduled_delay_ms: 1, exporter: {:otel_exporter_pid, self()}}} - ]) - - :application.start(:opentelemetry) + restart_opentelemetry( + tracer: :otel_tracer_default, + processors: [ + {:otel_batch_processor, %{scheduled_delay_ms: 1, exporter: {:otel_exporter_pid, self()}}} + ] + ) on_exit(fn -> commanded_events = [ @@ -61,8 +62,54 @@ defmodule Commanded.OpenTelemetryCase do handler <- :telemetry.list_handlers(event) do :telemetry.detach(handler.id) end + + restore_opentelemetry(previous_env, previously_started?) end) :ok end + + defp started?(application) do + Enum.any?(Application.started_applications(), fn {started_application, _description, _version} -> + started_application == application + end) + end + + defp restart_opentelemetry(env) do + stop_opentelemetry() + + Enum.each(env, fn {key, value} -> + Application.put_env(:opentelemetry, key, value) + end) + + Application.start(:opentelemetry) + end + + defp restore_opentelemetry(previous_env, previously_started?) do + stop_opentelemetry() + + current_keys = + :opentelemetry + |> Application.get_all_env() + |> Keyword.keys() + + Enum.each(current_keys -- Keyword.keys(previous_env), fn key -> + Application.delete_env(:opentelemetry, key) + end) + + Enum.each(previous_env, fn {key, value} -> + Application.put_env(:opentelemetry, key, value) + end) + + if previously_started? do + Application.start(:opentelemetry) + end + end + + defp stop_opentelemetry do + case Application.stop(:opentelemetry) do + :ok -> :ok + {:error, {:not_started, :opentelemetry}} -> :ok + end + end end From 691dda5beed8bfa8b43efa7d0c55233b84fb82e8 Mon Sep 17 00:00:00 2001 From: Yordis Prieto Date: Tue, 14 Apr 2026 23:57:17 -0400 Subject: [PATCH 2/2] fix(telemetry): rely on test defaults for trace isolation Signed-off-by: Yordis Prieto --- test/support/opentelemetry_case.ex | 61 ++++-------------------------- 1 file changed, 7 insertions(+), 54 deletions(-) diff --git a/test/support/opentelemetry_case.ex b/test/support/opentelemetry_case.ex index bf81060a..a8d59d5e 100644 --- a/test/support/opentelemetry_case.ex +++ b/test/support/opentelemetry_case.ex @@ -25,15 +25,14 @@ defmodule Commanded.OpenTelemetryCase do end setup do - previous_env = Application.get_all_env(:opentelemetry) - previously_started? = started?(:opentelemetry) + :application.stop(:opentelemetry) + :application.set_env(:opentelemetry, :tracer, :otel_tracer_default) - restart_opentelemetry( - tracer: :otel_tracer_default, - processors: [ - {:otel_batch_processor, %{scheduled_delay_ms: 1, exporter: {:otel_exporter_pid, self()}}} - ] - ) + :application.set_env(:opentelemetry, :processors, [ + {:otel_batch_processor, %{scheduled_delay_ms: 1, exporter: {:otel_exporter_pid, self()}}} + ]) + + :application.start(:opentelemetry) on_exit(fn -> commanded_events = [ @@ -62,54 +61,8 @@ defmodule Commanded.OpenTelemetryCase do handler <- :telemetry.list_handlers(event) do :telemetry.detach(handler.id) end - - restore_opentelemetry(previous_env, previously_started?) end) :ok end - - defp started?(application) do - Enum.any?(Application.started_applications(), fn {started_application, _description, _version} -> - started_application == application - end) - end - - defp restart_opentelemetry(env) do - stop_opentelemetry() - - Enum.each(env, fn {key, value} -> - Application.put_env(:opentelemetry, key, value) - end) - - Application.start(:opentelemetry) - end - - defp restore_opentelemetry(previous_env, previously_started?) do - stop_opentelemetry() - - current_keys = - :opentelemetry - |> Application.get_all_env() - |> Keyword.keys() - - Enum.each(current_keys -- Keyword.keys(previous_env), fn key -> - Application.delete_env(:opentelemetry, key) - end) - - Enum.each(previous_env, fn {key, value} -> - Application.put_env(:opentelemetry, key, value) - end) - - if previously_started? do - Application.start(:opentelemetry) - end - end - - defp stop_opentelemetry do - case Application.stop(:opentelemetry) do - :ok -> :ok - {:error, {:not_started, :opentelemetry}} -> :ok - end - end end