defmodule Opencensus.Logger do
@moduledoc """
Updates Elixir's Logger metadata to match Erlang's logger metadata.
`set_logger_metadata/0` and `set_logger_metadata/1` update the following attributes in
`Logger.metadata/0`:
* `trace_id`
* `span_id`
* `trace_options`
You won't need to use this module if you use the macros in `Opencensus.Trace`.
If you use `Logging`, or users of your framework might plausibly use `Logging`, you [SHOULD]
call `set_logger_metadata/0` after using functions in [`:ocp`] to manipulate the span context
stored in the process dictionary.
[:ocp]: https://hexdocs.pm/opencensus/ocp.html
We'll be able to deprecate these functions when Elixir unifies `:logger` and `Logger` metadata
in 1.10 or whichever release [first requires Erlang 21 or better][6611]. To check whether that
has already happened, try this at the `iex` prompt:
```elixir
:ocp.with_child_span("traced")
:logger.get_process_metadata()
Logger.metadata(()
```
If the metadata output from the second and third lines match, we can start deprecating.
[6611]: https://github.com/elixir-lang/elixir/issues/6611
[MAY]: https://tools.ietf.org/html/rfc2119#section-5
[SHOULD]: https://tools.ietf.org/html/rfc2119#section-3
"""
alias Opencensus.SpanContext
@doc "Sets the Logger metadata according to the current span context."
def set_logger_metadata, do: set_logger_metadata(:ocp.current_span_ctx())
@doc "Sets the Logger metadata according to a supplied span context."
@spec set_logger_metadata(:opencensus.span_ctx() | :undefined) :: :ok
def set_logger_metadata(span_ctx)
def set_logger_metadata(:undefined), do: set_logger_metadata(nil, nil, nil)
def set_logger_metadata(span_ctx) do
context = SpanContext.from(span_ctx)
set_logger_metadata(
SpanContext.hex_trace_id(context.trace_id),
SpanContext.hex_span_id(context.span_id),
context.trace_options
)
end
defp set_logger_metadata(trace_id, span_id, trace_options) do
Logger.metadata(trace_id: trace_id, span_id: span_id, trace_options: trace_options)
:ok
end
end