Skip to content

Commit e328fea

Browse files
authored
Merge pull request #181 from prometheus-erl/maps_and_proplists
Accept specs as maps as well as proplists. This also allows to define types for them.
2 parents 93621cd + b05f4e1 commit e328fea

6 files changed

Lines changed: 74 additions & 13 deletions

rebar.config

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
{erl_opts, [nowarn_missing_spec]},
4444
{eunit_compile_opts, [{src_dirs, ["src", "test/eunit"]}]},
4545
{covertool, [{coverdata_files, ["ct.coverdata"]}]},
46+
{cover_opts, [verbose, {min_coverage, 95}]},
4647
{cover_enabled, true},
4748
{cover_export_enabled, true},
4849
{cover_excl_mods, [prometheus_model, prometheus]}

src/prometheus_metric.erl

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,17 @@ as well as handling metric labels and data.
6464
-type labels() :: [name()].
6565

6666
?DOC("Metric specification type").
67-
-type spec() :: proplists:proplist().
67+
-type spec() ::
68+
proplists:proplist()
69+
| #{
70+
name := name(),
71+
help := help(),
72+
registry => prometheus_registry:registry(),
73+
constant_labels => [{atom(), term()}],
74+
labels => labels(),
75+
data => any(),
76+
atom() => _
77+
}.
6878

6979
?DOC("Inserts a new metric function into the table, fails if it already exists.").
7080
-callback new(Spec :: spec()) -> ok.

src/prometheus_metric_spec.erl

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
?MODULEDOC(false).
1111

