Skip to content

Commit e1a9723

Browse files
committed
add prefix option to RequestId
1 parent 8723880 commit e1a9723

File tree

2 files changed

+26
-15
lines changed

2 files changed

+26
-15
lines changed

lib/plug/request_id.ex

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,9 @@ defmodule Plug.RequestId do
5454
5555
plug Plug.RequestId, logger_metadata_key: :my_request_id
5656
57+
* `:prefix` - The prefix that will be appended on the request_id, if generated.
58+
59+
plug Plug.RequestId, prefix: :myapp
5760
"""
5861

5962
alias Plug.Conn
@@ -64,36 +67,35 @@ defmodule Plug.RequestId do
6467
{
6568
Keyword.get(opts, :http_header, "x-request-id"),
6669
Keyword.get(opts, :assign_as),
67-
Keyword.get(opts, :logger_metadata_key, :request_id)
70+
Keyword.get(opts, :logger_metadata_key, :request_id),
71+
Keyword.get(opts, :prefix, false)
6872
}
6973
end
7074

7175
@impl true
72-
def call(conn, {header, assign_as, logger_metadata_key}) do
73-
request_id = get_request_id(conn, header)
76+
def call(conn, {header, assign_as, logger_metadata_key, prefix}) do
77+
request_id = get_request_id(conn, header, prefix)
7478

7579
Logger.metadata([{logger_metadata_key, request_id}])
7680
conn = if assign_as, do: Conn.assign(conn, assign_as, request_id), else: conn
7781

7882
Conn.put_resp_header(conn, header, request_id)
7983
end
8084

81-
defp get_request_id(conn, header) do
85+
defp get_request_id(conn, header, prefix) do
8286
case Conn.get_req_header(conn, header) do
83-
[] -> generate_request_id()
84-
[val | _] -> if valid_request_id?(val), do: val, else: generate_request_id()
87+
[val | _] when byte_size(val) in 20..200 -> val
88+
_ -> generate_request_id(prefix)
8589
end
8690
end
8791

88-
defp generate_request_id do
89-
binary = <<
90-
System.system_time(:nanosecond)::64,
91-
:erlang.phash2({node(), self()}, 16_777_216)::24,
92-
:erlang.unique_integer()::32
93-
>>
92+
defp generate_request_id(prefix) do
93+
id =
94+
Base.url_encode64(
95+
<<System.system_time(:nanosecond)::64, :erlang.phash2({node(), self()}, 16_777_216)::24,
96+
:erlang.unique_integer()::32>>
97+
)
9498

95-
Base.url_encode64(binary)
99+
if prefix, do: "#{prefix}-#{id}", else: id
96100
end
97-
98-
defp valid_request_id?(s), do: byte_size(s) in 20..200
99101
end

test/plug/request_id_test.exs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,15 @@ defmodule Plug.RequestIdTest do
77
Plug.RequestId.call(conn, Plug.RequestId.init(opts))
88
end
99

10+
test "generates new request id with prefix" do
11+
conn = call(conn(:get, "/"), prefix: :myapp)
12+
[res_request_id] = get_resp_header(conn, "x-request-id")
13+
meta_request_id = Logger.metadata()[:request_id]
14+
assert generated_request_id?(res_request_id)
15+
assert res_request_id == meta_request_id
16+
assert String.starts_with?(res_request_id, "myapp-")
17+
end
18+
1019
test "generates new request id if none exists" do
1120
conn = call(conn(:get, "/"), [])
1221
[res_request_id] = get_resp_header(conn, "x-request-id")

0 commit comments

Comments
 (0)