diff --git a/doc/operation-and-maintenance/MongooseIM-metrics.md b/doc/operation-and-maintenance/MongooseIM-metrics.md index ea17a54d55..2c07f60784 100644 --- a/doc/operation-and-maintenance/MongooseIM-metrics.md +++ b/doc/operation-and-maintenance/MongooseIM-metrics.md @@ -50,16 +50,17 @@ All metrics are divided into the following groups:

`histogram`

- A histogram collects values and groups them in buckets. + A histogram collects values and exposes the number of observations and their sum (as counters), along with the 50th, 75th, 90th, 95th, 99th, and 99.9th percentiles with 1% accuracy. **Example:** ``` - # TYPE xmpp_element_in_byte_size histogram + # TYPE xmpp_element_in_byte_size summary # HELP xmpp_element_in_byte_size Event: xmpp_element_in, Metric: byte_size - xmpp_element_in_byte_size_bucket{connection_type="c2s",host_type="localhost",le="1"} 0 + xmpp_element_in_byte_size_count{connection_type="c2s",host_type="localhost"} 0 + xmpp_element_in_byte_size_sum{connection_type="c2s",host_type="localhost"} 0 + xmpp_element_in_byte_size{connection_type="c2s",host_type="localhost",quantile="0.5"} 0 ... - xmpp_element_in_byte_size_bucket{connection_type="c2s",host_type="localhost",le="1073741824"} 0 - xmpp_element_in_byte_size_bucket{connection_type="c2s",host_type="localhost",le="+Inf"} 0 + xmpp_element_in_byte_size{connection_type="c2s",host_type="localhost",quantile="0.999"} 0 ``` === "Exometer" diff --git a/rebar.config b/rebar.config index d5ccccdf01..6f53baf0b2 100644 --- a/rebar.config +++ b/rebar.config @@ -56,8 +56,8 @@ {exometer_report_statsd, {git, "https://github.com/esl/exometer_report_statsd.git", {branch, "master"}}}, {syslogger, "0.3.0"}, {flatlog, "0.1.2"}, - {prometheus, "5.0.0"}, - {prometheus_cowboy, "0.1.9"}, + {prometheus, "6.1.1"}, + {prometheus_cowboy, "0.2.0"}, %%% Stateless libraries {opuntia, "1.1.2"}, diff --git a/rebar.lock b/rebar.lock index 5fba1b9b09..992e871d4b 100644 --- a/rebar.lock +++ b/rebar.lock @@ -1,5 +1,5 @@ {"1.2.0", -[{<<"accept">>,{pkg,<<"accept">>,<<"0.3.6">>},2}, +[{<<"accept">>,{pkg,<<"accept">>,<<"0.3.7">>},2}, {<<"amqp_client">>,{pkg,<<"amqp_client">>,<<"4.2.1">>},0}, {<<"backoff">>,{pkg,<<"backoff">>,<<"1.1.6">>},1}, {<<"base16">>,{pkg,<<"base16">>,<<"2.0.1">>},1}, @@ -19,6 +19,7 @@ {<<"credentials_obfuscation">>, {pkg,<<"credentials_obfuscation">>,<<"3.5.0">>}, 1}, + {<<"ddskerl">>,{pkg,<<"ddskerl">>,<<"0.4.2">>},1}, {<<"eini">>,{pkg,<<"eini">>,<<"1.2.9">>},1}, {<<"eodbc">>,{pkg,<<"eodbc">>,<<"0.2.0">>},0}, {<<"epgsql">>,{pkg,<<"epgsql">>,<<"4.7.1">>},0}, @@ -87,10 +88,9 @@ 0}, {<<"parse_trans">>,{pkg,<<"parse_trans">>,<<"3.4.0">>},1}, {<<"pooler">>,{pkg,<<"pooler">>,<<"1.5.3">>},1}, - {<<"prometheus">>,{pkg,<<"prometheus">>,<<"5.0.0">>},0}, - {<<"prometheus_cowboy">>,{pkg,<<"prometheus_cowboy">>,<<"0.1.9">>},0}, - {<<"prometheus_httpd">>,{pkg,<<"prometheus_httpd">>,<<"2.1.13">>},1}, - {<<"quantile_estimator">>,{pkg,<<"quantile_estimator">>,<<"1.0.2">>},1}, + {<<"prometheus">>,{pkg,<<"prometheus">>,<<"6.1.1">>},0}, + {<<"prometheus_cowboy">>,{pkg,<<"prometheus_cowboy">>,<<"0.2.0">>},0}, + {<<"prometheus_httpd">>,{pkg,<<"prometheus_httpd">>,<<"2.1.15">>},1}, {<<"quickrand">>,{pkg,<<"quickrand">>,<<"2.0.7">>},1}, {<<"rabbit_common">>,{pkg,<<"rabbit_common">>,<<"4.2.1">>},1}, {<<"ranch">>,{pkg,<<"ranch">>,<<"2.2.0">>},0}, @@ -118,7 +118,7 @@ {<<"worker_pool">>,{pkg,<<"worker_pool">>,<<"6.4.0">>},0}]}. [ {pkg_hash,[ - {<<"accept">>, <<"AD44AC7D704BF70EF8FB2E313EF5B978F9D1330BDDAC64509E93AFDA13281215">>}, + {<<"accept">>, <<"CD6E34A2D7E28CA38B2D3CB233734CA0C221EFBC1F171F91FEC5F162CC2D18DA">>}, {<<"amqp_client">>, <<"CFF0CC13186E57457DC5745F1B3A4127C6857717CB8F5920DC457C84D0AD00A2">>}, {<<"backoff">>, <<"83B72ED2108BA1EE8F7D1C22E0B4A00CFE3593A67DBC792799E8CCE9F42F796B">>}, {<<"base16">>, <<"F0549F732E03BE8124ED0D19FD5EE52146CC8BE24C48CBC3F23AB44B157F11A2">>}, @@ -132,6 +132,7 @@ {<<"cowlib">>, <<"623791C56C1CC9DF54A71A9C55147A401549917F00A2E48A6AE12B812C586CED">>}, {<<"cpool">>, <<"76222AA1DAC0F8089707167BD69D221EDA63DB65B8BD67DBF6E133075392EEDC">>}, {<<"credentials_obfuscation">>, <<"61E282ADFB4439486B3994FAAEC69543C7EE6CC7E70C6340E8853FD9DEAF8219">>}, + {<<"ddskerl">>, <<"A51A90BE9AC9B36A94017670BED479C623B10CA9D4BDA1EDF3A0E48CAEEADA2A">>}, {<<"eini">>, <<"FCC3CBD49BBDD9A1D9735C7365DAFFCD84481CCE81E6CB80537883AA44AC4895">>}, {<<"eodbc">>, <<"81AC713AE657FC4F67FEA210AE6D4575DDD7003C96953363908EA35E80F33F22">>}, {<<"epgsql">>, <<"D4E47CAE46C18C8AFA88E34D59A9B4BAE16368D7CE1EB3DA24FA755EB28393EB">>}, @@ -164,10 +165,9 @@ {<<"p1_utils">>, <<"67B0C4AC9FA3BA3EF563B31AA111B0A004439A37FAC85E027F1C3617E1C7EC6C">>}, {<<"parse_trans">>, <<"BB87AC362A03CA674EBB7D9D498F45C03256ADED7214C9101F7035EF44B798C7">>}, {<<"pooler">>, <<"898CD1FA301FC42D4A8ED598CE139B71CA85B54C16AB161152B5CC5FBDCFA1A8">>}, - {<<"prometheus">>, <<"8A37A3216D8DB019D19068602669C9819C099120F8E39994DD1BD3A3F5553376">>}, - {<<"prometheus_cowboy">>, <<"D9D5B300516A61ED5AE31391F8EEEEB202230081D32A1813F2D78772B6F274E1">>}, - {<<"prometheus_httpd">>, <<"F086390B4E4E3F41112889B745BAC53D26437B6139496E6700C2508858F5985B">>}, - {<<"quantile_estimator">>, <<"ECD281D40110FDD9BA62685531E4435E0839A52FD1058DA5564F1763E4642EF7">>}, + {<<"prometheus">>, <<"3C9D8E2D4FCF948450550693F6A82FAE013D3665BA10AA55955B64C2875FADB3">>}, + {<<"prometheus_cowboy">>, <<"526F75D9850A9125496F78BCEECCA0F237BC7B403C976D44508543AE5967DAD9">>}, + {<<"prometheus_httpd">>, <<"8F767D819A5D36275EAB9264AFF40D87279151646776069BF69FBDBBD562BD75">>}, {<<"quickrand">>, <<"D2BD76676A446E6A058D678444B7FDA1387B813710D1AF6D6E29BB92186C8820">>}, {<<"rabbit_common">>, <<"1D64E391E12116B76B1425EB96B7552DE51F0301093EBA669B5334F4759CC1E8">>}, {<<"ranch">>, <<"25528F82BC8D7C6152C57666CA99EC716510FE0925CB188172F41CE93117B1B0">>}, @@ -186,7 +186,7 @@ {<<"uuid">>, <<"B2078D2CC814F53AFA52D36C91E08962C7E7373585C623F4C0EA6DFB04B2AF94">>}, {<<"worker_pool">>, <<"0347B805A8E5804B5676A9885FB3B9B6C1627099C449C3C67C0E8E6AF79E9AA6">>}]}, {pkg_hash_ext,[ - {<<"accept">>, <<"A5167FA1AE90315C3F1DD189446312F8A55D00EFA357E9C569BDA47736B874C3">>}, + {<<"accept">>, <<"CA69388943F5DAD2E7232A5478F16086E3C872F48E32B88B378E1885A59F5649">>}, {<<"amqp_client">>, <<"8AE00B055A58500E0557F73D9C0FFE257487131E603F7F84FE72CBFAAF03838A">>}, {<<"backoff">>, <<"CF0CFFF8995FB20562F822E5CC47D8CCF664C5ECDC26A684CBE85C225F9D7C39">>}, {<<"base16">>, <<"06EA2D48343282E712160BA89F692B471DB8B36ABE8394F3445FF9032251D772">>}, @@ -200,6 +200,7 @@ {<<"cowlib">>, <<"0AF652D1550C8411C3B58EED7A035A7FB088C0B86AFF6BC504B0BC3B7F791AA2">>}, {<<"cpool">>, <<"430E18DF4A9D584EB1ED0D196A87CC02E878AF5B4888BFDC9B65F86A96480E30">>}, {<<"credentials_obfuscation">>, <<"843ADBE3246861CE0F1A0FA3222F384834EB31DEFD8D6B9CBA7AFD2977C957BC">>}, + {<<"ddskerl">>, <<"63F907373D7E548151D584D4DA8A38928FD26EC9477B94C0FFAAD87D7CB69FE7">>}, {<<"eini">>, <<"DA64AE8DB7C2F502E6F20CDF44CD3D9BE364412B87FF49FEBF282540F673DFCB">>}, {<<"eodbc">>, <<"ACF72A61349AFD535306F036B8A17C45FA095E039F7C0211E671CCCBD709A8C8">>}, {<<"epgsql">>, <<"B6D86B7DC42C8555B1D4E20880E5099D6D6D053148000E188E548F98E4E01836">>}, @@ -232,10 +233,9 @@ {<<"p1_utils">>, <<"D0379E8C1156B98BD64F8129C1DE022FCCA4F2FDB7486CE73BF0ED2C3376B04C">>}, {<<"parse_trans">>, <<"F99E368830BEA44552224E37E04943A54874F08B8590485DE8D13832B63A2DC3">>}, {<<"pooler">>, <<"058D85C5081289B90E97E4DDDBC3BB5A3B4A19A728AB3BC88C689EFCC36A07C7">>}, - {<<"prometheus">>, <<"80D29564A5DC4490B53FD225D752B65FB0DBEBA41497F96D62223338127C5659">>}, - {<<"prometheus_cowboy">>, <<"5F71C039DEB9E9FF9DD6366BC74C907A463872B85286E619EFF0BDA15111695A">>}, - {<<"prometheus_httpd">>, <<"9B5A44D1F6FBB3C3FE6F85F06DAFE680AD9FFD591EC65A10BB51DFF0FBBE45D2">>}, - {<<"quantile_estimator">>, <<"DB404793D6384995A1AC6DD973E2CEE5BE9FCC128765BDBA53D87C564E296B64">>}, + {<<"prometheus">>, <<"C3ECC7A35676948089E28FF4383CCB85DCEF447F0982C01E5630A084008C456A">>}, + {<<"prometheus_cowboy">>, <<"2C7EB12F4B970D91E3B47BAAD0F138F6ADC34E53EEB0AE18068FF0AFAB441B24">>}, + {<<"prometheus_httpd">>, <<"67736D000745184D5013C58A63E947821AB90CB9320BC2E6AE5D3061C6FFE039">>}, {<<"quickrand">>, <<"B8ACBF89A224BC217C3070CA8BEBC6EB236DBE7F9767993B274084EA044D35F0">>}, {<<"rabbit_common">>, <<"FF509B07E639B1784898C28031E5204FEA14260172E4FC339F94405586037E40">>}, {<<"ranch">>, <<"FA0B99A1780C80218A4197A59EA8D3BDAE32FBFF7E88527D7D8A4787EFF4F8E7">>}, diff --git a/src/instrument/mongoose_instrument_exometer.erl b/src/instrument/mongoose_instrument_exometer.erl index eb2109fa15..567a74e59e 100644 --- a/src/instrument/mongoose_instrument_exometer.erl +++ b/src/instrument/mongoose_instrument_exometer.erl @@ -153,7 +153,7 @@ handle_metric_event(EventName, Labels, MetricName, MetricType, Measurements) -> ok end. --spec update_metric(exometer:name(), spiral | histogram, integer()) -> ok. +-spec update_metric(exometer:name(), mongoose_instrument:metric_type(), integer()) -> ok. update_metric(Name, gauge, Value) when is_integer(Value) -> ok = exometer:update(Name, Value); update_metric(Name, counter, Value) when is_integer(Value) -> diff --git a/src/instrument/mongoose_instrument_prometheus.erl b/src/instrument/mongoose_instrument_prometheus.erl index f0843d3762..650b1c642c 100644 --- a/src/instrument/mongoose_instrument_prometheus.erl +++ b/src/instrument/mongoose_instrument_prometheus.erl @@ -57,7 +57,13 @@ declare_metric(MetricSpec, counter) -> declare_metric(MetricSpec, spiral) -> prometheus_counter:declare(MetricSpec); declare_metric(MetricSpec, histogram) -> - prometheus_histogram:declare([{buckets, histogram_buckets()} | MetricSpec]). + prometheus_quantile_summary:declare([ + {quantiles, [0.5, 0.75, 0.90, 0.95, 0.99, 0.999]}, + {error, 0.01}, + %% Measuring in µs suffices for actions lasting up to a day (with 1% accuracy). + %% Measuring in bytes suffices for sizes up to 81 GB (with 1% accuracy). + {bound, 1260} + | MetricSpec]). -spec reset_metric(name(), [mongoose_instrument:label_value()], mongoose_instrument:metric_type()) -> boolean(). @@ -68,7 +74,7 @@ reset_metric(Name, LabelValues, counter) -> reset_metric(Name, LabelValues, spiral) -> prometheus_counter:remove(Name, LabelValues); reset_metric(Name, LabelValues, histogram) -> - prometheus_histogram:remove(Name, LabelValues). + prometheus_quantile_summary:remove(Name, LabelValues). -spec initialize_metric(name(), [mongoose_instrument:label_value()], mongoose_instrument:metric_type()) -> ok. @@ -92,15 +98,6 @@ metric_spec(EventName, LabelKeys, MetricName) -> {duration_unit, false} % prevent unwanted implicit conversions, e.g. seconds -> microseconds ]. --spec histogram_buckets() -> [integer()]. -histogram_buckets() -> - histogram_buckets([], 1 bsl 30). % ~1.07 * 10^9 - -histogram_buckets(AccBuckets, Val) when Val > 0 -> - histogram_buckets([Val | AccBuckets], Val bsr 1); -histogram_buckets(AccBuckets, _Val) -> - AccBuckets. - -spec handle_metric_event(mongoose_instrument:event_name(), [mongoose_instrument:label_value()], mongoose_instrument:metric_name(), mongoose_instrument:metric_type(), mongoose_instrument:measurements()) -> ok. @@ -139,4 +136,4 @@ update_metric(Name, Labels, counter, Value) when is_integer(Value) -> update_metric(Name, Labels, spiral, Value) when is_integer(Value), Value >= 0 -> ok = prometheus_counter:inc(Name, Labels, Value); update_metric(Name, Labels, histogram, Value) when is_integer(Value) -> - ok = prometheus_histogram:observe(Name, Labels, Value). + ok = prometheus_quantile_summary:observe(Name, Labels, Value). diff --git a/test/mongoose_instrument_metrics_SUITE.erl b/test/mongoose_instrument_metrics_SUITE.erl index 69b7a7d39a..eaa28c3a70 100644 --- a/test/mongoose_instrument_metrics_SUITE.erl +++ b/test/mongoose_instrument_metrics_SUITE.erl @@ -10,6 +10,24 @@ -define(HOST_TYPE, <<"localhost">>). -define(HOST_TYPE2, <<"test type">>). +-define(assertRelEqual(Expect, Actual, Tolerance), + (fun() -> + __Exp = (Expect), + __Act = (Actual), + __Tol = (Tolerance), + case __Exp == 0 of + true -> ?assertEqual(__Exp, __Act); + false -> + __RelErr = abs(__Exp - __Act) / __Exp, + __Check = case __RelErr < __Tol of + true -> ok; + false -> {fail, [{expected, __Exp}, {actual, __Act}, + {rel_error, __RelErr}, {tolerance, __Tol}]} + end, + ?assertEqual(ok, __Check) + end + end)()). + -import(mongoose_instrument_exometer, [exometer_metric_name/3]). %% Setup and teardown @@ -30,6 +48,7 @@ groups() -> prometheus_counter_cannot_be_decreased, prometheus_counter_is_updated_separately_for_different_labels, prometheus_histogram_is_created_and_updated, + prometheus_histogram_is_calculated_correctly, prometheus_histogram_is_updated_separately_for_different_labels, multiple_prometheus_metrics_are_updated]}, {exometer, [parallel], [exometer_skips_non_metric_event, @@ -184,13 +203,33 @@ prometheus_histogram_is_created_and_updated(Config) -> ok = mongoose_instrument:set_up(Event, ?LABELS, #{metrics => #{time => histogram}}), %% Prometheus histogram shows no value if there is no data - ?assertEqual(undefined, prometheus_histogram:value(Metric, [?HOST_TYPE])), + ?assertEqual(undefined, prometheus_quantile_summary:value(Metric, [?HOST_TYPE])), ok = mongoose_instrument:execute(Event, ?LABELS, #{time => 1}), - ?assertMatch({[1, 0|_], 1}, prometheus_histogram:value(Metric, [?HOST_TYPE])), + ?assertMatch({1, 1, _}, prometheus_quantile_summary:value(Metric, [?HOST_TYPE])), ok = mongoose_instrument:execute(Event, ?LABELS, #{time => 1}), - ?assertMatch({[2, 0|_], 2}, prometheus_histogram:value(Metric, [?HOST_TYPE])), + ?assertMatch({2, 2, _}, prometheus_quantile_summary:value(Metric, [?HOST_TYPE])), ok = mongoose_instrument:execute(Event, ?LABELS, #{time => 2}), - ?assertMatch({[2, 1|_], 4}, prometheus_histogram:value(Metric, [?HOST_TYPE])). + ?assertMatch({3, 4, _}, prometheus_quantile_summary:value(Metric, [?HOST_TYPE])). + +prometheus_histogram_is_calculated_correctly(Config) -> + Event = ?config(event, Config), + Metric = prom_name(Event, time), + ok = mongoose_instrument:set_up(Event, ?LABELS, #{metrics => #{time => histogram}}), + + %% Prometheus histogram shows no value if there is no data + ?assertEqual(undefined, prometheus_quantile_summary:value(Metric, [?HOST_TYPE])), + Values = [1, 2, 2, 2, 2, 2, 2, 9, 9, 10], + lists:foreach(fun(V) -> ok = mongoose_instrument:execute(Event, ?LABELS, #{time => V}) end, Values), + Sum = lists:sum(Values), + Length = length(Values), + ?assertMatch({Length, Sum, _}, prometheus_quantile_summary:value(Metric, [?HOST_TYPE])), + %% Check some quantiles + {_, _, Quantiles} = prometheus_quantile_summary:value(Metric, [?HOST_TYPE]), + Tolerance = 0.01, + ?assertRelEqual(2, proplists:get_value(0.5, Quantiles), Tolerance), + ?assertRelEqual(9, proplists:get_value(0.9, Quantiles), Tolerance), + ?assertRelEqual(10, proplists:get_value(0.95, Quantiles), Tolerance), + ?assertRelEqual(10, proplists:get_value(0.99, Quantiles), Tolerance). prometheus_histogram_is_updated_separately_for_different_labels(Config) -> Event = ?config(event, Config), @@ -199,8 +238,8 @@ prometheus_histogram_is_updated_separately_for_different_labels(Config) -> ok = mongoose_instrument:set_up(Event, ?LABELS2, #{metrics => #{time => histogram}}), ok = mongoose_instrument:execute(Event, ?LABELS, #{time => 1}), ok = mongoose_instrument:execute(Event, ?LABELS2, #{time => 2}), - ?assertMatch({[1, 0|_], 1}, prometheus_histogram:value(Metric, [?HOST_TYPE])), - ?assertMatch({[0, 1|_], 2}, prometheus_histogram:value(Metric, [?HOST_TYPE2])). + ?assertMatch({1, 1, _}, prometheus_quantile_summary:value(Metric, [?HOST_TYPE])), + ?assertMatch({1, 2, _}, prometheus_quantile_summary:value(Metric, [?HOST_TYPE2])). multiple_prometheus_metrics_are_updated(Config) -> Event = ?config(event, Config), @@ -211,18 +250,18 @@ multiple_prometheus_metrics_are_updated(Config) -> %% Update both metrics ok = mongoose_instrument:execute(Event, ?LABELS, #{count => 1, time => 2}), ?assertEqual(1, prometheus_counter:value(Counter, [?HOST_TYPE])), - HistogramValue = prometheus_histogram:value(Histogram, [?HOST_TYPE]), - ?assertMatch({[0, 1|_], 2}, HistogramValue), + HistogramValue = prometheus_quantile_summary:value(Histogram, [?HOST_TYPE]), + ?assertMatch({1, 2, _}, HistogramValue), %% Update only one metric ok = mongoose_instrument:execute(Event, ?LABELS, #{count => 2}), ?assertEqual(3, prometheus_counter:value(Counter, [?HOST_TYPE])), - ?assertEqual(HistogramValue, prometheus_histogram:value(Histogram, [?HOST_TYPE])), + ?assertEqual(HistogramValue, prometheus_quantile_summary:value(Histogram, [?HOST_TYPE])), %% No update ok = mongoose_instrument:execute(Event, ?LABELS, #{something => irrelevant}), ?assertEqual(3, prometheus_counter:value(Counter, [?HOST_TYPE])), - ?assertEqual(HistogramValue, prometheus_histogram:value(Histogram, [?HOST_TYPE])). + ?assertEqual(HistogramValue, prometheus_quantile_summary:value(Histogram, [?HOST_TYPE])). exometer_skips_non_metric_event(Config) -> Event = ?config(event, Config), @@ -386,7 +425,7 @@ prometheus_and_exometer_metrics_are_updated(Config) -> ?assertEqual({ok, [{count, 1}]}, exometer:get_value([?HOST_TYPE, Event, count], count)), ?assertEqual({ok, [{mean, 2}]}, exometer:get_value([?HOST_TYPE, Event, time], mean)), ?assertEqual(1, prometheus_counter:value(prom_name(Event, count), [?HOST_TYPE])), - ?assertMatch({[0, 1|_], 2}, prometheus_histogram:value(prom_name(Event, time), [?HOST_TYPE])). + ?assertMatch({1, 2, _}, prometheus_quantile_summary:value(prom_name(Event, time), [?HOST_TYPE])). %% Helpers diff --git a/test/prometheus_endpoint_SUITE.erl b/test/prometheus_endpoint_SUITE.erl index 20bbebcf99..b063481e1e 100644 --- a/test/prometheus_endpoint_SUITE.erl +++ b/test/prometheus_endpoint_SUITE.erl @@ -54,7 +54,7 @@ test_metrics(Event, Labels) -> check_counter(Event, requests, Labels, 1, Scraped), % 'spiral' is a Prometheus counter check_gauge(Event, sessions, Labels, 5, Scraped), % 'counter' is a Prometheus gauge check_gauge(Event, seconds, Labels, 10, Scraped), - check_histogram(Event, time, Labels, #{count => 1, sum => 2, bucket_num => 32}, Scraped). + check_histogram(Event, time, Labels, #{count => 1, sum => 2}, Scraped). %% Checks for the parsed metrics @@ -71,38 +71,14 @@ check_gauge(Event, Metric, Labels, ExpValue, Scraped) -> ?assertEqual({Labels, ExpValue}, Value). check_histogram(Event, Metric, Labels, ExpValues, Scraped) -> - #{count := ExpCount, sum := ExpSum, bucket_num := ExpBucketNum} = ExpValues, - [Type, Help] = get_metric([Event, Metric], Scraped), - ?assertEqual({<<"TYPE">>, <<"histogram">>}, Type), + #{count := ExpCount, sum := ExpSum} = ExpValues, + [Type, Help | _] = get_metric([Event, Metric], Scraped), + ?assertEqual({<<"TYPE">>, <<"summary">>}, Type), ?assertEqual({<<"HELP">>, help(Event, Metric)}, Help), [Count] = get_metric([Event, Metric, count], Scraped), ?assertEqual({Labels, ExpCount}, Count), [Sum] = get_metric([Event, Metric, sum], Scraped), - ?assertEqual({Labels, ExpSum}, Sum), - Buckets = get_metric([Event, Metric, bucket], Scraped), - ?assertEqual(ExpBucketNum, length(Buckets)), - check_buckets(ExpCount, Labels, Buckets). - -%% Check that the histogram buckets have growing thresholds and counts, -%% and that the last bucket has the expected total count (because they are cumulative). -check_buckets(ExpCount, Labels, Buckets) -> - InitState = #{labels => Labels, last_count => 0, last_threshold => 0}, - #{final_count := LastCount} = lists:foldl(fun check_bucket/2, InitState, Buckets), - ?assertEqual(ExpCount, LastCount). - -check_bucket({Labels, Count}, State) -> - #{labels := BaseLabels, last_count := LastCount, last_threshold := LastThreshold} = State, - {ThresholdBin, Labels1} = maps:take(le, Labels), - ?assertEqual(Labels1, BaseLabels), - ?assert(Count >= LastCount), - case ThresholdBin of - <<"+Inf">> -> - #{final_count => Count}; - _ -> - Threshold = binary_to_integer(ThresholdBin), - ?assert(Threshold > LastThreshold), - State#{last_count => Count, last_threshold => Threshold} - end. + ?assertEqual({Labels, ExpSum}, Sum). help(Event, Metric) -> <<"Event: ", (atom_to_binary(Event))/binary, ", Metric: ", (atom_to_binary(Metric))/binary>>.