lib/step_flow/metrics/workflow_instrumenter.ex

defmodule StepFlow.Metrics.WorkflowInstrumenter do
  @moduledoc """
  Prometheus metrics instrumenter to call workflow metric collectors
  """
  alias StepFlow.Workflows
  use Prometheus.Metric

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

    Counter.declare(
      name: :step_flow_workflows_created,
      help: "Number of created workflows.",
      labels: [:identifier]
    )

    Counter.declare(
      name: :step_flow_workflows_stopped,
      help: "Number of stopped workflows.",
      labels: [:identifier]
    )

    Counter.declare(
      name: :step_flow_workflows_error,
      help: "Number of failed workflows.",
      labels: [:identifier]
    )

    Counter.declare(
      name: :step_flow_workflows_completed,
      help: "Number of completed workflows.",
      labels: [:identifier]
    )
  end

  def inc(:step_flow_workflows_created, identifier) do
    if StepFlow.Configuration.metrics_enabled?() do
      Counter.inc(
        name: :step_flow_workflows_created,
        labels: [identifier]
      )
    end
  end

  def inc(:step_flow_workflows_error, workflow_id) do
    if StepFlow.Configuration.metrics_enabled?() do
      with %{identifier: identifier} <- Workflows.get_workflow!(workflow_id) do
        Counter.inc(
          name: :step_flow_workflows_error,
          labels: [identifier]
        )
      end
    end
  end

  def inc(:step_flow_workflows_stopped, workflow_id) do
    if StepFlow.Configuration.metrics_enabled?() do
      with %{identifier: identifier} <- Workflows.get_workflow!(workflow_id) do
        Counter.inc(
          name: :step_flow_workflows_stopped,
          labels: [identifier]
        )
      end
    end
  end

  def inc(:step_flow_workflows_completed, identifier) do
    if StepFlow.Configuration.metrics_enabled?() do
      Counter.inc(
        name: :step_flow_workflows_completed,
        labels: [identifier]
      )
    end
  end
end