feat(prom): support configuring job_name for pushing mode
This commit is contained in:
parent
50b7ac6a22
commit
b1292d6d4f
|
@ -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 {
|
||||
desc {
|
||||
en: """Turn Prometheus data pushing on or off"""
|
||||
|
|
|
@ -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) ->
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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(),
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Reference in New Issue