Packages
timber
1.0.10
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.HTTP, as: UtilsHTTP
@enforce_keys [:status, :time_ms]
defstruct [:headers, :service_name, :status, :time_ms]
@type t :: %__MODULE__{
headers: headers,
service_name: String.t | nil,
status: pos_integer,
time_ms: float
}
@type headers :: %{
cache_control: String.t,
content_disposition: String.t,
content_length: non_neg_integer,
content_type: String.t,
location: String.t,
request_id: String.t
}
@recognized_headers ~w(
cache_control
content_disposition
content_length
content_type
location
x-request-id
)
@doc """
Builds a new struct taking care to normalize data into a valid state. This should
be used, where possible, instead of creating the struct directly.
"""
@spec new(Keyword.t) :: t
def new(opts) do
opts =
opts
|> Keyword.update(:headers, nil, fn headers ->
UtilsHTTP.normalize_headers(headers, @recognized_headers)
end)
|> Keyword.delete(:timer)
|> Enum.filter(fn {_k,v} -> v != nil 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__{headers: headers, 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 = [message, Integer.to_string(status), " in ", UtilsHTTP.format_time_ms(time_ms)]
request_id = Map.get(headers || %{}, :request_id)
if request_id,
do: [message, ", ID ", request_id],
else: message
end
end