diff --git a/apps/emqx_prometheus/src/emqx_prometheus_config.erl b/apps/emqx_prometheus/src/emqx_prometheus_config.erl index dccf28af0..66d53f2db 100644 --- a/apps/emqx_prometheus/src/emqx_prometheus_config.erl +++ b/apps/emqx_prometheus/src/emqx_prometheus_config.erl @@ -64,15 +64,12 @@ to_recommend_type(Conf) -> }. to_push_gateway(Conf) -> - Init = maps:with([<<"interval">>, <<"headers">>, <<"job_name">>], Conf), + Init = maps:with([<<"interval">>, <<"headers">>, <<"job_name">>, <<"enable">>], Conf), case maps:get(<<"push_gateway_server">>, Conf, "") of "" -> - Init#{<<"url">> => <<"">>}; + Init#{<<"enable">> => false}; Url -> - case maps:get(<<"enable">>, Conf, false) of - false -> Init#{<<"url">> => <<"">>}; - true -> Init#{<<"url">> => Url} - end + Init#{<<"url">> => Url} end. to_collectors(Conf) -> @@ -134,6 +131,9 @@ update_auth(_, _) -> conf() -> emqx_config:get(?PROMETHEUS). -is_push_gateway_server_enabled(#{enable := true, push_gateway_server := Url}) -> Url =/= ""; -is_push_gateway_server_enabled(#{push_gateway := #{url := Url}}) -> Url =/= ""; -is_push_gateway_server_enabled(_) -> false. +is_push_gateway_server_enabled(#{enable := true, push_gateway_server := Url}) -> + Url =/= ""; +is_push_gateway_server_enabled(#{push_gateway := #{url := Url, enable := Enable}}) -> + Enable andalso Url =/= ""; +is_push_gateway_server_enabled(_) -> + false. diff --git a/apps/emqx_prometheus/src/emqx_prometheus_schema.erl b/apps/emqx_prometheus/src/emqx_prometheus_schema.erl index 533b26c9f..7df5951f0 100644 --- a/apps/emqx_prometheus/src/emqx_prometheus_schema.erl +++ b/apps/emqx_prometheus/src/emqx_prometheus_schema.erl @@ -72,12 +72,21 @@ fields(recommend_setting) -> ]; fields(push_gateway) -> [ + {enable, + ?HOCON( + boolean(), + #{ + default => false, + required => true, + desc => ?DESC(push_gateway_enable) + } + )}, {url, ?HOCON( string(), #{ required => false, - default => <<"">>, + default => <<"http://127.0.0.1:9091">>, validator => fun ?MODULE:validate_url/1, desc => ?DESC(push_gateway_url) } @@ -197,7 +206,7 @@ fields(legacy_deprecated_setting) -> )}, {headers, ?HOCON( - list({string(), string()}), + typerefl:alias("map", list({string(), string()}), #{}, [string(), string()]), #{ default => #{}, required => false, @@ -214,7 +223,6 @@ fields(legacy_deprecated_setting) -> desc => ?DESC(legacy_job_name) } )}, - {enable, ?HOCON( boolean(), @@ -353,11 +361,6 @@ validate_url(Url) -> S =:= <<"http">> -> ok; - %% default is "" - #{path := []} -> - ok; - #{path := <<>>} -> - ok; _ -> {error, "Invalid url"} end. diff --git a/apps/emqx_prometheus/test/emqx_prometheus_SUITE.erl b/apps/emqx_prometheus/test/emqx_prometheus_SUITE.erl index 311233f1b..c50813938 100644 --- a/apps/emqx_prometheus/test/emqx_prometheus_SUITE.erl +++ b/apps/emqx_prometheus/test/emqx_prometheus_SUITE.erl @@ -53,6 +53,7 @@ }, <<"push_gateway">> => #{ + <<"enable">> => true, <<"headers">> => #{<<"Authorization">> => <<"some-authz-tokens">>}, <<"interval">> => <<"1s">>, <<"job_name">> => <<"${name}~${host}">>, diff --git a/apps/emqx_prometheus/test/emqx_prometheus_api_SUITE.erl b/apps/emqx_prometheus/test/emqx_prometheus_api_SUITE.erl index dc56841ad..ad2b3d5ec 100644 --- a/apps/emqx_prometheus/test/emqx_prometheus_api_SUITE.erl +++ b/apps/emqx_prometheus/test/emqx_prometheus_api_SUITE.erl @@ -180,11 +180,11 @@ t_prometheus_api(_) -> ), #{ <<"push_gateway">> := - #{<<"url">> := Url} = PushGateway, + #{<<"url">> := Url, <<"enable">> := Enable} = PushGateway, <<"collectors">> := Collector } = Conf, Pid = erlang:whereis(emqx_prometheus), - ?assertEqual(Url =/= "", undefined =/= Pid, {Url, Pid}), + ?assertEqual(Enable, undefined =/= Pid, {Url, Pid}), NewConf = Conf#{ <<"push_gateway">> => PushGateway#{ @@ -250,7 +250,7 @@ t_prometheus_api(_) -> emqx_config:get([prometheus]) ), - NewConf1 = Conf#{<<"push_gateway">> => PushGateway#{<<"url">> => <<"">>}}, + NewConf1 = Conf#{<<"push_gateway">> => PushGateway#{<<"enable">> => false}}, {ok, _Response3} = emqx_mgmt_api_test_util:request_api(put, Path, "", Auth, NewConf1), ?assertEqual(undefined, erlang:whereis(emqx_prometheus)), diff --git a/rel/config/examples/prometheus.conf.example b/rel/config/examples/prometheus.conf.example index 3b186e93f..049b11ee3 100644 --- a/rel/config/examples/prometheus.conf.example +++ b/rel/config/examples/prometheus.conf.example @@ -1,10 +1,24 @@ ## Prometheus ## EMQX's Prometheus scraping endpoint is enabled by default without authentication. -## And there is no way to turn it off. +## You can enable basic authentication by setting enable_basic_auth to true. ## You can inspect it with a curl command: curl -f "127.0.0.1:18083/api/v5/prometheus/stats" prometheus { - # turn off this expensive collector - vm_dist_collector = disabled + enable_basic_auth = false + push_gateway { + enable = false + url = "http://127.0.0.1:9091" + headers {Authorization = "Basic YWRtaW46Y2JraG55eWd5QDE="} + interval = 15s + job_name = "${name}/instance/${name}~${host}" + } + collectors { + mnesia = disabled + vm_dist = disabled + vm_memory = disabled + vm_msacc = disabled + vm_statistics = disabled + vm_system_info = enabled + } } diff --git a/rel/i18n/emqx_prometheus_schema.hocon b/rel/i18n/emqx_prometheus_schema.hocon index 57d6b8065..ef507b520 100644 --- a/rel/i18n/emqx_prometheus_schema.hocon +++ b/rel/i18n/emqx_prometheus_schema.hocon @@ -37,8 +37,9 @@ recommend_setting.desc: """Recommended setting""" push_gateway_url.desc: -"""URL of Pushgateway server. Pushgateway is optional, should not be configured if prometheus is to scrape EMQX. -Set url to "" to disable push gateway""" +"""URL of Pushgateway server. Pushgateway is optional, should not be configured if prometheus is to scrape EMQX.""" +push_gateway_enable.desc: +"""Enable or disable Pushgateway""" mnesia_collector.desc: """Collects Mnesia metrics mainly using mnesia:system_info/1 """ @@ -61,42 +62,42 @@ vm_system_info_collector.desc: """Enable or disable VM system info collector.""" legacy_deprecated_setting.desc: -"""Deprecated""" +"""Deprecated since 5.4.0""" legacy_enable.desc: -"""Deprecated, use `prometheus.push_gateway.url` instead""" +"""Deprecated since 5.4.0, use `prometheus.push_gateway.url` instead""" legacy_headers.desc: -"""Deprecated, use `prometheus.push_gateway.headers` instead""" +"""Deprecated since 5.4.0, use `prometheus.push_gateway.headers` instead""" legacy_interval.desc: -"""Deprecated, use `prometheus.push_gateway.interval` instead""" +"""Deprecated since 5.4.0, use `prometheus.push_gateway.interval` instead""" legacy_job_name.desc: -"""Deprecated, use `prometheus.push_gateway.job_name` instead""" +"""Deprecated since 5.4.0, use `prometheus.push_gateway.job_name` instead""" legacy_push_gateway_server.desc: -"""Deprecated, use `prometheus.push_gateway.url` instead""" +"""Deprecated since 5.4.0, use `prometheus.push_gateway.url` instead""" legacy_mnesia_collector.desc: -"""Deprecated, use `prometheus.collectors.mnesia` instead""" +"""Deprecated since 5.4.0, use `prometheus.collectors.mnesia` instead""" legacy_vm_dist_collector.desc: -"""Deprecated, use `prometheus.collectors.vm_dist` instead""" +"""Deprecated since 5.4.0, use `prometheus.collectors.vm_dist` instead""" legacy_vm_memory_collector.desc: -"""Deprecated, use `prometheus.collectors.vm_memory` instead""" +"""Deprecated since 5.4.0, use `prometheus.collectors.vm_memory` instead""" legacy_vm_msacc_collector.desc: -"""Deprecated, use `prometheus.collectors.vm_msacc` instead""" +"""Deprecated since 5.4.0, use `prometheus.collectors.vm_msacc` instead""" legacy_vm_statistics_collector.desc: -"""Deprecated, use `prometheus.collectors.vm_statistics` instead""" +"""Deprecated since 5.4.0, use `prometheus.collectors.vm_statistics` instead""" legacy_vm_system_info_collector.desc: """Deprecated, use `prometheus.collectors.vm_system_info` instead""" legacy_deprecated_setting.desc: -"""Deprecated""" +"""Deprecated since 5.4.0""" }