-
Notifications
You must be signed in to change notification settings - Fork 71
Description
I have a use case, where I want to include span_id
and trace_id
, which come from a "distributed tracing" library of choice into logs. If it's OpenTelemetry or Spandex doesn't really matter, in both cases, I am facing the same possible issue.
I want to have span_id
and trace_id
attached to the log lines generated when web request starts already, but in order to achieve it, the handlers which start the OpenTelemetry/Spandex span/trace need to be executed before the handlers attached by Phoenix.Logger
to the same event.
This seems to be work, as I can disable logger initialization on :phoenix
application start, and then attach it manually after I attached OpenTelemetry/Spandex events, for example:
# config/config.exs
config :phoenix, :logger, false
# lib/application.ex
SpandexPhoenix.Telemetry.install()
Phoenix.Logger.install()
# or
OpenTelemetry.register_application_tracer(:my_app)
OpentelemetryPhoenix.setup()
Phoenix.Logger.install()
This works as I'd expect it to work but, the documentation of this project clearly says:
Note that you should not rely on the order in which handlers are invoked.
Line 72 in d3ba8b2
%% Note that you should not rely on the order in which handlers are invoked.
And this is precisely what I am relying on (and others too, without a doubt).
It seems that the handlers are executed in the order they were inserted to underlying ETS table, as they are fetched with :ets.lookup
, which does return them in order of insertion.
https://github.com/beam-telemetry/telemetry/blob/main/src/telemetry_handler_table.erl#L48
Should we make this behavior official? I think we don't have to change anything in the project code itself, maybe we should just add a couple of tests to make sure the order is preserved, and remove the warnings from the documentation that the order is not guaranteed?