diff --git a/include/gmt_elog.hrl b/include/gmt_elog.hrl index f9212ca..7d30104 100644 --- a/include/gmt_elog.hrl +++ b/include/gmt_elog.hrl @@ -27,45 +27,45 @@ -define(ELOG_EMERGENCY(Msg), begin lager:emergency(Msg), - gmt_elog_policy:enabled(emergency, undefined, ?MODULE, ?LINE, Msg, []) + gmt_elog_policy:dtrace(emergency, undefined, ?MODULE, ?LINE, Msg, []) end). -define(ELOG_ALERT(Msg), begin lager:alert(Msg), - gmt_elog_policy:enabled(alert, undefined, ?MODULE, ?LINE, Msg, []) + gmt_elog_policy:dtrace(alert, undefined, ?MODULE, ?LINE, Msg, []) end). -define(ELOG_CRITICAL(Msg), begin lager:critical(Msg), - gmt_elog_policy:enabled(critical, undefined, ?MODULE, ?LINE, Msg, []) + gmt_elog_policy:dtrace(critical, undefined, ?MODULE, ?LINE, Msg, []) end). -define(ELOG_ERROR(Msg), begin lager:error(Msg), - gmt_elog_policy:enabled(error, undefined, ?MODULE, ?LINE, Msg, []) + gmt_elog_policy:dtrace(error, undefined, ?MODULE, ?LINE, Msg, []) end). -define(ELOG_WARNING(Msg), begin lager:warning(Msg), - gmt_elog_policy:enabled(warning, undefined, ?MODULE, ?LINE, Msg, []) + gmt_elog_policy:dtrace(warning, undefined, ?MODULE, ?LINE, Msg, []) end). -define(ELOG_NOTICE(Msg), begin lager:notice(Msg), - gmt_elog_policy:enabled(notice, undefined, ?MODULE, ?LINE, Msg, []) + gmt_elog_policy:dtrace(notice, undefined, ?MODULE, ?LINE, Msg, []) end). -define(ELOG_INFO(Msg), begin lager:info(Msg), - gmt_elog_policy:enabled(info, undefined, ?MODULE, ?LINE, Msg, []) + gmt_elog_policy:dtrace(info, undefined, ?MODULE, ?LINE, Msg, []) end). -define(ELOG_DEBUG(Msg), begin lager:debug(Msg), - gmt_elog_policy:enabled(debug, undefined, ?MODULE, ?LINE, Msg, []) + gmt_elog_policy:dtrace(debug, undefined, ?MODULE, ?LINE, Msg, []) end). -define(ELOG_TRACE(Msg), - gmt_elog_policy:enabled(trace, undefined, ?MODULE, ?LINE, Msg, [])). + gmt_elog_policy:dtrace(trace, undefined, ?MODULE, ?LINE, Msg, [])). %% %% Events with a format and args @@ -74,45 +74,45 @@ -define(ELOG_EMERGENCY(Fmt, Args), begin lager:emergency(Fmt, Args), - gmt_elog_policy:enabled(emergency, undefined, ?MODULE, ?LINE, Fmt, Args) + gmt_elog_policy:dtrace(emergency, undefined, ?MODULE, ?LINE, Fmt, Args) end). -define(ELOG_ALERT(Fmt, Args), begin lager:alert(Fmt, Args), - gmt_elog_policy:enabled(alert, undefined, ?MODULE, ?LINE, Fmt, Args) + gmt_elog_policy:dtrace(alert, undefined, ?MODULE, ?LINE, Fmt, Args) end). -define(ELOG_CRITICAL(Fmt, Args), begin lager:critical(Fmt, Args), - gmt_elog_policy:enabled(critical, undefined, ?MODULE, ?LINE, Fmt, Args) + gmt_elog_policy:dtrace(critical, undefined, ?MODULE, ?LINE, Fmt, Args) end). -define(ELOG_ERROR(Fmt, Args), begin lager:error(Fmt, Args), - gmt_elog_policy:enabled(error, undefined, ?MODULE, ?LINE, Fmt, Args) + gmt_elog_policy:dtrace(error, undefined, ?MODULE, ?LINE, Fmt, Args) end). -define(ELOG_WARNING(Fmt, Args), begin lager:warning(Fmt, Args), - gmt_elog_policy:enabled(warning, undefined, ?MODULE, ?LINE, Fmt, Args) + gmt_elog_policy:dtrace(warning, undefined, ?MODULE, ?LINE, Fmt, Args) end). -define(ELOG_NOTICE(Fmt, Args), begin lager:notice(Fmt, Args), - gmt_elog_policy:enabled(notice, undefined, ?MODULE, ?LINE, Fmt, Args) + gmt_elog_policy:dtrace(notice, undefined, ?MODULE, ?LINE, Fmt, Args) end). -define(ELOG_INFO(Fmt, Args), begin lager:info(Fmt, Args), - gmt_elog_policy:enabled(info, undefined, ?MODULE, ?LINE, Fmt, Args) + gmt_elog_policy:dtrace(info, undefined, ?MODULE, ?LINE, Fmt, Args) end). -define(ELOG_DEBUG(Fmt, Args), begin lager:debug(Fmt, Args), - gmt_elog_policy:enabled(debug, undefined, ?MODULE, ?LINE, Fmt, Args) + gmt_elog_policy:dtrace(debug, undefined, ?MODULE, ?LINE, Fmt, Args) end). -define(ELOG_TRACE(Fmt, Args), - gmt_elog_policy:enabled(trace, undefined, ?MODULE, ?LINE, Fmt, Args)). + gmt_elog_policy:dtrace(trace, undefined, ?MODULE, ?LINE, Fmt, Args)). %% %% Events with a category, a format, and args @@ -121,44 +121,44 @@ -define(ELOG_EMERGENCY(Cat, Fmt, Args), begin lager:emergency(Fmt, Args), - gmt_elog_policy:enabled(emergency, Cat, ?MODULE, ?LINE, Fmt, Args) + gmt_elog_policy:dtrace(emergency, Cat, ?MODULE, ?LINE, Fmt, Args) end). -define(ELOG_ALERT(Cat, Fmt, Args), begin lager:alert(Fmt, Args), - gmt_elog_policy:enabled(alert, Cat, ?MODULE, ?LINE, Fmt, Args) + gmt_elog_policy:dtrace(alert, Cat, ?MODULE, ?LINE, Fmt, Args) end). -define(ELOG_CRITICAL(Cat, Fmt, Args), begin lager:critical(Fmt, Args), - gmt_elog_policy:enabled(critical, Cat, ?MODULE, ?LINE, Fmt, Args) + gmt_elog_policy:dtrace(critical, Cat, ?MODULE, ?LINE, Fmt, Args) end). -define(ELOG_ERROR(Cat, Fmt, Args), begin lager:error(Fmt, Args), - gmt_elog_policy:enabled(error, Cat, ?MODULE, ?LINE, Fmt, Args) + gmt_elog_policy:dtrace(error, Cat, ?MODULE, ?LINE, Fmt, Args) end). -define(ELOG_WARNING(Cat, Fmt, Args), begin lager:warning(Fmt, Args), - gmt_elog_policy:enabled(warning, Cat, ?MODULE, ?LINE, Fmt, Args) + gmt_elog_policy:dtrace(warning, Cat, ?MODULE, ?LINE, Fmt, Args) end). -define(ELOG_NOTICE(Cat, Fmt, Args), begin lager:notice(Fmt, Args), - gmt_elog_policy:enabled(notice, Cat, ?MODULE, ?LINE, Fmt, Args) + gmt_elog_policy:dtrace(notice, Cat, ?MODULE, ?LINE, Fmt, Args) end). -define(ELOG_INFO(Cat, Fmt, Args), begin lager:info(Fmt, Args), - gmt_elog_policy:enabled(info, Cat, ?MODULE, ?LINE, Fmt, Args) + gmt_elog_policy:dtrace(info, Cat, ?MODULE, ?LINE, Fmt, Args) end). -define(ELOG_DEBUG(Cat, Fmt, Args), begin lager:debug(Fmt, Args), - gmt_elog_policy:enabled(debug, Cat, ?MODULE, ?LINE, Fmt, Args) + gmt_elog_policy:dtrace(debug, Cat, ?MODULE, ?LINE, Fmt, Args) end). -define(ELOG_TRACE(Cat, Fmt, Args), - gmt_elog_policy:enabled(trace, Cat, ?MODULE, ?LINE, Fmt, Args)). + gmt_elog_policy:dtrace(trace, Cat, ?MODULE, ?LINE, Fmt, Args)). -endif. % -ifndef(gmt_elog_hrl). diff --git a/src/gmt_elog.erl b/src/gmt_elog.erl index cc9bc5a..aad78fb 100644 --- a/src/gmt_elog.erl +++ b/src/gmt_elog.erl @@ -99,14 +99,14 @@ add_match_spec() -> %%
  • add_match_spec(dbg:fun2ms(fun([_, target_category, target_module, _, _, _]) -> return_trace(); ([_, _, other_module, 88, _, _]) -> return_trace() end))
  • %% add_match_spec(MatchSpec) -> - dbg:tpl(gmt_elog_policy, enabled, MatchSpec), + dbg:tpl(gmt_elog_policy, dtrace, MatchSpec), ok. %% @doc Delete the tracing match spec from the tracing subsystem, keeping %% the trace file open for later tracing. -spec del_match_spec() -> ok. del_match_spec() -> - dbg:ctpl(gmt_elog_policy, enabled), + dbg:ctpl(gmt_elog_policy, dtrace), ok. -spec format_file(string()) -> ok. @@ -205,7 +205,7 @@ format_1(_TS, _Pri, _Cat, _Module, _Line, _Fmt, _ArgList) -> test_iter(_Priority, 0) -> ok; test_iter(Priority, N) -> - gmt_elog_policy:enabled(Priority, foo, ?MODULE, ?LINE, "Hello, ~s", ["world!"]), + gmt_elog_policy:dtrace(Priority, foo, ?MODULE, ?LINE, "Hello, ~s", ["world!"]), test_iter(Priority, N - 1). test_iter_e(_Priority, 0) -> diff --git a/src/gmt_elog_policy.erl b/src/gmt_elog_policy.erl index 0836dd4..c0dad80 100644 --- a/src/gmt_elog_policy.erl +++ b/src/gmt_elog_policy.erl @@ -40,7 +40,9 @@ -module(gmt_elog_policy). %% API --export([enabled/6]). +-export([dtrace/6, dtrace_support/0]). + +-define(DTRACE_SUPPORT, '**GMTUtil-DtraceSupport**'). %%%=================================================================== %%% API @@ -53,9 +55,49 @@ -type log_level() :: 'emergency' | 'alert' | 'critical' | 'error' | 'warning' | 'notice' | 'info' | 'debug'. --spec enabled(log_level(), term(), module(), integer(), string(), list()) - -> boolean(). - -enabled(_Level, _Category, _Module, _Line, _Fmt, _Args) -> - false. +-spec dtrace(log_level(), integer() | undefined, module(), integer(), string(), [term()]) -> + true | error | badarg. +dtrace(Level, Category, Module, Line, Fmt, Args) -> + case dtrace_support() of + unsupported -> + false; + _ -> + Level0 = erlang:atom_to_list(Level), + Category0 = if is_integer(Category) -> Category; + true -> 0 + end, + Module0 = erlang:atom_to_list(Module), + Message = if Args =:= [] -> Fmt; + true -> lists:flatten(io_lib:format(Fmt, Args)) + end, + dyntrace:p(Category0, Module0, Line, Level0, Message) + end. +-spec dtrace_support() -> dyntrace | disabled | unsupported. +dtrace_support() -> + case get(?DTRACE_SUPPORT) of + undefined -> + case application:get_env(gmt_util, dtrace_support) of + {ok, true} -> + case string:to_float(erlang:system_info(version)) of + {Num, _} when Num > 5.8 -> + %% R15B or higher + try dyntrace:available() of + true -> + put(?DTRACE_SUPPORT, dyntrace); + false -> + put(?DTRACE_SUPPORT, unsupported) + catch + _:_ -> + put(?DTRACE_SUPPORT, unsupported) + end; + _ -> + put(?DTRACE_SUPPORT, unsupported) + end; + _ -> + put(?DTRACE_SUPPORT, disabled) + end, + get(?DTRACE_SUPPORT); + DTraceSupport -> + DTraceSupport + end. diff --git a/src/gmt_util.app.src b/src/gmt_util.app.src index a3b46fb..75d7a1a 100644 --- a/src/gmt_util.app.src +++ b/src/gmt_util.app.src @@ -48,6 +48,7 @@ , {application_tx_log_formatter, undefined} , {application_tx_log_flush, 0} , {application_tx_log_path, "/dev/null"} + , {dtrace_support, true} , {sysmon_large_heap, 10485760} , {sysmon_long_gc, 50} , {sysmon_max_per_second, 20} diff --git a/src/gmt_util_sup.erl b/src/gmt_util_sup.erl index f490929..2ee3dd3 100644 --- a/src/gmt_util_sup.erl +++ b/src/gmt_util_sup.erl @@ -56,6 +56,18 @@ init([]) -> %% Child_spec = [Name, {M, F, A}, %% Restart, Shutdown_time, Type, Modules_used] + case gmt_elog_policy:dtrace_support() of + unsupported -> + lager:warning("dyntrace (DTrace/SystemTap) support is not available " + "in this Erlang VM. Please rebuild your Erlang/OTP with " + "'--with-dynamic-trace=' option to use this feature. " + "You can also disable this feature by setting " + "'dtrace_support' to 'false' in gmt_util section " + "of sys.config."); + _ -> + ok + end, + SysMonSrv = {gmt_sysmon_server, {gmt_sysmon_server, start_link, []}, permanent, 2000, worker, [gmt_sysmon_server]},