Skip to main content

lib/core/telemetry/events.ex

defmodule Core.Telemetry.Events do
  @moduledoc """
  Telemetry event name constants and emit helpers for Elixir Server Core.

  ## Events

  | Event                    | Emitted when                         |
  |--------------------------|--------------------------------------|
  | `[:core, :job, :start]`  | A worker begins executing a job      |
  | `[:core, :job, :stop]`   | A job completes successfully         |
  | `[:core, :job, :error]`  | A job raises an exception            |

  ## Attaching handlers

      :telemetry.attach_many(
        "my-handler",
        [Core.Telemetry.Events.job_start(), Core.Telemetry.Events.job_stop()],
        &MyApp.Telemetry.handle_event/4,
        nil
      )
  """

  @job_start [:core, :job, :start]
  @job_stop  [:core, :job, :stop]
  @job_error [:core, :job, :error]

  def job_start, do: @job_start
  def job_stop,  do: @job_stop
  def job_error, do: @job_error

  @doc """
  Emit job_start. Called by the worker before performing work.
  """
  def emit_job_start(job_id, attempt, payload) do
    :telemetry.execute(@job_start, %{}, %{job_id: job_id, attempt: attempt, payload: payload})
  end

  @doc """
  Emit job_stop. Called by the worker on success.
  """
  def emit_job_stop(job_id, duration_native) do
    :telemetry.execute(@job_stop, %{duration: duration_native}, %{job_id: job_id})
  end

  @doc """
  Emit job_error. Called by the worker on exception.
  """
  def emit_job_error(job_id, duration_native, error_message) do
    :telemetry.execute(@job_error, %{duration: duration_native}, %{job_id: job_id, error: error_message})
  end
end