From: Peter Lemenkov <lemenkov@gmail.com>
Date: Thu, 27 Jan 2022 12:55:59 +0100
Subject: [PATCH] Bundle hut header
We're using hut.[eh]rl fetched from these links:
* https://raw.githubusercontent.com/tolbrino/hut/cd3e5b05c1efe6cd0351c435fbca1343702f1564/include/hut.hrl
* https://raw.githubusercontent.com/tolbrino/hut/cd3e5b05c1efe6cd0351c435fbca1343702f1564/src/hut.erl
Signed-off-by: Peter Lemenkov <lemenkov@gmail.com>
diff --git a/rebar.config b/rebar.config
index e2e8738..195c7b0 100644
--- a/rebar.config
+++ b/rebar.config
@@ -3,7 +3,6 @@
[
{parse_trans, "3.4.1"},
{folsom, "1.0.0"},
- {hut, "1.3.0"},
{setup, "2.1.0"}
]}.
diff --git a/src/exometer_admin.erl b/src/exometer_admin.erl
index 8cf62ea..ac63018 100644
--- a/src/exometer_admin.erl
+++ b/src/exometer_admin.erl
@@ -48,7 +48,7 @@
-export([monitor/2, monitor/3, demonitor/1]).
-compile({no_auto_import, [monitor/3]}).
--include_lib("hut/include/hut.hrl").
+-include("hut.hrl").
-include("exometer.hrl").
-record(st, {}).
diff --git a/src/exometer_core.app.src b/src/exometer_core.app.src
index d314559..afa8151 100644
--- a/src/exometer_core.app.src
+++ b/src/exometer_core.app.src
@@ -2,7 +2,7 @@
[{description,"Code instrumentation and metrics collection package."},
{vsn,git},
{registered,[]},
- {applications,[kernel,stdlib,hut,setup,folsom,parse_trans]},
+ {applications,[kernel,stdlib,setup,folsom,parse_trans]},
{included_applications,[]},
{mod,{exometer_core_app,[]}},
{start_phases,[{start_reporters,[]},{preset_defaults,[]}]},
diff --git a/src/exometer_folsom_monitor.erl b/src/exometer_folsom_monitor.erl
index 148616a..8535789 100644
--- a/src/exometer_folsom_monitor.erl
+++ b/src/exometer_folsom_monitor.erl
@@ -37,7 +37,7 @@
-record(st, {mon = orddict:new()}).
-include_lib("parse_trans/include/codegen.hrl").
--include_lib("hut/include/hut.hrl").
+-include("hut.hrl").
-include("exometer.hrl").
-type type() :: exometer:type().
diff --git a/src/exometer_report.erl b/src/exometer_report.erl
index 68c9a1e..63f4ed1 100644
--- a/src/exometer_report.erl
+++ b/src/exometer_report.erl
@@ -213,7 +213,7 @@
-export_type([metric/0, datapoint/0, interval/0, extra/0]).
--include_lib("hut/include/hut.hrl").
+-include("hut.hrl").
-include("exometer.hrl").
-define(SERVER, ?MODULE).
diff --git a/src/exometer_report_tty.erl b/src/exometer_report_tty.erl
index b08ae97..5cd88bf 100644
--- a/src/exometer_report_tty.erl
+++ b/src/exometer_report_tty.erl
@@ -40,7 +40,7 @@
exometer_terminate/2
]).
--include_lib("hut/include/hut.hrl").
+-include("hut.hrl").
-include("exometer.hrl").
-define(SERVER, ?MODULE).
diff --git a/src/hut.hrl b/src/hut.hrl
new file mode 100644
index 0000000..a6f46e2
--- /dev/null
+++ b/src/hut.hrl
@@ -0,0 +1,185 @@
+%% -*- erlang -*-
+
+-ifndef(__HUT_HRL__).
+-define(__HUT_HRL__, true).
+
+%% Supported logging levels (taken from lager):
+-define(__log_levels, [debug, info, notice, warning, error, critical, alert, emergency]).
+-define(__default_log_level, info).
+-define(__default_use_log_level_gate, true).
+
+%% Helper macros
+-define(__fmt(__Fmt, __Args), lists:flatten(io_lib:format(__Fmt, __Args))).
+
+-define(__maybe_log(__Level, __Fun),
+ ((fun() ->
+ __UseGate = application:get_env(hut, use_log_level_gate, ?__default_use_log_level_gate),
+ case __UseGate of
+ true ->
+ __CurrentLevel = application:get_env(hut, level, ?__default_log_level),
+ __AllowedLevels = lists:dropwhile(fun(__Element) -> __Element =/= __CurrentLevel end, ?__log_levels),
+ __IsEnabled = lists:member(__Level, __AllowedLevels),
+ case __IsEnabled of
+ true ->
+ __Fun();
+ _ ->
+ ok
+ end;
+ _ ->
+ __Fun()
+ end
+ end)())).
+
+
+-define(__hut_logger_metadata,
+ #{ mfa => {?MODULE, ?FUNCTION_NAME, ?FUNCTION_ARITY}
+ , file => ?FILE
+ , line => ?LINE
+ }).
+
+%% Lager support
+
+-ifdef(HUT_LAGER).
+-define(log_type, "lager").
+
+-ifndef(HUT_LAGER_SINK).
+-define(HUT_LAGER_SINK, lager).
+-endif.
+
+-define(log(__Level, __Fmt),
+ ?HUT_LAGER_SINK:__Level([], __Fmt, [])).
+-define(log(__Level, __Fmt, __Args),
+ ?HUT_LAGER_SINK:__Level([], __Fmt, __Args)).
+-define(log(__Level, __Fmt, __Args, __Opts),
+ ?HUT_LAGER_SINK:__Level(__Opts, __Fmt, __Args)).
+
+-else. %% HUT_LAGER
+
+% Using plain `io:format/2`.
+
+-ifdef(HUT_IOFORMAT).
+-define(log_type, "ioformat").
+
+-define(log(__Level, __Fmt),
+ ?__maybe_log(__Level, fun() -> io:format("~p: " ++ __Fmt ++ "~n", [__Level]) end)).
+-define(log(__Level, __Fmt, __Args),
+ ?__maybe_log(__Level, fun() -> io:format("~p: " ++ __Fmt ++ "~n", [__Level] ++ __Args) end)).
+-define(log(__Level, __Fmt, __Args, __Opts),
+ ?__maybe_log(__Level, fun() -> io:format("~p: " ++ __Fmt ++ "; Opts: ~p~n", [__Level] ++ __Args ++ [__Opts]) end)).
+
+-else. %% HUT_IOFORMAT
+
+% All logging calls are passed into a custom logging callback module given by `HUT_CUSTOM_CB`.
+
+-ifdef(HUT_CUSTOM).
+-define(log_type, "custom").
+
+-define(log(__Level, __Fmt),
+ ?__maybe_log(__Level, fun() -> ?HUT_CUSTOM_CB:log(__Level, __Fmt, [], maps:to_list(?__hut_logger_metadata)) end)).
+-define(log(__Level, __Fmt, __Args),
+ ?__maybe_log(__Level, fun() -> ?HUT_CUSTOM_CB:log(__Level, __Fmt, __Args, maps:to_list(?__hut_logger_metadata)) end)).
+-define(log(__Level, __Fmt, __Args, __Opts),
+ ?__maybe_log(__Level, fun() -> ?HUT_CUSTOM_CB:log(__Level, __Fmt, __Args, __Opts) end)).
+
+-ifdef(HUT_CUSTOM_SLOG).
+-define(slog(__Level, __Data, __Meta),
+ ?HUT_CUSTOM_CB:slog(__Level, __Data, maps:merge(?__hut_logger_metadata, __Meta))).
+-define(slog(__Level, __Data),
+ ?HUT_CUSTOM_CB:slog(__Level, __Data, ?__hut_logger_metadata)).
+-endif. %% HUT_CUSTOM_SLOG
+
+-else. %% HUT_CUSTOM
+
+% All logging calls are ignored.
+
+-ifdef(HUT_NOOP).
+-define(log_type, "noop").
+
+-define(log(__Level, __Fmt), true).
+-define(log(__Level, __Fmt, __Args), true).
+-define(log(__Level, __Fmt, __Args, __Opts), true).
+
+-else. %% HUT_NOOP
+
+-ifndef(OTP_RELEASE).
+% If none of the above options were defined and OTP version is below 21, default to SASL
+-ifndef(HUT_SASL).
+-define(HUT_SASL, true).
+-endif.
+-endif. %% !OTP_RELEASE
+
+-ifdef(HUT_SASL).
+
+-define(log_type, "sasl").
+
+-define(log(__Level, __Fmt),
+ ?__maybe_log(__Level, fun() -> hut:log(?log_type, __Level, __Fmt, [], []) end)).
+-define(log(__Level, __Fmt, __Args),
+ ?__maybe_log(__Level, fun() -> hut:log(?log_type, __Level, __Fmt, __Args, []) end)).
+-define(log(__Level, __Fmt, __Args, __Opts),
+ ?__maybe_log(__Level, fun() -> hut:log(?log_type, __Level, __Fmt, __Args, __Opts) end)).
+
+-else. %% HUT_SASL
+
+% On OTP21+ use logger by default
+
+-define(log_type, "logger").
+
+-define(log(__Level, __Fmt, __Args, __Opts),
+ logger:log(__Level, __Fmt ++ "; Opts ~p", __Args ++ [__Opts], ?__hut_logger_metadata)).
+-define(log(__Level, __Fmt, __Args),
+ logger:log(__Level, __Fmt, __Args, ?__hut_logger_metadata)).
+-define(log(__Level, __Fmt),
+ ?log(__Level, __Fmt, [])).
+
+% Structured report:
+-define(slog(__Level, __Data, __Meta),
+ logger:log(__Level, __Data, maps:merge(?__hut_logger_metadata, __Meta))).
+-define(slog(__Level, __Data),
+ ?slog(__Level, __Data, #{})).
+
+% Set metadata:
+-define(set_process_metadata(__Meta),
+ logger:set_process_metadata(__Meta)).
+
+% End of all actual log implementation switches.
+-endif. %% HUT_SASL
+-endif. %% HUT_NOOP
+-endif. %% HUT_CUSTOM
+-endif. %% HUT_IOFORMAT
+-endif. %% HUT_LAGER
+
+-ifndef(slog).
+%% Poor man's OTP21 `logger' structured log:
+
+-define(__hut_slog_helper(__Level, __Data, __Meta0),
+ ((fun() ->
+ try
+ __Meta = case get(hut_process_metadata) of
+ __Map when is_map(__Map) ->
+ maps:merge(__Map, __Meta0);
+ _ ->
+ __Meta0
+ end,
+ ?log(__Level, "~p", [__Data], [__Meta])
+ catch
+ _:_ ->
+ ok
+ end
+ end)())).
+
+-define(slog(__Level, __Data, __Meta),
+ ?__hut_slog_helper(__Level, __Data, maps:merge(?__hut_logger_metadata, __Meta))).
+
+-define(slog(__Level, __Data),
+ ?slog(__Level, __Data, #{})).
+
+-endif. %% !slog
+
+-ifndef(set_process_metadata).
+-define(set_process_metadata(__Meta),
+ put(hut_process_metadata, __Meta)).
+-endif. %% !set_process_metadata
+
+% End of log declarations
+-endif. %% __HUT_HRL__