Current section
Files
Jump to
Current section
Files
lib/metrics.ex
defmodule PrometheusHackneyCollector.Metrics do
@moduledoc """
To use this, add the following to your `config.exs`
```
config :hackney, mod_metrics: PrometheusHackneyCollector.Metrics
```
"""
use Prometheus.Metric
def new(:counter, [:hackney, :nb_requests]) do
Application.ensure_all_started(:prometheus)
for gauge <- [:nb_requests] do
name = to_name([:hackney, gauge])
Gauge.declare(name: name, help: Atom.to_string(name), labels: [:host])
end
for counter <- [:connect_timeout, :connect_error] do
name = to_name([:hackney, counter, :total])
Counter.declare(name: name, help: Atom.to_string(name), labels: [:host])
end
for histogram <- [:request_time, :connect_time, :response_time] do
name = to_name([:hackney, histogram, :duration_milliseconds])
Histogram.declare(
name: name,
help: Atom.to_string(name),
labels: [:host],
duration_unit: false,
buckets: [5, 10, 25, 50, 100, 250, 500, 1000, 2500, 5000, 10000, 30000]
)
end
end
def new(:counter, [:hackney, metric] = parts) do
Application.ensure_all_started(:prometheus)
total_name = to_name([:hackney, metric, :total])
name = to_name(parts)
Counter.declare(name: total_name, help: Atom.to_string(total_name))
Gauge.declare(name: name, help: Atom.to_string(name), labels: [:host])
end
def new(_, _) do
:ok
end
def delete(_) do
{:error, :unsupported}
end
def sample(_) do
{:error, :unsupported}
end
def get_value(_) do
{:error, :unsupported}
end
# this is incremented by the labelled one so
# just return :ok
def increment_counter([:hackney, :nb_requests]) do
:ok
end
def increment_counter([:hackney, metric]) do
Counter.inc(name: to_name([:hackney, metric, :total]))
:ok
end
def increment_counter([:hackney, host, metric] = parts) when is_list(host) do
Gauge.inc(name: to_name([:hackney, metric]), labels: [host])
:ok
end
def increment_counter(_) do
:ok
end
def increment_counter(_, _) do
:ok
end
def decrement_counter([:hackney, :nb_requests]) do
:ok
end
def decrement_counter([:hackney, metric]) do
Gauge.dec(name: to_name([:hackney, metric]))
:ok
end
def decrement_counter([:hackney, host, metric] = parts) when is_list(host) do
Gauge.dec(name: to_name([:hackney, metric]), labels: [host])
:ok
end
def decrement_counter(_) do
:ok
end
def decrement_counter(_, _) do
:ok
end
def update_histogram(_, f) when is_function(f) do
:ok
end
def update_histogram([:hackney, host, metric] = parts, v) when is_list(host) do
Histogram.observe([name: to_name([:hackney, metric, :duration_milliseconds]), labels: [host]], v)
:ok
end
def update_histogram([:hackney_pool, _pool, _metric], _) do
:ok
end
def update_histogram(_, _) do
:ok
end
def update_gauge(_, _) do
{:error, :unsupported}
end
def update_meter(_, _) do
{:error, :unsupported}
end
def increment_spiral(_) do
{:error, :unsupported}
end
def increment_spiral(_, _) do
{:error, :unsupported}
end
def decrement_spiral(_) do
{:error, :unsupported}
end
def decrement_spiral(_, _) do
{:error, :unsupported}
end
defp to_name(xs) when is_list(xs) do
xs |> Enum.join("_") |> String.to_atom()
end
defp to_name(xs) do
to_name([xs])
end
end