diff --git a/apps/emqx_prometheus/i18n/emqx_prometheus_schema_i18n.conf b/apps/emqx_prometheus/i18n/emqx_prometheus_schema_i18n.conf
index 391637570..f25e35219 100644
--- a/apps/emqx_prometheus/i18n/emqx_prometheus_schema_i18n.conf
+++ b/apps/emqx_prometheus/i18n/emqx_prometheus_schema_i18n.conf
@@ -34,6 +34,25 @@ For example, { Authorization = "some-authz-tokens"}
"""
}
}
+ job_name {
+ desc {
+ en: """Job Name that is pushed to the Push Gateway. Available variables:
+- ${name}: Name of EMQX node.
+- ${host}: Host name of EMQX node.
+For example, when the EMQX node name is emqx@127.0.0.1
then the name
variable takes value emqx
and the host
variable takes value 127.0.0.1
.
+
+Default value is: ${name}/instance/${name}~${host}
+"""
+ zh: """推送到 Push Gateway 的 Job 名称。可用变量为:
+- ${name}: EMQX 节点的名称。
+- ${host}: EMQX 节点主机名。
+
+例如,当 EMQX 节点名为 emqx@127.0.0.1
则 name 变量的值为 emqx
,host 变量的值为 127.0.0.1
。
+
+默认值为: ${name}/instance/${name}~${host}
"""
+ }
+ }
+
enable {
desc {
en: """Turn Prometheus data pushing on or off"""
diff --git a/apps/emqx_prometheus/src/emqx_prometheus.erl b/apps/emqx_prometheus/src/emqx_prometheus.erl
index 623ae43f0..91c1f22fc 100644
--- a/apps/emqx_prometheus/src/emqx_prometheus.erl
+++ b/apps/emqx_prometheus/src/emqx_prometheus.erl
@@ -101,9 +101,10 @@ handle_info({timeout, Timer, ?TIMER_MSG}, State = #{timer := Timer}) ->
#{
interval := Interval,
headers := Headers,
+ job_name := JobName,
push_gateway_server := Server
} = opts(),
- PushRes = push_to_push_gateway(Server, Headers),
+ PushRes = push_to_push_gateway(Server, Headers, JobName),
NewTimer = ensure_timer(Interval),
NewState = maps:update_with(PushRes, fun(C) -> C + 1 end, 1, State#{timer => NewTimer}),
%% Data is too big, hibernate for saving memory and stop system monitor warning.
@@ -111,9 +112,17 @@ handle_info({timeout, Timer, ?TIMER_MSG}, State = #{timer := Timer}) ->
handle_info(_Msg, State) ->
{noreply, State}.
-push_to_push_gateway(Uri, Headers0) when is_map(Headers0) ->
+push_to_push_gateway(Uri, Headers0, JobName) when is_map(Headers0) ->
[Name, Ip] = string:tokens(atom_to_list(node()), "@"),
- Url = lists:concat([Uri, "/metrics/job/", Name, "/instance/", Name, "~", Ip]),
+ JobName1 = emqx_placeholder:preproc_tmpl(JobName),
+ JobName2 = binary_to_list(
+ emqx_placeholder:proc_tmpl(
+ JobName1,
+ #{<<"name">> => Name, <<"host">> => Ip}
+ )
+ ),
+
+ Url = lists:concat([Uri, "/metrics/job/", JobName2]),
Data = prometheus_text_format:format(),
Headers = maps:fold(
fun(K, V, Acc) ->
diff --git a/apps/emqx_prometheus/src/emqx_prometheus_api.erl b/apps/emqx_prometheus/src/emqx_prometheus_api.erl
index 1acdf99a7..945c6eba9 100644
--- a/apps/emqx_prometheus/src/emqx_prometheus_api.erl
+++ b/apps/emqx_prometheus/src/emqx_prometheus_api.erl
@@ -122,6 +122,7 @@ prometheus_config_example() ->
interval => "15s",
push_gateway_server => <<"http://127.0.0.1:9091">>,
headers => #{'header-name' => 'header-value'},
+ job_name => <<"${name}/instance/${name}~${host}">>,
vm_dist_collector => enabled,
mnesia_collector => enabled,
vm_statistics_collector => enabled,
diff --git a/apps/emqx_prometheus/src/emqx_prometheus_schema.erl b/apps/emqx_prometheus/src/emqx_prometheus_schema.erl
index 40b9ed6a1..da65e02c4 100644
--- a/apps/emqx_prometheus/src/emqx_prometheus_schema.erl
+++ b/apps/emqx_prometheus/src/emqx_prometheus_schema.erl
@@ -61,6 +61,16 @@ fields("prometheus") ->
desc => ?DESC(headers)
}
)},
+ {job_name,
+ ?HOCON(
+ binary(),
+ #{
+ default => <<"${name}/instance/${name}~${host}">>,
+ required => true,
+ desc => ?DESC(job_name)
+ }
+ )},
+
{enable,
?HOCON(
boolean(),
diff --git a/apps/emqx_prometheus/test/emqx_prometheus_SUITE.erl b/apps/emqx_prometheus/test/emqx_prometheus_SUITE.erl
index effdfc914..77d9902a2 100644
--- a/apps/emqx_prometheus/test/emqx_prometheus_SUITE.erl
+++ b/apps/emqx_prometheus/test/emqx_prometheus_SUITE.erl
@@ -28,6 +28,7 @@
" push_gateway_server = \"http://127.0.0.1:9091\"\n"
" interval = \"1s\"\n"
" headers = { Authorization = \"some-authz-tokens\"}\n"
+ " job_name = \"${name}~${host}\"\n"
" enable = true\n"
" vm_dist_collector = enabled\n"
" mnesia_collector = enabled\n"
@@ -91,7 +92,7 @@ t_assert_push(_) ->
Self = self(),
AssertPush = fun(Method, Req = {Url, Headers, ContentType, _Data}, HttpOpts, Opts) ->
?assertEqual(post, Method),
- ?assertMatch("http://127.0.0.1:9091/metrics/job/" ++ _, Url),
+ ?assertMatch("http://127.0.0.1:9091/metrics/job/test~127.0.0.1", Url),
?assertEqual([{"Authorization", "some-authz-tokens"}], Headers),
?assertEqual("text/plain", ContentType),
Self ! pass,