Skip to content

Commit

Permalink
fix: prometheus counter metric naming (#4474)
Browse files Browse the repository at this point in the history
`couch_prometheus_util:counter_metric/1` is intended to add a
`_total` suffix to the name of metrics with type `counter` if
the name does not already end with `_total`.

The implementation was previously incorrect, resulting in metrics
with names like `document_purges_total_total`.

This adds basic eunit tests for the failure / success scenarios and
fixes the implementation.

It is a breaking change for consumers of the `_node/_local/_prometheus`
endpoint, however, since the following metric is renamed:

* `couchdb_document_purges_total_total` -> `couchdb_document_purges_total`
  • Loading branch information
willholley committed Mar 14, 2023
1 parent 5cdc0aa commit 0aedd93
Show file tree
Hide file tree
Showing 2 changed files with 77 additions and 73 deletions.
80 changes: 77 additions & 3 deletions src/couch_prometheus/src/couch_prometheus_util.erl
Original file line number Diff line number Diff line change
Expand Up @@ -146,9 +146,9 @@ path_to_name(Path) ->

counter_metric(Path) ->
Name = path_to_name(Path),
case string:find(Name, <<"_total">>, trailing) == <<"_total">> of
true -> Name;
false -> to_bin(io_lib:format("~s_total", [Name]))
case lists:suffix("_total", Name) of
true -> to_bin(Name);
_ -> to_bin(io_lib:format("~s_total", [Name]))
end.

to_bin(Data) when is_list(Data) ->
Expand All @@ -167,3 +167,77 @@ val(Data) ->
val(Key, Stats) ->
{Key, Data} = lists:keyfind(Key, 1, Stats),
val(Data).

-ifdef(TEST).
-include_lib("couch/include/couch_eunit.hrl").

to_prom_counter_test() ->
?assertEqual(
<<"couchdb_ddoc_cache 10">>,
test_to_prom_output(ddoc_cache, counter, 10)
),
?assertEqual(
<<"couchdb_httpd_status_codes{code=\"200\"} 3">>,
test_to_prom_output(httpd_status_codes, counter, {[{code, 200}], 3})
).

to_prom_gauge_test() ->
?assertEqual(
<<"couchdb_temperature_celsius 36">>,
test_to_prom_output(temperature_celsius, gauge, 36)
).

to_prom_summary_test() ->
?assertEqual(
<<"couchdb_mango_query_time_seconds{quantile=\"0.75\"} 4.5">>,
test_to_prom_summary_output([mango_query_time], [
{value, [
{min, 0.0},
{max, 0.0},
{arithmetic_mean, 0.0},
{geometric_mean, 0.0},
{harmonic_mean, 0.0},
{median, 0.0},
{variance, 0.0},
{standard_deviation, 0.0},
{skewness, 0.0},
{kurtosis, 0.0},
{percentile, [
{50, 0.0},
{75, 4500},
{90, 0.0},
{95, 0.0},
{99, 0.0},
{999, 0.0}
]},
{histogram, [
{0, 0}
]},
{n, 0}
]},
{type, histogram},
{desc, <<"length of time processing a mango query">>}
])
).

counter_metric_test_() ->
[
?_assertEqual(
<<"document_purges_total">>,
counter_metric([document_purges, total])
),
?_assertEqual(
<<"document_purges_total">>,
counter_metric([document_purges])
)
].

test_to_prom_output(Metric, Type, Val) ->
Out = to_prom(Metric, Type, Val),
lists:nth(2, Out).

test_to_prom_summary_output(Metric, Info) ->
Out = to_prom_summary(Metric, Info),
lists:nth(3, Out).

-endif.
70 changes: 0 additions & 70 deletions src/couch_prometheus/test/eunit/couch_prometheus_util_tests.erl

This file was deleted.

0 comments on commit 0aedd93

Please sign in to comment.