lib/step_flow/metrics/job_instrumenter.ex

defmodule StepFlow.Metrics.JobInstrumenter do
  @moduledoc """
  Prometheus metrics instrumenter to call jobs metric collectors
  """
  use Prometheus.Metric

  def setup do
    Prometheus.Registry.register_collector(StepFlow.Metrics.JobsPendingCollector)

    Counter.declare(
      name: :step_flow_jobs_created,
      help: "Number of created jobs.",
      labels: [:name]
    )

    Counter.declare(
      name: :step_flow_jobs_error,
      help: "Number of failed jobs.",
      labels: [:name]
    )

    Counter.declare(
      name: :step_flow_jobs_stopped,
      help: "Number of stopped jobs.",
      labels: [:name]
    )

    Counter.declare(
      name: :step_flow_jobs_completed,
      help: "Number of completed jobs.",
      labels: [:name]
    )

    Gauge.declare(
      name: :step_flow_jobs_processing,
      help: "Number of sockets checked out from the pool",
      labels: [:name]
    )
  end

  def inc(:step_flow_jobs_created, job_name) do
    if StepFlow.Configuration.metrics_enabled?() do
      Counter.inc(
        name: :step_flow_jobs_created,
        labels: [job_name]
      )

      Gauge.inc(
        name: :step_flow_jobs_processing,
        labels: [job_name]
      )
    end
  end

  def inc(:step_flow_jobs_error, job_name) do
    if StepFlow.Configuration.metrics_enabled?() do
      Counter.inc(
        name: :step_flow_jobs_error,
        labels: [job_name]
      )

      Gauge.dec(
        name: :step_flow_jobs_processing,
        labels: [job_name]
      )
    end
  end

  def inc(:step_flow_jobs_stopped, job_name) do
    if StepFlow.Configuration.metrics_enabled?() do
      Counter.inc(
        name: :step_flow_jobs_stopped,
        labels: [job_name]
      )

      Gauge.dec(
        name: :step_flow_jobs_processing,
        labels: [job_name]
      )
    end
  end

  def inc(:step_flow_jobs_completed, job_name) do
    if StepFlow.Configuration.metrics_enabled?() do
      Counter.inc(
        name: :step_flow_jobs_completed,
        labels: [job_name]
      )

      Gauge.dec(
        name: :step_flow_jobs_processing,
        labels: [job_name]
      )
    end
  end
end