lib/mobius/remote_reporters/logger_reporter.ex

defmodule Mobius.RemoteReporters.LoggerReporter do
  @moduledoc """
  Example remote reporter that logs the first and last metric

  This logger is used in the example application.
  """

  @behaviour Mobius.RemoteReporter

  require Logger

  @impl Mobius.RemoteReporter
  def init(_) do
    {:ok, nil}
  end

  @impl Mobius.RemoteReporter
  def handle_metrics(metrics, state) do
    groups =
      Enum.group_by(metrics, fn %{name: name, tags: tags, type: type} -> {name, type, tags} end)

    out =
      Enum.reduce(groups, "", fn {{name, type, tags}, grouped_metrics}, str ->
        first = List.first(grouped_metrics)
        last = List.last(grouped_metrics)

        str <>
          """
          #{name}, #{inspect(type)}, #{inspect(tags)}

          First: #{inspect(first.timestamp)}: #{inspect(first.value)}
          Last: #{inspect(last.timestamp)}: #{inspect(last.value)}

          """
      end)

    Logger.info("""

    ======

    Mobius LoggerReporter:

    #{out}
    ======
    """)

    {:noreply, state}
  end
end