Packages
timber
1.1.15
3.1.2
3.1.1
3.1.0
3.0.0
3.0.0-alpha.3
3.0.0-alpha.2
3.0.0-alpha.1
2.8.4
2.8.3
2.8.2
2.8.1
2.8.0
2.7.0
2.6.1
2.6.0
2.5.6
2.5.5
2.5.4
2.5.3
2.5.2
2.5.1
2.5.0
2.4.5
2.4.4
2.4.3
2.4.2
2.4.1
2.4.0
2.3.4
2.3.3
2.3.1
2.3.0
2.2.1
2.2.0
2.1.8
2.1.7
2.1.6
2.1.5
2.1.4
2.1.3
2.1.2
2.1.1
2.1.0
2.0.2
2.0.1
2.0.0
2.0.0-rc7
2.0.0-rc6
2.0.0-rc5
2.0.0-rc4
2.0.0-rc3
2.0.0-rc2
2.0.0-rc1
1.1.18
1.1.17
1.1.16
1.1.15
1.1.14
1.1.13
1.1.12
1.1.11
1.1.10
1.1.9
1.1.8
1.1.7
1.1.6
1.1.5
1.1.4
1.1.3
1.1.2
1.1.1
1.1.0
1.0.16
1.0.15
1.0.14
1.0.13
1.0.12
1.0.11
1.0.10
1.0.9
1.0.8
1.0.7
1.0.6
1.0.5
1.0.4
1.0.3
1.0.2
1.0.1
1.0.0
0.4.7
0.4.6
0.4.5
0.4.4
0.4.3
0.4.2
0.4.1
0.4.0
0.3.2
0.3.1
0.3.0
0.2.3
0.2.2
0.2.1
0.2.0
0.1.5
0.1.4
0.1.3
0.1.2
0.1.1
0.1.0
🌲 Great Elixir Logging Made Easy. Official Timber.io Integration.
Current section
Files
Jump to
Current section
Files
lib/timber/events/http_client_response_event.ex
defmodule Timber.Events.HTTPClientResponseEvent do
@moduledoc """
The `HTTPClientResponseEvent` tracks responses for *outgoing* HTTP *requests*. This gives you
structured insight into communication with external services.
See `Timber.Events.HTTPClientRequestEvent` for examples on track the entire HTTP request
lifecycle.
"""
alias Timber.Utils.HTTPEvents, as: UtilsHTTPEvents
@enforce_keys [:status, :time_ms]
defstruct [:body, :headers, :request_id, :service_name, :status, :time_ms]
@type t :: %__MODULE__{
body: String.t | nil,
headers: map | nil,
request_id: String.t | nil,
service_name: String.t | nil,
status: pos_integer,
time_ms: float
}
@doc """
Builds a new struct taking care to:
* Truncate the body if it is too large.
* Normalize header values so they are consistent.
* Removes "" or nil values.
"""
@spec new(Keyword.t) :: t
def new(opts) do
opts =
opts
|> Keyword.update(:body, nil, fn body -> UtilsHTTPEvents.normalize_body(body) end)
|> Keyword.update(:headers, nil, fn headers -> UtilsHTTPEvents.normalize_headers(headers) end)
|> Keyword.update(:service_name, nil, &UtilsHTTPEvents.try_atom_to_string/1)
|> Enum.filter(fn {_k,v} -> !(v in [nil, ""]) end)
opts = Keyword.put_new_lazy(opts, :request_id, fn -> UtilsHTTPEvents.get_request_id_from_headers(opts[:headers]) end)
struct!(__MODULE__, opts)
end
@doc """
Convenience methods for creating an event and getting the message at the same time.
"""
@spec new_with_message(Keyword.t) :: {t, IO.chardata}
def new_with_message(opts) do
event = new(opts)
{event, message(event)}
end
@doc """
Message to be used when logging.
"""
@spec message(t) :: IO.chardata
def message(%__MODULE__{service_name: service_name, status: status, time_ms: time_ms}) do
message = ["Outgoing HTTP response "]
message = if service_name,
do: [message, "from ", service_name, " "],
else: message
[message, Integer.to_string(status), " in ", UtilsHTTPEvents.format_time_ms(time_ms)]
end
end