diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 8d25e96..f32fcfe 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -15,7 +15,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - otp: [22.3, 23.3, 24.2] + otp: [24.3, 25, 26] rebar: [3.18.0] steps: - uses: actions/checkout@v2 diff --git a/.github/workflows/hex.yaml b/.github/workflows/hex.yaml deleted file mode 100644 index 0449297..0000000 --- a/.github/workflows/hex.yaml +++ /dev/null @@ -1,27 +0,0 @@ -name: Publish to hex.pm - -on: - push: - tags: - - '*' - -jobs: - publish: - name: "Ubuntu" - runs-on: ubuntu-latest - strategy: - matrix: - otp: [24.2] - rebar: [3.18.0] - steps: - - uses: actions/checkout@v2 - - uses: erlef/setup-beam@v1 - with: - otp-version: ${{matrix.otp}} - rebar3-version: ${{matrix.rebar}} - - name: Publish to Hex.pm - env: - HEX_API_KEY: ${{ secrets.HEX_API_KEY }} - run: | - rebar3 edoc - rebar3 hex publish -r hexpm --yes diff --git a/src/logstasher.erl b/src/logstasher.erl index d0d8993..ac84c56 100644 --- a/src/logstasher.erl +++ b/src/logstasher.erl @@ -59,26 +59,33 @@ start_link() -> %% Supervisor callbacks %%============================================================================== --spec init(term()) -> {ok, maps:map()} | {stop, maps:map()}. +-type state() :: #{ + transport := module(), + host := string() | binary() | tuple(), + port := pos_integer(), + socket => gen_udp:socket() | gen_tcp:socket() | undefined + }. + +-spec init(_) -> {ok, state()}. init(_) -> Transport = application:get_env(?MODULE, transport, ?LOGSTASH_TRANSPORT), Host = application:get_env(?MODULE, host, ?LOGSTASH_HOST), Port = application:get_env(?MODULE, port, ?LOGSTASH_PORT), - Opts = #{transport => Transport, host => Host, port => Port}, - State = Opts#{socket => connect(Opts)}, + Opts = #{ transport => Transport, host => Host, port => Port }, + State = Opts#{ socket => connect(Opts) }, {ok, State}. --spec handle_call({send, binary()}, any(), maps:map()) -> - {reply, ok | {error, atom() | {timeout, binary()}}, maps:map()}. +-spec handle_call({send, binary()}, _, state()) -> + {reply, ok | {error, atom() | {timeout, binary()}}, state()}. handle_call({send, Data}, _, State) -> Result = maybe_send(Data, State), {reply, Result, State}. --spec handle_cast(term(), maps:map()) -> {noreply, maps:map()}. +-spec handle_cast(_, state()) -> {noreply, state()}. handle_cast(_, State) -> {noreply, State}. --spec terminate(term(), maps:map()) -> ok. +-spec terminate(_, state()) -> ok. terminate(_, #{transport := tcp, socket := Socket}) -> gen_tcp:close(Socket); terminate(_, #{transport := udp, socket := Socket}) -> @@ -90,7 +97,7 @@ terminate(_, #{transport := console}) -> %% Internal functions %%============================================================================== --spec connect(maps:map()) -> gen_udp:socket() | gen_tcp:socket() | undefined. +-spec connect(state()) -> gen_udp:socket() | gen_tcp:socket() | undefined. connect(#{transport := tcp, host := Host, port := Port}) -> Opts = [binary, {active, false}, {keepalive, true}], case gen_tcp:connect(Host, Port, Opts, ?TCP_CONNECT_TIMEOUT) of @@ -112,7 +119,7 @@ connect(#{transport := udp}) -> connect(#{transport := console}) -> undefined. --spec maybe_send(binary(), maps:map()) -> ok | {error, atom()}. +-spec maybe_send(binary(), map()) -> ok | {error, atom()}. maybe_send(Data, #{transport := console} = State) -> send(Data, State); maybe_send(Data, #{socket := undefined} = State) -> @@ -124,7 +131,7 @@ maybe_send(Data, State) -> {error, _} = Error -> Error end. --spec send(binary(), maps:map()) -> ok | {error, atom()}. +-spec send(binary(), map()) -> ok | {error, atom()}. send(Data, #{transport := console}) -> io:put_chars([ Data, "\n"]); send(_Data, #{socket := undefined}) -> diff --git a/src/logstasher_h.erl b/src/logstasher_h.erl index caa43c9..56d3559 100644 --- a/src/logstasher_h.erl +++ b/src/logstasher_h.erl @@ -7,7 +7,7 @@ -export([log_data/1]). %% Xref ignores --ignore_xref([log/2]). +-ignore_xref([log/2, log_data/1]). %% Truncate binary values beyond this size. -define(LOG_BINARY_SIZE, 2000). @@ -49,11 +49,6 @@ log_data(#{level := Level, msg := EventData, meta := Meta}) -> %% @doc If there is no message, try to extract the 'text' fields from the message fields %% and use that as the message. --spec maybe_extract_message(Message, MsgFields) -> {Message1, MsgFields1} when - Message :: null | binary(), - Message1 :: null | binary(), - MsgFields :: map(), - MsgFields1 :: map(). maybe_extract_message(null, #{ text := Text } = MsgFields) when is_binary(Text) -> {Text, maps:remove(text, MsgFields)}; maybe_extract_message(Msg, MsgFields) -> @@ -195,11 +190,11 @@ is_proplist(_) -> false. % Simple ASCII character string, typically SQL statements, filenames or literal texts. is_ascii_list([]) -> true; is_ascii_list([ C | T ]) when C >= 32, C =< 127 -> is_ascii_list(T); -is_ascii_list([ C | T ]) when C =:= $\n, C =:= $\t -> is_ascii_list(T); +is_ascii_list([ C | T ]) when C =:= $\n; C =:= $\t -> is_ascii_list(T); is_ascii_list(_) -> false. maybe_truncate(Bin) when size(Bin) >= ?LOG_BINARY_SIZE -> <> = Bin, - <>; + <>; maybe_truncate(Bin) -> Bin.