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
 | 
