lib/step_flow/metrics/workflow_collector.ex

defmodule StepFlow.Metrics.WorkflowCollector do
  @moduledoc """
  Prometheus metrics collector for workflow duration
  """
  use Prometheus.Collector
  alias StepFlow.Configuration
  alias StepFlow.Workflows
  require Logger

  def collect_mf(_registry, callback) do
    scale = Configuration.get_var_value(StepFlow.Metrics, :scale, "day")
    delta = Configuration.get_var_value(StepFlow.Metrics, :delta, -1)
    completed_statistics = Workflows.get_completed_statistics(scale, delta)

    callback.(
      create_gauge(
        :step_flow_workflows_duration,
        "Average durations of workflows since #{delta} #{scale}(s).",
        completed_statistics
      )
    )

    :ok
  end

  def collect_metrics(:step_flow_workflows_duration, statistics) do
    Prometheus.Model.gauge_metrics(
      Enum.map(statistics, fn %{duration: duration, identifier: identifier} ->
        {[identifier: identifier], duration}
      end)
    )
  end

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