Packages

EndPointBlank Elixir client library: authorization plus request/response/error/log ingestion (with masking, batching, timeouts, and a bounded queue) — also used for self-monitoring.

Current section

Files

Jump to
end_point_blank_elixir lib end_point_blank writers request_writer.ex
Raw

lib/end_point_blank/writers/request_writer.ex

defmodule EndPointBlank.Writers.RequestWriter do
@moduledoc "Sends inbound request metadata to the EndPointBlank API."
alias EndPointBlank.{Config, Masking, RequestStore, VersionFinder, Writers}
def write(%Plug.Conn{} = conn) do
config = Config.get()
payload = %{
app_name: config.app_name,
env: config.environment,
uuid: RequestStore.get_uuid(),
host: conn.host,
headers: Map.new(conn.req_headers),
path: conn.request_path,
http_method: conn.method,
endpoint_version: VersionFinder.find(conn),
request: read_body(conn),
sent_at: utc_now()
}
payload = Masking.apply(payload, :request, Config.masking_rules(), Config.mask_hook())
Writers.write(:requests, config.log_mode, [payload])
end
defp read_body(conn) do
case conn.body_params do
%Plug.Conn.Unfetched{} -> nil
params when map_size(params) > 0 -> Jason.encode!(params) |> truncate()
_ -> nil
end
end
defp truncate(s) when byte_size(s) > 1024, do: binary_part(s, 0, 1024) <> "..."
defp truncate(s), do: s
defp utc_now, do: DateTime.utc_now() |> DateTime.to_iso8601()
end