lib/step_flow/metrics/pending_job_collector.ex

defmodule StepFlow.Metrics.JobsPendingCollector do
  @moduledoc """
  Prometheus metrics collector for pending jobs
  """
  use Prometheus.Collector
  alias StepFlow.Jobs
  require Logger

  def collect_mf(_registry, callback) do
    jobs = Jobs.get_pending_jobs_by_type()

    callback.(
      create_gauge(
        :step_flow_jobs_pending,
        "Step flow pending jobs by type",
        jobs
      )
    )

    :ok
  end

  def collect_metrics(:step_flow_jobs_pending, jobs) do
    Prometheus.Model.gauge_metrics(
      Enum.map(jobs, fn %{name: name, value: value} ->
        {[job_name: name], value}
      end)
    )
  end

  defp create_gauge(name, help, data) do
    Prometheus.Model.create_mf(name, help, :gauge, __MODULE__, data)
  end
end