forked from mirrors/akkoma
50 lines
1.2 KiB
Elixir
50 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
|