You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by wi...@apache.org on 2023/03/13 18:57:39 UTC

[couchdb] 01/02: fix: prometheus counter metric naming

This is an automated email from the ASF dual-hosted git repository.

willholley pushed a commit to branch prometheus-help
in repository https://gitbox.apache.org/repos/asf/couchdb.git

commit 8e34286436c0f96c7e98f647747a33cf7ded6c6f
Author: Will Holley <wi...@uk.ibm.com>
AuthorDate: Mon Mar 13 17:47:09 2023 +0000

    fix: prometheus counter metric naming
    
    `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 metrics are renamed:
---
 src/couch_prometheus/src/couch_prometheus_util.erl | 80 +++++++++++++++++++++-
 1 file changed, 77 insertions(+), 3 deletions(-)

diff --git a/src/couch_prometheus/src/couch_prometheus_util.erl b/src/couch_prometheus/src/couch_prometheus_util.erl
index 255df6876..c9563687e 100644
--- a/src/couch_prometheus/src/couch_prometheus_util.erl
+++ b/src/couch_prometheus/src/couch_prometheus_util.erl
@@ -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 string:find(Name, <<"_total">>, trailing) of
+        nomatch -> to_bin(io_lib:format("~s_total", [Name]));
+        _ -> Name
     end.
 
 to_bin(Data) when is_list(Data) ->
@@ -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_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})
+        ),
+        ?_assertEqual(
+            <<"couchdb_temperature_celsius 36">>,
+            test_to_prom_output(temperature_celsius, gauge, 36)
+        ),
+        ?_assertEqual(
+            <<"couchdb_mango_query_time_seconds{quantile=\"0.75\"} 4.5">>,
+            test_to_prom_sum_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,total])
+        )
+    ].
+
+test_to_prom_output(Metric, Type, Val) ->
+    Out = to_prom(Metric, Type, Val),
+    lists:nth(2, Out).
+
+test_to_prom_sum_output(Metric, Info) ->
+    Out = to_prom_summary(Metric, Info),
+    lists:nth(3, Out).
+
+-endif.