defmodule SignificaUtils.LoggerMetadata do @moduledoc """ Utility for managing logger metadata in various contexts. Provides functions to set logger metadata for improved consistent metadata across logging and error tracking. """ require Logger @doc """ Sets logger metadata, if Sentry is available also sets Sentry extra context. ## Parameters - metadata: A keyword list of metadata key-value pairs ## Examples iex> SignificaUtils.LoggerMetadata.set_metadata(request_id: "abc123", user_id: 456) :ok """ def set_metadata(metadata) do Logger.metadata(metadata) quote do case Code.ensure_loaded(Sentry.Context) do {:module, _} -> unquote(Sentry.Context.set_extra_context(Map.new(metadata))) _ -> nil end end :ok end if Code.ensure_loaded?(Oban.Job) do @doc """ Sets up logger metadata for an Oban job. Takes a job struct with id and worker fields and sets the logger metadata with the job_id and worker name. ## Examples iex> job = %Oban.Job{id: 123, worker: "SampleApp.ExampleWorker"} iex> SignificaUtils.LoggerMetadata.set_oban_job_metadata(job) :ok """ def set_oban_job_metadata( %Oban.Job{id: job_id, worker: worker}, extra \\ [] ) do [ job_id: job_id, worker: worker ] |> Keyword.merge(extra) |> set_metadata() end end end