49 lines
		
	
	
	
		
			1.2 KiB
		
	
	
	
		
			Elixir
		
	
	
	
	
	
			
		
		
	
	
			49 lines
		
	
	
	
		
			1.2 KiB
		
	
	
	
		
			Elixir
		
	
	
	
	
	
defmodule Pleroma.PrometheusExporter do
 | 
						|
  @moduledoc """
 | 
						|
  Exports metrics in Prometheus format.
 | 
						|
  Mostly exists because of https://github.com/beam-telemetry/telemetry_metrics_prometheus_core/issues/52
 | 
						|
  Basically we need to fetch metrics every so often, or the lib will let them pile up and eventually crash the VM.
 | 
						|
  It also sorta acts as a cache so there is that too.
 | 
						|
  """
 | 
						|
 | 
						|
  use GenServer
 | 
						|
  require Logger
 | 
						|
 | 
						|
  def start_link(_opts) do
 | 
						|
    GenServer.start_link(__MODULE__, :ok, name: __MODULE__)
 | 
						|
  end
 | 
						|
 | 
						|
  def init(_opts) do
 | 
						|
    schedule_next()
 | 
						|
    {:ok, ""}
 | 
						|
  end
 | 
						|
 | 
						|
  defp schedule_next do
 | 
						|
    Process.send_after(self(), :gather, 60_000)
 | 
						|
  end
 | 
						|
 | 
						|
  # Scheduled function, gather metrics and schedule next run
 | 
						|
  def handle_info(:gather, _state) do
 | 
						|
    schedule_next()
 | 
						|
    state = TelemetryMetricsPrometheus.Core.scrape()
 | 
						|
    {:noreply, state}
 | 
						|
  end
 | 
						|
 | 
						|
  # Trigger the call dynamically, mostly for testing
 | 
						|
  def handle_call(:gather, _from, _state) do
 | 
						|
    state = TelemetryMetricsPrometheus.Core.scrape()
 | 
						|
    {:reply, state, state}
 | 
						|
  end
 | 
						|
 | 
						|
  def handle_call(:show, _from, state) do
 | 
						|
    {:reply, state, state}
 | 
						|
  end
 | 
						|
 | 
						|
  def show do
 | 
						|
    GenServer.call(__MODULE__, :show)
 | 
						|
  end
 | 
						|
 | 
						|
  def gather do
 | 
						|
    GenServer.call(__MODULE__, :gather)
 | 
						|
  end
 | 
						|
end
 |