lib/bella/sys/logger.ex

defmodule Bella.Sys.Logger do
  @moduledoc """
  Attaches telemetry events to the Elixir Logger
  """

  require Logger

  @spec attach() :: :ok
  @doc """
  Attaches telemetry events to the Elixir Logger
  """
  def attach do
    events = Bella.Sys.Event.events()
    :telemetry.attach_many("bella-events-logger", events, &Bella.Sys.Logger.log_handler/4, :debug)
  end

  @doc false
  @spec log_handler(keyword, map | integer, map, atom) :: :ok
  def log_handler(event, measurements, metadata, preferred_level) do
    event_name = Enum.join(event, ".")

    level = log_level(event, preferred_level)
    Logger.log(level, "[#{event_name}] #{inspect(measurements)} #{inspect(metadata)}")
  end

  defp log_level(event, preferred_level) do
    case is_error(event) do
      true -> :error
      _ -> preferred_level
    end
  end

  defp is_error(event), do: Enum.any?(event, fn part -> part == :error || part == :fail end)
end