Current section
Files
Jump to
Current section
Files
lib/backend.ex
defmodule LogDNA do
@behaviour :gen_event
import LogDNA.Config
alias LogDNA.{Formatter, Ingestion, State}
def init(__MODULE__) do
case initial_state() do
%State{ingestion_key: nil} ->
{:error, "No LogDNA ingestion key configured"}
state ->
HTTPoison.start()
{:ok, state}
end
end
# We're not buffering anything, so this is a no-op
def handle_event(:flush, state), do: {:ok, state}
# It is recommended that handlers ignore messages
# where the group leader is in a different node
# than the one where the handler is installed
def handle_event({_, gl, {_, _, _, _}}, state) when node(gl) != node(), do: {:ok, state}
def handle_event(
{level, _group_leader, {Logger, msg, timestamp, metadata}},
state
) do
if Logger.compare_levels(state.level, level) != :gt do
metadata = whitelist_metadata(metadata, state)
message = message(msg)
Formatter.format_event(level, message, timestamp, metadata)
|> Ingestion.prepare_request(state)
|> Ingestion.post_request()
end
{:ok, state}
end
@spec message(any()) :: String.t()
defp message(msg) when is_binary(msg), do: msg
defp message(msg) when is_list(msg), do: to_string(msg)
defp message(msg), do: inspect(msg)
def handle_call(_request, state) do
# TODO: Handle config calls
{:ok, :ok, state}
end
defp initial_state() do
%State{
ingestion_key: logdna_config(:ingestion_key),
metadata: logger_config(:metadata, [])
}
end
defp whitelist_metadata(metadata, state), do: Keyword.take(metadata, state.metadata)
end