Current section

Files

Jump to

lib/core/sum.ex

defmodule TelemetryMetricsPrometheus.Core.Sum do
@moduledoc false
alias Telemetry.Metrics
alias TelemetryMetricsPrometheus.Core.EventHandler
@type config :: %{
keep: Metrics.keep(),
measurement: atom(),
metric_name: String.t(),
name: Metrics.normalized_metric_name(),
table: atom(),
tags: Metrics.tags(),
tag_values_fun: Metrics.tag_values(),
type: :sum
}
@spec register(metric :: Metrics.Sum.t(), table_id :: atom(), owner :: pid()) ::
{:ok, :telemetry.handler_id()} | {:error, :already_exists}
def register(metric, table_id, owner) do
handler_id = EventHandler.handler_id(metric.name, owner)
with :ok <-
:telemetry.attach(
handler_id,
metric.event_name,
&handle_event/4,
%{
keep: metric.keep,
measurement: metric.measurement,
metric_name: "",
name: metric.name,
table: table_id,
tags: metric.tags,
tag_values_fun: metric.tag_values,
type: :sum
}
) do
{:ok, handler_id}
else
{:error, :already_exists} = error ->
error
end
end
@spec handle_event(
:telemetry.event_name(),
:telemetry.event_measurements(),
:telemetry.event_metadata(),
config()
) :: :ok
def handle_event(_event, measurements, metadata, config) do
with true <- EventHandler.keep?(config.keep, metadata),
{:ok, measurement} <-
EventHandler.get_measurement(measurements, metadata, config.measurement),
mapped_values <- config.tag_values_fun.(metadata),
:ok <- EventHandler.validate_tags_in_tag_values(config.tags, mapped_values) do
labels = Map.take(mapped_values, config.tags)
key = {config.name, labels}
_res = :ets.update_counter(config.table, key, measurement, {key, 0})
:ok
else
false -> :ok
error -> EventHandler.handle_event_error(error, config)
end
end
end