feat(prom): support configuring job_name for pushing mode

This commit is contained in:
JianBo He 2023-01-03 18:27:41 +08:00
parent 50b7ac6a22
commit b1292d6d4f
5 changed files with 44 additions and 4 deletions

View File

@ -34,6 +34,25 @@ For example, <code> { Authorization = "some-authz-tokens"}</code>"""
} }
} }
job_name {
desc {
en: """Job Name that is pushed to the Push Gateway. Available variables:<br/>
- ${name}: Name of EMQX node.<br/>
- ${host}: Host name of EMQX node.<br/>
For example, when the EMQX node name is <code>emqx@127.0.0.1</code> then the <code>name</code> variable takes value <code>emqx</code> and the <code>host</code> variable takes value <code>127.0.0.1</code>.<br/>
Default value is: <code>${name}/instance/${name}~${host}</code>
"""
zh: """推送到 Push Gateway 的 Job 名称。可用变量为:<br/>
- ${name}: EMQX 节点的名称。
- ${host}: EMQX 节点主机名。
例如,当 EMQX 节点名为 <code>emqx@127.0.0.1</code> 则 name 变量的值为 <code>emqx</code>host 变量的值为 <code>127.0.0.1</code>。<br/>
默认值为: <code>${name}/instance/${name}~${host}</code>"""
}
}
enable { enable {
desc { desc {
en: """Turn Prometheus data pushing on or off""" en: """Turn Prometheus data pushing on or off"""

View File

@ -101,9 +101,10 @@ handle_info({timeout, Timer, ?TIMER_MSG}, State = #{timer := Timer}) ->
#{ #{
interval := Interval, interval := Interval,
headers := Headers, headers := Headers,
job_name := JobName,
push_gateway_server := Server push_gateway_server := Server
} = opts(), } = opts(),
PushRes = push_to_push_gateway(Server, Headers), PushRes = push_to_push_gateway(Server, Headers, JobName),
NewTimer = ensure_timer(Interval), NewTimer = ensure_timer(Interval),
NewState = maps:update_with(PushRes, fun(C) -> C + 1 end, 1, State#{timer => NewTimer}), 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. %% 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) -> handle_info(_Msg, State) ->
{noreply, 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()), "@"), [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(), Data = prometheus_text_format:format(),
Headers = maps:fold( Headers = maps:fold(
fun(K, V, Acc) -> fun(K, V, Acc) ->

View File

@ -122,6 +122,7 @@ prometheus_config_example() ->
interval => "15s", interval => "15s",
push_gateway_server => <<"http://127.0.0.1:9091">>, push_gateway_server => <<"http://127.0.0.1:9091">>,
headers => #{'header-name' => 'header-value'}, headers => #{'header-name' => 'header-value'},
job_name => <<"${name}/instance/${name}~${host}">>,
vm_dist_collector => enabled, vm_dist_collector => enabled,
mnesia_collector => enabled, mnesia_collector => enabled,
vm_statistics_collector => enabled, vm_statistics_collector => enabled,

View File

@ -61,6 +61,16 @@ fields("prometheus") ->
desc => ?DESC(headers) desc => ?DESC(headers)
} }
)}, )},
{job_name,
?HOCON(
binary(),
#{
default => <<"${name}/instance/${name}~${host}">>,
required => true,
desc => ?DESC(job_name)
}
)},
{enable, {enable,
?HOCON( ?HOCON(
boolean(), boolean(),

View File

@ -28,6 +28,7 @@
" push_gateway_server = \"http://127.0.0.1:9091\"\n" " push_gateway_server = \"http://127.0.0.1:9091\"\n"
" interval = \"1s\"\n" " interval = \"1s\"\n"
" headers = { Authorization = \"some-authz-tokens\"}\n" " headers = { Authorization = \"some-authz-tokens\"}\n"
" job_name = \"${name}~${host}\"\n"
" enable = true\n" " enable = true\n"
" vm_dist_collector = enabled\n" " vm_dist_collector = enabled\n"
" mnesia_collector = enabled\n" " mnesia_collector = enabled\n"
@ -91,7 +92,7 @@ t_assert_push(_) ->
Self = self(), Self = self(),
AssertPush = fun(Method, Req = {Url, Headers, ContentType, _Data}, HttpOpts, Opts) -> AssertPush = fun(Method, Req = {Url, Headers, ContentType, _Data}, HttpOpts, Opts) ->
?assertEqual(post, Method), ?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([{"Authorization", "some-authz-tokens"}], Headers),
?assertEqual("text/plain", ContentType), ?assertEqual("text/plain", ContentType),
Self ! pass, Self ! pass,