Skip to content

Commit

Permalink
hibari >> GH18 - Add DTrace tracepoints for Erlang/OTP R15 or later
Browse files Browse the repository at this point in the history
- Rename function gmt_elog_policy:enabled/6 to dtrace/6, and apply
  dyntrace:p/5 in there
- Add the global switch 'dtrace_support' to sys.config to enable/
  disable this feature
- Add gmt_elog_policy:dtrace_support/0, which returns 'dyntrace' |
  'disabled' | 'unsupported'
- Add a warning log for when 'dtrace_support' config is set to true
  but dynamic trace is not available in Erlang VM
  • Loading branch information
tatsuya6502 committed Mar 1, 2013
1 parent 476bbd2 commit 0731e2b
Show file tree
Hide file tree
Showing 5 changed files with 91 additions and 36 deletions.
54 changes: 27 additions & 27 deletions include/gmt_elog.hrl
Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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).
6 changes: 3 additions & 3 deletions src/gmt_elog.erl
Expand Up @@ -99,14 +99,14 @@ add_match_spec() ->
%% <li> <tt> add_match_spec(dbg:fun2ms(fun([_, target_category, target_module, _, _, _]) -> return_trace(); ([_, _, other_module, 88, _, _]) -> return_trace() end)) </tt> </li>
%% </ul>
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.
Expand Down Expand Up @@ -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) ->
Expand Down
54 changes: 48 additions & 6 deletions src/gmt_elog_policy.erl
Expand Up @@ -40,7 +40,9 @@
-module(gmt_elog_policy).

%% API
-export([enabled/6]).
-export([dtrace/6, dtrace_support/0]).

-define(DTRACE_SUPPORT, '**GMTUtil-DtraceSupport**').

%%%===================================================================
%%% API
Expand All @@ -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.
1 change: 1 addition & 0 deletions src/gmt_util.app.src
Expand Up @@ -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}
Expand Down
12 changes: 12 additions & 0 deletions src/gmt_util_sup.erl
Expand Up @@ -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]},
Expand Down

0 comments on commit 0731e2b

Please sign in to comment.