Packages
hackney
3.2.1
4.7.2
4.7.1
4.7.0
4.6.1
4.6.0
4.5.2
4.5.1
4.5.0
4.4.5
4.4.3
4.4.2
4.4.1
4.4.0
4.3.0
4.2.3
4.2.2
4.2.1
4.2.0
4.1.0
4.0.3
4.0.2
4.0.1
4.0.0
3.2.1
3.2.0
3.1.2
3.1.1
3.1.0
3.0.3
3.0.2
3.0.1
3.0.0
retired
2.0.1
2.0.0
2.0.0-beta.1
1.25.0
1.24.1
1.24.0
1.23.0
1.22.0
1.21.0
1.20.1
1.20.0
1.19.1
1.19.0
1.18.2
1.18.1
1.18.0
1.17.4
1.17.3
1.17.2
1.17.1
1.17.0
1.16.0
1.15.2
1.15.1
1.15.0
1.14.3
1.14.2
1.14.0
1.13.0
1.12.1
1.12.0
1.11.0
1.10.1
1.10.0
1.9.0
1.8.6
1.8.5
1.8.4
1.8.3
1.8.2
1.8.0
1.7.1
1.7.0
1.6.6
retired
1.6.5
1.6.4
retired
1.6.3
1.6.2
1.6.1
1.6.0
1.5.7
1.5.6
1.5.5
1.5.4
1.5.3
1.5.2
1.5.1
1.5.0
1.4.10
1.4.8
1.4.7
1.4.6
1.4.5
1.4.4
1.4.3
1.4.2
1.4.1
1.4.0
1.3.2
1.3.1
1.3.0
1.2.0
1.1.0
1.0.6
1.0.5
1.0.2
1.0.1
0.15.2
0.15.0
0.14.3
0.14.2
0.14.1
0.14.0
0.13.1
Simple HTTP client with HTTP/1.1, HTTP/2, and HTTP/3 support
Security advisory:
This version has known vulnerabilities.
View advisories
Current section
Files
Jump to
Current section
Files
src/hackney_metrics_prometheus.erl
%%% -*- erlang -*-
%%%
%%% This file is part of hackney released under the Apache 2 license.
%%% See the NOTICE for more information.
%%%
%%% Copyright (c) 2012-2026 Benoît Chesneau <benoitc@e-engura.org>
%%%
-module(hackney_metrics_prometheus).
-author("benoitc").
-behaviour(hackney_metrics_backend).
%% hackney_metrics_backend callbacks
-export([
counter_inc/2,
counter_inc/3,
gauge_set/3,
gauge_inc/2,
gauge_dec/2,
histogram_observe/3,
declare_counter/3,
declare_gauge/3,
declare_histogram/3,
declare_histogram/4
]).
%% Default histogram buckets for duration metrics (in seconds)
-define(DEFAULT_BUCKETS, [0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1.0, 2.5, 5.0, 10.0]).
%% Counter operations
counter_inc(Name, Labels) ->
counter_inc(Name, Labels, 1).
counter_inc(Name, Labels, Value) ->
try
prometheus_counter:inc(Name, labels_to_list(Labels), Value)
catch
_:_ -> ok
end.
%% Gauge operations
gauge_set(Name, Labels, Value) ->
try
prometheus_gauge:set(Name, labels_to_list(Labels), Value)
catch
_:_ -> ok
end.
gauge_inc(Name, Labels) ->
try
prometheus_gauge:inc(Name, labels_to_list(Labels))
catch
_:_ -> ok
end.
gauge_dec(Name, Labels) ->
try
prometheus_gauge:dec(Name, labels_to_list(Labels))
catch
_:_ -> ok
end.
%% Histogram operations
histogram_observe(Name, Labels, Value) ->
try
prometheus_histogram:observe(Name, labels_to_list(Labels), Value)
catch
_:_ -> ok
end.
%% Metric lifecycle - declarations are idempotent in prometheus
declare_counter(Name, Help, LabelKeys) ->
try
prometheus_counter:declare([
{name, Name},
{help, Help},
{labels, LabelKeys}
])
catch
_:_ -> ok
end.
declare_gauge(Name, Help, LabelKeys) ->
try
prometheus_gauge:declare([
{name, Name},
{help, Help},
{labels, LabelKeys}
])
catch
_:_ -> ok
end.
declare_histogram(Name, Help, LabelKeys) ->
declare_histogram(Name, Help, LabelKeys, ?DEFAULT_BUCKETS).
declare_histogram(Name, Help, LabelKeys, Buckets) ->
try
prometheus_histogram:declare([
{name, Name},
{help, Help},
{labels, LabelKeys},
{buckets, Buckets}
])
catch
_:_ -> ok
end.
%% Internal helpers
%% Convert a map of labels to a list of values in the order expected by prometheus
%% The order is determined by the keys when sorted alphabetically
labels_to_list(Labels) when is_map(Labels) ->
lists:map(fun({_K, V}) -> V end, lists:keysort(1, maps:to_list(Labels))).