1212
-export([
13+
add_value/3,
1314
get_value/2,
1415
get_value/3,
1516
fetch_value/2,
@@ -112,6 +113,14 @@ extract_common_params(Spec) ->
112113
DurationUnit = duration_unit(Spec),
113114
{Registry, Name, Labels, Help, CallTimeout, DurationUnit, Data}.
114115

116+
?DOC(false).
117+
?DOC(#{equiv => get_value(Key, Spec, undefined)}).
118+
-spec add_value(Key :: atom(), Value :: any(), Spec :: prometheus_metric:spec()) -> any().
119+
add_value(Key, Value, Spec) when is_list(Spec) ->
120+
[{Key, Value} | Spec];
121+
add_value(Key, Value, Spec) when is_map(Spec) ->
122+
Spec#{Key => Value}.
123+
115124
?DOC(false).
116125
?DOC(#{equiv => get_value(Key, Spec, undefined)}).
117126
-spec get_value(Key :: atom(), Spec :: prometheus_metric:spec()) -> any().
@@ -120,17 +129,26 @@ get_value(Key, Spec) ->
120129

121130
?DOC(false).
122131
-spec get_value(Key :: atom(), Spec :: prometheus_metric:spec(), Default :: any()) -> any().
123-
get_value(Key, Spec, Default) ->
124-
proplists:get_value(Key, Spec, Default).
132+
get_value(Key, Spec, Default) when is_list(Spec) ->
133+
proplists:get_value(Key, Spec, Default);
134+
get_value(Key, Spec, Default) when is_map(Spec) ->
135+
maps:get(Key, Spec, Default).
125136

126137
?DOC(false).
127138
-spec fetch_value(Key :: atom(), Spec :: prometheus_metric:spec()) -> any() | no_return().
128-
fetch_value(Key, Spec) ->
139+
fetch_value(Key, Spec) when is_list(Spec) ->
129140
case proplists:get_value(Key, Spec) of
130141
undefined ->
131142
erlang:error({missing_metric_spec_key, Key, Spec});
132143
Value ->
133144
Value
145+
end;
146+
fetch_value(Key, Spec) ->
147+
case maps:get(Key, Spec, undefined) of
148+
undefined ->
149+
erlang:error({missing_metric_spec_key, Key, Spec});
150+
Value ->
151+
Value
134152
end.
135153

136154
%%====================================================================

src/prometheus_sup.erl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ maybe_create_table(Name, Options) ->
7878
declare_metric({Metric, Spec}) ->
7979
declare_metric(Metric, Spec);
8080
declare_metric({Registry, Metric, Spec}) ->
81-
declare_metric(Metric, [{registry, Registry}] ++ Spec).
81+
declare_metric(Metric, prometheus_metric_spec:add_value(registry, Registry, Spec)).
8282

8383
declare_metric(counter, Spec) ->
8484
prometheus_counter:declare(Spec);

test/eunit/prometheus_default_metrics_tests.erl

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,16 @@ default_metric_test() ->
1616
{help, ""},
1717
{buckets, [1, 2, 3]}
1818
],
19+
Spec2 = #{
20+
name => Name,
21+
help => "",
22+
labels => [a, b]
23+
},
24+
Spec3 = #{
25+
name => Name,
26+
help => "",
27+
some_other_value => [1, 2, 3]
28+
},
1929

2030
application:stop(prometheus),
2131
application:set_env(
@@ -25,6 +35,9 @@ default_metric_test() ->
2535
{counter, Spec},
2636
{gauge, Spec},
2737
{qwe, summary, Spec1},
38+
{summary, Spec2},
39+
{summary, Spec3},
40+
{with_maps, summary, Spec3},
2841
{prometheus_histogram, Spec},
2942
{boolean, Spec}
3043
]
@@ -36,5 +49,6 @@ default_metric_test() ->
3649
?assertEqual(false, prometheus_histogram:declare(Spec)),
3750
?assertEqual(false, prometheus_boolean:declare(Spec))
3851
after
52+
application:stop(prometheus),
3953
application:unset_env(prometheus, default_metrics)
4054
end.

test/eunit/prometheus_metric_spec_tests.erl

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,28 +3,46 @@
33
-include_lib("eunit/include/eunit.hrl").
44

55
get_value_test() ->
6-
Spec = [{name, "qwe"}],
6+
Spec1 = [{name, "qwe"}],
7+
Spec2 = #{name => "qwe"},
78

89
?assertMatch(
910
undefined,
10-
prometheus_metric_spec:get_value(labels, Spec)
11+
prometheus_metric_spec:get_value(labels, Spec1)
1112
),
1213
?assertMatch(
1314
[default],
14-
prometheus_metric_spec:get_value(labels, Spec, [default])
15+
prometheus_metric_spec:get_value(labels, Spec1, [default])
1516
),
1617

17-
?assertEqual("qwe", prometheus_metric_spec:get_value(name, Spec)).
18+
?assertMatch(
19+
undefined,
20+
prometheus_metric_spec:get_value(labels, Spec2)
21+
),
22+
?assertMatch(
23+
[default],
24+
prometheus_metric_spec:get_value(labels, Spec2, [default])
25+
),
26+
27+
?assertEqual("qwe", prometheus_metric_spec:get_value(name, Spec1)),
28+
?assertEqual("qwe", prometheus_metric_spec:get_value(name, Spec2)).
1829

1930
fetch_value_test() ->
20-
Spec = [{name, "qwe"}],
31+
Spec1 = [{name, "qwe"}],
32+
Spec2 = #{name => "qwe"},
33+
34+
?assertError(
35+
{missing_metric_spec_key, labels, Spec1},
36+
prometheus_metric_spec:fetch_value(labels, Spec1)
37+
),
2138

2239
?assertError(
23-
{missing_metric_spec_key, labels, Spec},
24-
prometheus_metric_spec:fetch_value(labels, Spec)
40+
{missing_metric_spec_key, labels, Spec2},
41+
prometheus_metric_spec:fetch_value(labels, Spec2)
2542
),
2643

27-
?assertEqual("qwe", prometheus_metric_spec:fetch_value(name, Spec)).
44+
?assertEqual("qwe", prometheus_metric_spec:fetch_value(name, Spec1)),
45+
?assertEqual("qwe", prometheus_metric_spec:fetch_value(name, Spec2)).
2846

2947
validate_metric_name_test() ->
3048
?assertError(

0 commit comments

Comments
 (0)