Packages
timber
2.8.1
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_request_event.ex
defmodule Timber.Events.HTTPRequestEvent do
@moduledoc """
The `HTTPRequestEvent` tracks HTTP requests.
This gives you structured into the HTTP request
coming into your app as well as the ones going out (if you choose to track them).
The defined structure of this data can be found in the log event JSON schema:
https://github.com/timberio/log-event-json-schema
Timber can automatically track incoming HTTP requests if you use a `Plug` based framework.
See the documentation for `Timber.Integerations.EventPlug` for more information. The `README.md`
also outlines how to set this up.
"""
alias Timber.Utils.HTTPEvents, as: UtilsHTTPEvents
@type t :: %__MODULE__{
body: String.t() | nil,
direction: String.t() | nil,
host: String.t() | nil,
headers: map | nil,
headers_json: String.t() | nil,
method: String.t(),
path: String.t() | nil,
port: pos_integer | nil,
query_string: String.t() | nil,
request_id: String.t() | nil,
scheme: String.t() | nil,
service_name: nil | String.t()
}
@enforce_keys [:method]
defstruct [
:body,
:direction,
:host,
:headers,
:headers_json,
:method,
:path,
:port,
:query_string,
:request_id,
:scheme,
:service_name
]
@doc """
Builds a new struct taking care to:
* Parsing the `:url` and mapping it to the appropriate attributes.
* Normalize header values so they are consistent.
* Normalize the method.
* 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(:method, nil, &UtilsHTTPEvents.normalize_method/1)
|> Keyword.update(:service_name, nil, &to_string/1)
|> Keyword.merge(UtilsHTTPEvents.normalize_url(Keyword.get(opts, :url)))
|> Keyword.delete(:url)
|> Enum.filter(fn {_k, v} -> !(v in [nil, ""]) end)
|> UtilsHTTPEvents.move_headers_to_headers_json()
struct!(__MODULE__, opts)
end
@doc """
Message to be used when logging.
"""
@spec message(t) :: IO.chardata()
def message(%__MODULE__{direction: "outgoing"} = event) do
message =
if event.service_name do
["Sent ", event.method, " ", event.path]
else
full_url =
UtilsHTTPEvents.full_url(
event.scheme,
event.host,
event.path,
event.port,
event.query_string
)
["Sent ", event.method, " ", full_url]
end
message =
if event.request_id do
truncated_request_id = String.slice(event.request_id, 0..5)
[message, " (", truncated_request_id, "...)"]
else
message
end
if event.service_name,
do: [message, " to ", event.service_name],
else: message
end
def message(%__MODULE__{} = event),
do: ["Received ", event.method, " ", event.path]
end