Skip to content

Commit 506be67

Browse files
wojtekmachbryannaegele
authored andcommitted
opentelemetry_req: Don't assume request.headers shape
1 parent 24e823c commit 506be67

File tree

4 files changed

+70
-3
lines changed

4 files changed

+70
-3
lines changed

instrumentation/opentelemetry_req/lib/opentelemetry_req.ex

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,12 @@ defmodule OpentelemetryReq do
202202

203203
defp maybe_put_trace_headers(request) do
204204
if request.options[:propagate_trace_ctx] do
205-
Map.put(request, :headers, :otel_propagator_text_map.inject(request.headers))
205+
propagator = :opentelemetry.get_text_map_injector()
206+
headers_to_inject = :otel_propagator_text_map.inject(propagator, [], &[{&1, &2} | &3])
207+
208+
Enum.reduce(headers_to_inject, request, fn {name, value}, acc ->
209+
Req.Request.put_header(acc, name, value)
210+
end)
206211
else
207212
request
208213
end

instrumentation/opentelemetry_req/mix.exs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,8 @@ defmodule OpentelemetryReq.MixProject do
6060
{:opentelemetry_api, "~> 1.0"},
6161
{:opentelemetry_semantic_conventions, "~> 0.2"},
6262
{:req, ">= 0.3.5"},
63-
{:ex_doc, "~> 0.29", only: [:dev, :test]}
63+
{:ex_doc, "~> 0.29", only: [:dev, :test]},
64+
{:opentelemetry, "~> 1.0", only: :test}
6465
]
6566
end
6667
end

instrumentation/opentelemetry_req/mix.lock

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
"nimble_options": {:hex, :nimble_options, "0.5.2", "42703307b924880f8c08d97719da7472673391905f528259915782bb346e0a1b", [:mix], [], "hexpm", "4da7f904b915fd71db549bcdc25f8d56f378ef7ae07dc1d372cbe72ba950dce0"},
1414
"nimble_parsec": {:hex, :nimble_parsec, "1.2.3", "244836e6e3f1200c7f30cb56733fd808744eca61fd182f731eac4af635cc6d0b", [:mix], [], "hexpm", "c8d789e39b9131acf7b99291e93dae60ab48ef14a7ee9d58c6964f59efb570b0"},
1515
"nimble_pool": {:hex, :nimble_pool, "0.2.6", "91f2f4c357da4c4a0a548286c84a3a28004f68f05609b4534526871a22053cde", [:mix], [], "hexpm", "1c715055095d3f2705c4e236c18b618420a35490da94149ff8b580a2144f653f"},
16+
"opentelemetry": {:hex, :opentelemetry, "1.3.0", "988ac3c26acac9720a1d4fb8d9dc52e95b45ecfec2d5b5583276a09e8936bc5e", [:rebar3], [{:opentelemetry_api, "~> 1.2.0", [hex: :opentelemetry_api, repo: "hexpm", optional: false]}, {:opentelemetry_semantic_conventions, "~> 0.2", [hex: :opentelemetry_semantic_conventions, repo: "hexpm", optional: false]}], "hexpm", "8e09edc26aad11161509d7ecad854a3285d88580f93b63b0b1cf0bac332bfcc0"},
1617
"opentelemetry_api": {:hex, :opentelemetry_api, "1.2.1", "7b69ed4f40025c005de0b74fce8c0549625d59cb4df12d15c32fe6dc5076ff42", [:mix, :rebar3], [{:opentelemetry_semantic_conventions, "~> 0.2", [hex: :opentelemetry_semantic_conventions, repo: "hexpm", optional: false]}], "hexpm", "6d7a27b7cad2ad69a09cabf6670514cafcec717c8441beb5c96322bac3d05350"},
1718
"opentelemetry_semantic_conventions": {:hex, :opentelemetry_semantic_conventions, "0.2.0", "b67fe459c2938fcab341cb0951c44860c62347c005ace1b50f8402576f241435", [:mix, :rebar3], [], "hexpm", "d61fa1f5639ee8668d74b527e6806e0503efc55a42db7b5f39939d84c07d6895"},
1819
"req": {:hex, :req, "0.3.6", "541350d2cc359a8ad17059f2629c18be56d0c85ce0e4ddb27694b6ba482fe923", [:mix], [{:brotli, "~> 0.3.1", [hex: :brotli, repo: "hexpm", optional: true]}, {:ezstd, "~> 1.0", [hex: :ezstd, repo: "hexpm", optional: true]}, {:finch, "~> 0.9", [hex: :finch, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:mime, "~> 1.6 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:nimble_csv, "~> 1.0", [hex: :nimble_csv, repo: "hexpm", optional: true]}, {:plug, "~> 1.0", [hex: :plug, repo: "hexpm", optional: true]}], "hexpm", "9181047f32b05f8737f6b5917af5ee5385219158bbe4e507f4ec57791a0a78c3"},
Lines changed: 61 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,64 @@
11
defmodule OpentelemetryReqTest do
2-
use ExUnit.Case
2+
use ExUnit.Case, async: true
33
doctest OpentelemetryReq
4+
require Record
5+
6+
for {name, spec} <- Record.extract_all(from_lib: "opentelemetry/include/otel_span.hrl") do
7+
Record.defrecordp(name, spec)
8+
end
9+
10+
setup do
11+
:application.stop(:opentelemetry)
12+
:application.set_env(:opentelemetry, :tracer, :otel_tracer_default)
13+
14+
:application.set_env(:opentelemetry, :processors, [
15+
{:otel_batch_processor, %{scheduled_delay_ms: 1, exporter: {:otel_exporter_pid, self()}}}
16+
])
17+
18+
:application.start(:opentelemetry)
19+
20+
req =
21+
Req.new()
22+
|> OpentelemetryReq.attach()
23+
24+
{:ok, req: req}
25+
end
26+
27+
test "span", %{req: req} do
28+
adapter = fn request ->
29+
assert URI.to_string(request.url) == "/users/3"
30+
{request, Req.Response.new(status: 204)}
31+
end
32+
33+
resp =
34+
Req.get!(req,
35+
adapter: adapter,
36+
url: "/users/:id",
37+
path_params: [id: 3]
38+
)
39+
40+
assert resp.status == 204
41+
assert_receive {:span, span(name: "GET /users/:id")}
42+
refute_receive _
43+
end
44+
45+
test "propagate traces", %{req: req} do
46+
adapter = fn request ->
47+
assert [value] = Req.Request.get_header(request, "traceparent")
48+
assert byte_size(value) > 10
49+
{request, Req.Response.new(status: 204)}
50+
end
51+
52+
resp =
53+
Req.get!(req,
54+
adapter: adapter,
55+
url: "/",
56+
no_path_params: true,
57+
propagate_trace_ctx: true
58+
)
59+
60+
assert resp.status == 204
61+
assert_receive {:span, span()}
62+
refute_receive _
63+
end
464
end

0 commit comments

Comments
 (0)