feat: add build info and vm specs to telemetry
This commit is contained in:
parent
5b49f3eee8
commit
e8682a1107
|
@ -51,6 +51,9 @@
|
||||||
|
|
||||||
-export([official_version/1]).
|
-export([official_version/1]).
|
||||||
|
|
||||||
|
%% internal export
|
||||||
|
-export([read_raw_build_info/0]).
|
||||||
|
|
||||||
-ifdef(TEST).
|
-ifdef(TEST).
|
||||||
-compile(export_all).
|
-compile(export_all).
|
||||||
-compile(nowarn_export_all).
|
-compile(nowarn_export_all).
|
||||||
|
@ -295,7 +298,9 @@ get_telemetry(#state{uuid = UUID}) ->
|
||||||
{active_plugins, active_plugins()},
|
{active_plugins, active_plugins()},
|
||||||
{num_clients, num_clients()},
|
{num_clients, num_clients()},
|
||||||
{messages_received, messages_received()},
|
{messages_received, messages_received()},
|
||||||
{messages_sent, messages_sent()}].
|
{messages_sent, messages_sent()},
|
||||||
|
{build_info, build_info()},
|
||||||
|
{vm_specs, vm_specs()}].
|
||||||
|
|
||||||
report_telemetry(State = #state{url = URL}) ->
|
report_telemetry(State = #state{url = URL}) ->
|
||||||
Data = get_telemetry(State),
|
Data = get_telemetry(State),
|
||||||
|
@ -324,6 +329,27 @@ parse_os_release(FileContent) ->
|
||||||
end,
|
end,
|
||||||
[], string:tokens(binary:bin_to_list(FileContent), "\n")).
|
[], string:tokens(binary:bin_to_list(FileContent), "\n")).
|
||||||
|
|
||||||
|
build_info() ->
|
||||||
|
case ?MODULE:read_raw_build_info() of
|
||||||
|
{ok, BuildInfo} ->
|
||||||
|
%% running on EMQX release
|
||||||
|
{ok, Fields} = hocon:binary(BuildInfo),
|
||||||
|
Fields;
|
||||||
|
_ ->
|
||||||
|
#{}
|
||||||
|
end.
|
||||||
|
|
||||||
|
read_raw_build_info() ->
|
||||||
|
Filename = filename:join([code:root_dir(), "releases",
|
||||||
|
emqx_app:get_release(), "BUILD_INFO"]),
|
||||||
|
file:read_file(Filename).
|
||||||
|
|
||||||
|
vm_specs() ->
|
||||||
|
SysMemData = memsup:get_system_memory_data(),
|
||||||
|
[ {num_cpus, erlang:system_info(logical_processors)}
|
||||||
|
, {total_memory, proplists:get_value(available_memory, SysMemData)}
|
||||||
|
].
|
||||||
|
|
||||||
bin(L) when is_list(L) ->
|
bin(L) when is_list(L) ->
|
||||||
list_to_binary(L);
|
list_to_binary(L);
|
||||||
bin(A) when is_atom(A) ->
|
bin(A) when is_atom(A) ->
|
||||||
|
|
|
@ -28,14 +28,53 @@
|
||||||
all() -> emqx_common_test_helpers:all(?MODULE).
|
all() -> emqx_common_test_helpers:all(?MODULE).
|
||||||
|
|
||||||
init_per_suite(Config) ->
|
init_per_suite(Config) ->
|
||||||
ok = mria:start(),
|
snabbkaffe:fix_ct_logging(),
|
||||||
ok = emqx_telemetry:mnesia(boot),
|
|
||||||
emqx_common_test_helpers:start_apps([emqx_modules]),
|
emqx_common_test_helpers:start_apps([emqx_modules]),
|
||||||
Config.
|
Config.
|
||||||
|
|
||||||
end_per_suite(_Config) ->
|
end_per_suite(_Config) ->
|
||||||
emqx_common_test_helpers:stop_apps([emqx_modules]).
|
emqx_common_test_helpers:stop_apps([emqx_modules]).
|
||||||
|
|
||||||
|
init_per_testcase(t_get_telemetry, Config) ->
|
||||||
|
DataDir = ?config(data_dir, Config),
|
||||||
|
TestPID = self(),
|
||||||
|
ok = meck:new(httpc, [non_strict, passthrough, no_history, no_link]),
|
||||||
|
ok = meck:expect(httpc, request, fun(Method, URL, Headers, Body) ->
|
||||||
|
TestPID ! {request, Method, URL, Headers, Body}
|
||||||
|
end),
|
||||||
|
ok = meck:new(emqx_telemetry, [non_strict, passthrough, no_history, no_link]),
|
||||||
|
ok = meck:expect(emqx_telemetry, read_raw_build_info,
|
||||||
|
fun() ->
|
||||||
|
{ok, Path} = file:read_link(filename:join([DataDir, "BUILD_INFO"])),
|
||||||
|
{ok, Template} = file:read_file(Path),
|
||||||
|
Vars0 = [ {build_info_arch, "arch"}
|
||||||
|
, {build_info_wordsize, "64"}
|
||||||
|
, {build_info_os, "os"}
|
||||||
|
, {build_info_erlang, "erlang"}
|
||||||
|
, {build_info_elixir, "elixir"}
|
||||||
|
, {build_info_relform, "relform"}
|
||||||
|
],
|
||||||
|
Vars = [{atom_to_list(K), iolist_to_binary(V)}
|
||||||
|
|| {K, V} <- Vars0],
|
||||||
|
Rendered = bbmustache:render(Template, Vars),
|
||||||
|
{ok, Rendered}
|
||||||
|
end),
|
||||||
|
Config;
|
||||||
|
init_per_testcase(_Testcase, Config) ->
|
||||||
|
TestPID = self(),
|
||||||
|
ok = meck:new(httpc, [non_strict, passthrough, no_history, no_link]),
|
||||||
|
ok = meck:expect(httpc, request, fun(Method, URL, Headers, Body) ->
|
||||||
|
TestPID ! {request, Method, URL, Headers, Body}
|
||||||
|
end),
|
||||||
|
Config.
|
||||||
|
|
||||||
|
end_per_testcase(t_get_telemetry, _Config) ->
|
||||||
|
meck:unload([httpc, emqx_telemetry]),
|
||||||
|
ok;
|
||||||
|
end_per_testcase(_Testcase, _Config) ->
|
||||||
|
meck:unload([httpc]),
|
||||||
|
ok.
|
||||||
|
|
||||||
t_uuid(_) ->
|
t_uuid(_) ->
|
||||||
UUID = emqx_telemetry:generate_uuid(),
|
UUID = emqx_telemetry:generate_uuid(),
|
||||||
Parts = binary:split(UUID, <<"-">>, [global, trim]),
|
Parts = binary:split(UUID, <<"-">>, [global, trim]),
|
||||||
|
@ -65,13 +104,29 @@ t_official_version(_) ->
|
||||||
true = emqx_telemetry:official_version("1.1-rc.1"),
|
true = emqx_telemetry:official_version("1.1-rc.1"),
|
||||||
false = emqx_telemetry:official_version("1.1-alpha.a").
|
false = emqx_telemetry:official_version("1.1-alpha.a").
|
||||||
|
|
||||||
t_get_telemetry(_) ->
|
t_get_telemetry(_Config) ->
|
||||||
{ok, TelemetryData} = emqx_telemetry:get_telemetry(),
|
{ok, TelemetryData} = emqx_telemetry:get_telemetry(),
|
||||||
OTPVersion = bin(erlang:system_info(otp_release)),
|
OTPVersion = bin(erlang:system_info(otp_release)),
|
||||||
?assertEqual(OTPVersion, get_value(otp_version, TelemetryData)),
|
?assertEqual(OTPVersion, get_value(otp_version, TelemetryData)),
|
||||||
{ok, UUID} = emqx_telemetry:get_uuid(),
|
{ok, UUID} = emqx_telemetry:get_uuid(),
|
||||||
?assertEqual(UUID, get_value(uuid, TelemetryData)),
|
?assertEqual(UUID, get_value(uuid, TelemetryData)),
|
||||||
?assertEqual(0, get_value(num_clients, TelemetryData)).
|
?assertEqual(0, get_value(num_clients, TelemetryData)),
|
||||||
|
BuildInfo = get_value(build_info, TelemetryData),
|
||||||
|
?assertMatch(
|
||||||
|
#{ <<"arch">> := <<_/binary>>
|
||||||
|
, <<"elixir">> := <<_/binary>>
|
||||||
|
, <<"erlang">> := <<_/binary>>
|
||||||
|
, <<"os">> := <<_/binary>>
|
||||||
|
, <<"relform">> := <<_/binary>>
|
||||||
|
, <<"wordsize">> := Wordsize
|
||||||
|
} when is_integer(Wordsize),
|
||||||
|
BuildInfo),
|
||||||
|
VMSpecs = get_value(vm_specs, TelemetryData),
|
||||||
|
?assert(is_integer(get_value(num_cpus, VMSpecs))),
|
||||||
|
?assert(0 =< get_value(num_cpus, VMSpecs)),
|
||||||
|
?assert(is_integer(get_value(total_memory, VMSpecs))),
|
||||||
|
?assert(0 =< get_value(total_memory, VMSpecs)),
|
||||||
|
ok.
|
||||||
|
|
||||||
t_enable(_) ->
|
t_enable(_) ->
|
||||||
ok = meck:new(emqx_telemetry, [non_strict, passthrough, no_history, no_link]),
|
ok = meck:new(emqx_telemetry, [non_strict, passthrough, no_history, no_link]),
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
../../../../rel/BUILD_INFO
|
Loading…
Reference in New Issue