Packages
timber
1.0.8
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_server_response_event.ex
defmodule Timber.Events.HTTPServerResponseEvent do
@moduledoc """
The `HTTPServerResponseEvent` tracks responses for *incoming* HTTP *requests*. In other words,
the resposnes you are sending back to your clients. This gives you structured insight into
the response you are sending back to your clients.
Timber can automatically track response events if you use a `Plug` based framework
through `Timber.Plug`.
"""
alias Timber.Utils.HTTP, as: UtilsHTTP
@type t :: %__MODULE__{
headers: headers,
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
}
@enforce_keys [:status, :time_ms]
defstruct [:headers, :status, :time_ms]
@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)
|> Enum.filter(fn {_k,v} -> v != nil end)
struct!(__MODULE__, opts)
end
@doc """
Message to be used when logging.
"""
@spec message(t) :: IO.chardata
def message(%__MODULE__{status: status, time_ms: time_ms}),
do: ["Sent ", Integer.to_string(status), " in ", UtilsHTTP.format_time_ms(time_ms)]
end