From 15a197cb52b8c6b95c5fdb8261f1ed91282061f1 Mon Sep 17 00:00:00 2001 From: Pedro Nascimento Date: Fri, 6 Mar 2026 03:32:17 -0300 Subject: [PATCH 1/5] Use string span names and update with route from conn.private Bandit created HTTP server spans with atom names (e.g. :GET) from semconv values. The OTel spec requires span names to be strings. This changes the initial span name to use conn.method (a string like "GET"). Additionally, at request completion, the span name is updated to include the route template ("{method} {route}") when conn.private[:plug_route] is available. This is set by Phoenix and other Plug-based routers during dispatch, enabling proper span names without requiring opentelemetry_phoenix. Follows up on #401 and the discussion about OTel HTTP semantic conventions requiring span names to be "{method} {http.route}" when the route is known. --- .../lib/opentelemetry_bandit.ex | 18 ++++++-- .../test/bandit/opentelemetry_bandit_test.exs | 45 +++++++++++++------ 2 files changed, 47 insertions(+), 16 deletions(-) diff --git a/instrumentation/opentelemetry_bandit/lib/opentelemetry_bandit.ex b/instrumentation/opentelemetry_bandit/lib/opentelemetry_bandit.ex index ff378746..1b09831d 100644 --- a/instrumentation/opentelemetry_bandit/lib/opentelemetry_bandit.ex +++ b/instrumentation/opentelemetry_bandit/lib/opentelemetry_bandit.ex @@ -239,8 +239,8 @@ defmodule OpentelemetryBandit do name = if request_method == HTTPAttributes.http_request_method_values().other, - do: :HTTP, - else: request_method + do: "HTTP", + else: conn.method if public_endpoint?(conn, config) do propagated_ctx = @@ -264,7 +264,7 @@ defmodule OpentelemetryBandit do # error with no conn def handle_request_start(_meta, _config) do - Tracer.start_span(:HTTP, %{kind: :server}) + Tracer.start_span("HTTP", %{kind: :server}) |> Tracer.set_current_span() end @@ -468,10 +468,22 @@ defmodule OpentelemetryBandit do |> Tracer.set_attributes() end + maybe_update_span_name(conn) + Tracer.end_span() Ctx.clear() end + defp maybe_update_span_name(conn) do + case conn.private do + %{plug_route: {route, _fun}} -> + Tracer.update_name("#{conn.method} #{route}") + + _ -> + :ok + end + end + @doc false def handle_request_exception(meta, config) do Tracer.set_status(OpenTelemetry.status(:error, "")) diff --git a/instrumentation/opentelemetry_bandit/test/bandit/opentelemetry_bandit_test.exs b/instrumentation/opentelemetry_bandit/test/bandit/opentelemetry_bandit_test.exs index 86b0f002..9820662c 100644 --- a/instrumentation/opentelemetry_bandit/test/bandit/opentelemetry_bandit_test.exs +++ b/instrumentation/opentelemetry_bandit/test/bandit/opentelemetry_bandit_test.exs @@ -73,7 +73,7 @@ defmodule OpentelemetryBanditTest do assert_receive {:span, span( - name: :GET, + name: "GET", kind: :server, attributes: span_attrs, parent_span_id: 13_235_353_014_750_950_193 @@ -112,14 +112,14 @@ defmodule OpentelemetryBanditTest do refute_receive {:span, span( - name: :GET, + name: "GET", kind: :server, parent_span_id: 13_235_353_014_750_950_193 )} assert_receive {:span, span( - name: :GET, + name: "GET", kind: :server, links: links, parent_span_id: :undefined @@ -147,14 +147,14 @@ defmodule OpentelemetryBanditTest do refute_receive {:span, span( - name: :GET, + name: "GET", kind: :server, parent_span_id: 13_235_353_014_750_950_193 )} assert_receive {:span, span( - name: :GET, + name: "GET", kind: :server, links: links, parent_span_id: :undefined @@ -173,14 +173,14 @@ defmodule OpentelemetryBanditTest do assert_receive {:span, span( - name: :GET, + name: "GET", kind: :server, parent_span_id: 13_235_353_014_750_950_193 )} refute_receive {:span, span( - name: :GET, + name: "GET", kind: :server, parent_span_id: :undefined )} @@ -210,7 +210,7 @@ defmodule OpentelemetryBanditTest do assert_receive {:span, span( - name: :GET, + name: "GET", attributes: span_attrs )} @@ -334,7 +334,7 @@ defmodule OpentelemetryBanditTest do assert_receive {:span, span( - name: :GET, + name: "GET", kind: :server, attributes: span_attrs )} @@ -385,7 +385,7 @@ defmodule OpentelemetryBanditTest do assert_receive {:span, span( - name: :GET, + name: "GET", attributes: span_attrs, events: events, status: ^expected_status @@ -434,7 +434,7 @@ defmodule OpentelemetryBanditTest do assert_receive {:span, span( - name: :GET, + name: "GET", attributes: span_attributes, events: events, status: ^expected_status @@ -467,7 +467,7 @@ defmodule OpentelemetryBanditTest do assert_receive {:span, span( - name: :GET, + name: "GET", attributes: span_attributes, events: events, status: ^expected_status @@ -488,6 +488,19 @@ defmodule OpentelemetryBanditTest do assert [] = :otel_events.list(events) end + test "updates span name with route from conn.private[:plug_route]" do + OpentelemetryBandit.setup() + port = start_server() + + Req.get("http://localhost:#{port}/with_route") + + assert_receive {:span, + span( + name: "GET /items/:id", + kind: :server + )} + end + test "with halted request" do OpentelemetryBandit.setup() port = start_server() @@ -498,7 +511,7 @@ defmodule OpentelemetryBanditTest do assert_receive {:span, span( - name: :GET, + name: "GET", kind: :server, attributes: span_attrs, status: ^expected_status @@ -522,6 +535,12 @@ defmodule OpentelemetryBanditTest do conn |> send_resp(200, "OK") end + def with_route(conn) do + conn + |> put_private(:plug_route, {"/items/:id", fn -> nil end}) + |> send_resp(200, "OK") + end + def with_body(conn) do conn |> put_resp_content_type("application/json") From c0df875ea9e24a136565c241fec94b0601b5abb4 Mon Sep 17 00:00:00 2001 From: Pedro Nascimento Date: Fri, 6 Mar 2026 03:41:13 -0300 Subject: [PATCH 2/5] Sanitize unknown methods in span name update Avoid unbounded cardinality by mapping non-standard HTTP methods to "HTTP" in maybe_update_span_name, matching the initial span name logic. The exception handler cannot update the span name with the route because Bandit's exception telemetry uses the original conn from before the Plug handler ran, so conn.private[:plug_route] is not available. --- .../opentelemetry_bandit/lib/opentelemetry_bandit.ex | 9 ++++++++- instrumentation/opentelemetry_bandit/mix.lock | 6 +++--- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/instrumentation/opentelemetry_bandit/lib/opentelemetry_bandit.ex b/instrumentation/opentelemetry_bandit/lib/opentelemetry_bandit.ex index 1b09831d..cb21881b 100644 --- a/instrumentation/opentelemetry_bandit/lib/opentelemetry_bandit.ex +++ b/instrumentation/opentelemetry_bandit/lib/opentelemetry_bandit.ex @@ -477,13 +477,20 @@ defmodule OpentelemetryBandit do defp maybe_update_span_name(conn) do case conn.private do %{plug_route: {route, _fun}} -> - Tracer.update_name("#{conn.method} #{route}") + method = sanitize_method(conn.method) + Tracer.update_name("#{method} #{route}") _ -> :ok end end + defp sanitize_method(method) do + if parse_method(method) == HTTPAttributes.http_request_method_values().other, + do: "HTTP", + else: method + end + @doc false def handle_request_exception(meta, config) do Tracer.set_status(OpenTelemetry.status(:error, "")) diff --git a/instrumentation/opentelemetry_bandit/mix.lock b/instrumentation/opentelemetry_bandit/mix.lock index 8482cfde..38afadb9 100644 --- a/instrumentation/opentelemetry_bandit/mix.lock +++ b/instrumentation/opentelemetry_bandit/mix.lock @@ -1,5 +1,5 @@ %{ - "acceptor_pool": {:hex, :acceptor_pool, "1.0.1", "d88c2e8a0be9216cf513fbcd3e5a4beb36bee3ff4168e85d6152c6f899359cdb", [], [], "hexpm", "f172f3d74513e8edd445c257d596fc84dbdd56d2c6fa287434269648ae5a421e"}, + "acceptor_pool": {:hex, :acceptor_pool, "1.0.1", "d88c2e8a0be9216cf513fbcd3e5a4beb36bee3ff4168e85d6152c6f899359cdb", [:rebar3], [], "hexpm", "f172f3d74513e8edd445c257d596fc84dbdd56d2c6fa287434269648ae5a421e"}, "bandit": {:hex, :bandit, "1.10.3", "1e5d168fa79ec8de2860d1b4d878d97d4fbbe2fdbe7b0a7d9315a4359d1d4bb9", [:mix], [{:hpax, "~> 1.0", [hex: :hpax, repo: "hexpm", optional: false]}, {:plug, "~> 1.18", [hex: :plug, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}, {:thousand_island, "~> 1.0", [hex: :thousand_island, repo: "hexpm", optional: false]}, {:websock, "~> 0.5", [hex: :websock, repo: "hexpm", optional: false]}], "hexpm", "99a52d909c48db65ca598e1962797659e3c0f1d06e825a50c3d75b74a5e2db18"}, "chatterbox": {:hex, :ts_chatterbox, "0.15.1", "5cac4d15dd7ad61fc3c4415ce4826fc563d4643dee897a558ec4ea0b1c835c9c", [:rebar3], [{:hpack, "~> 0.3.0", [hex: :hpack_erl, repo: "hexpm", optional: false]}], "hexpm", "4f75b91451338bc0da5f52f3480fa6ef6e3a2aeecfc33686d6b3d0a0948f31aa"}, "ctx": {:hex, :ctx, "0.6.0", "8ff88b70e6400c4df90142e7f130625b82086077a45364a78d208ed3ed53c7fe", [:rebar3], [], "hexpm", "a14ed2d1b67723dbebbe423b28d7615eb0bdcba6ff28f2d1f1b0a7e1d4aa5fc2"}, @@ -18,9 +18,9 @@ "makeup_elixir": {:hex, :makeup_elixir, "1.0.1", "e928a4f984e795e41e3abd27bfc09f51db16ab8ba1aebdba2b3a575437efafc2", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.2.3 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "7284900d412a3e5cfd97fdaed4f5ed389b8f2b4cb49efc0eb3bd10e2febf9507"}, "makeup_erlang": {:hex, :makeup_erlang, "1.0.3", "4252d5d4098da7415c390e847c814bad3764c94a814a0b4245176215615e1035", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "953297c02582a33411ac6208f2c6e55f0e870df7f80da724ed613f10e6706afd"}, "mime": {:hex, :mime, "2.0.7", "b8d739037be7cd402aee1ba0306edfdef982687ee7e9859bee6198c1e7e2f128", [:mix], [], "hexpm", "6171188e399ee16023ffc5b76ce445eb6d9672e2e241d2df6050f3c771e80ccd"}, - "mint": {:hex, :mint, "1.7.1", "113fdb2b2f3b59e47c7955971854641c61f378549d73e829e1768de90fc1abf1", [], [{:castore, "~> 0.1.0 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:hpax, "~> 0.1.1 or ~> 0.2.0 or ~> 1.0", [hex: :hpax, repo: "hexpm", optional: false]}], "hexpm", "fceba0a4d0f24301ddee3024ae116df1c3f4bb7a563a731f45fdfeb9d39a231b"}, + "mint": {:hex, :mint, "1.7.1", "113fdb2b2f3b59e47c7955971854641c61f378549d73e829e1768de90fc1abf1", [:mix], [{:castore, "~> 0.1.0 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:hpax, "~> 0.1.1 or ~> 0.2.0 or ~> 1.0", [hex: :hpax, repo: "hexpm", optional: false]}], "hexpm", "fceba0a4d0f24301ddee3024ae116df1c3f4bb7a563a731f45fdfeb9d39a231b"}, "nimble_options": {:hex, :nimble_options, "1.1.1", "e3a492d54d85fc3fd7c5baf411d9d2852922f66e69476317787a7b2bb000a61b", [:mix], [], "hexpm", "821b2470ca9442c4b6984882fe9bb0389371b8ddec4d45a9504f00a66f650b44"}, - "nimble_parsec": {:hex, :nimble_parsec, "1.4.2", "8efba0122db06df95bfaa78f791344a89352ba04baedd3849593bfce4d0dc1c6", [], [], "hexpm", "4b21398942dda052b403bbe1da991ccd03a053668d147d53fb8c4e0efe09c973"}, + "nimble_parsec": {:hex, :nimble_parsec, "1.4.2", "8efba0122db06df95bfaa78f791344a89352ba04baedd3849593bfce4d0dc1c6", [:mix], [], "hexpm", "4b21398942dda052b403bbe1da991ccd03a053668d147d53fb8c4e0efe09c973"}, "nimble_pool": {:hex, :nimble_pool, "1.1.0", "bf9c29fbdcba3564a8b800d1eeb5a3c58f36e1e11d7b7fb2e084a643f645f06b", [:mix], [], "hexpm", "af2e4e6b34197db81f7aad230c1118eac993acc0dae6bc83bac0126d4ae0813a"}, "opentelemetry": {:hex, :opentelemetry, "1.7.0", "20d0f12d3d1c398d3670fd44fd1a7c495dd748ab3e5b692a7906662e2fb1a38a", [:rebar3], [{:opentelemetry_api, "~> 1.5.0", [hex: :opentelemetry_api, repo: "hexpm", optional: false]}], "hexpm", "a9173b058c4549bf824cbc2f1d2fa2adc5cdedc22aa3f0f826951187bbd53131"}, "opentelemetry_api": {:hex, :opentelemetry_api, "1.5.0", "1a676f3e3340cab81c763e939a42e11a70c22863f645aa06aafefc689b5550cf", [:mix, :rebar3], [], "hexpm", "f53ec8a1337ae4a487d43ac89da4bd3a3c99ddf576655d071deed8b56a2d5dda"}, From 3bf3271ecbe188827f30baeb3c4a6466de013e66 Mon Sep 17 00:00:00 2001 From: Pedro Nascimento Date: Fri, 6 Mar 2026 03:55:19 -0300 Subject: [PATCH 3/5] Set http.route attribute and add POST/5xx route tests - Set HTTPAttributes.http_route() attribute when route is available - Add test for POST method with route update - Add test for 5xx response with route update --- .../lib/opentelemetry_bandit.ex | 1 + .../test/bandit/opentelemetry_bandit_test.exs | 61 ++++++++++++++++++- 2 files changed, 60 insertions(+), 2 deletions(-) diff --git a/instrumentation/opentelemetry_bandit/lib/opentelemetry_bandit.ex b/instrumentation/opentelemetry_bandit/lib/opentelemetry_bandit.ex index cb21881b..289c47a2 100644 --- a/instrumentation/opentelemetry_bandit/lib/opentelemetry_bandit.ex +++ b/instrumentation/opentelemetry_bandit/lib/opentelemetry_bandit.ex @@ -479,6 +479,7 @@ defmodule OpentelemetryBandit do %{plug_route: {route, _fun}} -> method = sanitize_method(conn.method) Tracer.update_name("#{method} #{route}") + Tracer.set_attribute(HTTPAttributes.http_route(), route) _ -> :ok diff --git a/instrumentation/opentelemetry_bandit/test/bandit/opentelemetry_bandit_test.exs b/instrumentation/opentelemetry_bandit/test/bandit/opentelemetry_bandit_test.exs index 9820662c..1d7a611f 100644 --- a/instrumentation/opentelemetry_bandit/test/bandit/opentelemetry_bandit_test.exs +++ b/instrumentation/opentelemetry_bandit/test/bandit/opentelemetry_bandit_test.exs @@ -488,7 +488,7 @@ defmodule OpentelemetryBanditTest do assert [] = :otel_events.list(events) end - test "updates span name with route from conn.private[:plug_route]" do + test "updates span name and sets http.route from conn.private[:plug_route]" do OpentelemetryBandit.setup() port = start_server() @@ -497,8 +497,52 @@ defmodule OpentelemetryBanditTest do assert_receive {:span, span( name: "GET /items/:id", - kind: :server + kind: :server, + attributes: span_attrs + )} + + assert Map.get(:otel_attributes.map(span_attrs), HTTPAttributes.http_route()) == + "/items/:id" + end + + test "updates span name with POST method and route" do + OpentelemetryBandit.setup() + port = start_server() + + Req.post("http://localhost:#{port}/post_with_route", body: "") + + assert_receive {:span, + span( + name: "POST /items", + kind: :server, + attributes: span_attrs + )} + + attrs = :otel_attributes.map(span_attrs) + assert Map.get(attrs, HTTPAttributes.http_route()) == "/items" + assert Map.get(attrs, HTTPAttributes.http_response_status_code()) == 201 + end + + test "updates span name with route on 5xx response" do + OpentelemetryBandit.setup() + port = start_server() + + Req.get("http://localhost:#{port}/error_with_route", retry: false) + + expected_status = OpenTelemetry.status(:error, "") + + assert_receive {:span, + span( + name: "GET /items/:id", + kind: :server, + attributes: span_attrs, + status: ^expected_status )} + + attrs = :otel_attributes.map(span_attrs) + assert Map.get(attrs, HTTPAttributes.http_route()) == "/items/:id" + assert Map.get(attrs, HTTPAttributes.http_response_status_code()) == 500 + assert Map.get(attrs, ErrorAttributes.error_type()) == "500" end test "with halted request" do @@ -541,6 +585,19 @@ defmodule OpentelemetryBanditTest do |> send_resp(200, "OK") end + def post_with_route(conn) do + conn + |> put_private(:plug_route, {"/items", fn -> nil end}) + |> send_resp(201, "Created") + end + + def error_with_route(conn) do + conn + |> put_private(:plug_route, {"/items/:id", fn -> nil end}) + |> send_resp(500, "Internal Server Error") + |> halt() + end + def with_body(conn) do conn |> put_resp_content_type("application/json") From 98285aea28259419c5c58553eb9290f6b8ca6334 Mon Sep 17 00:00:00 2001 From: Pedro Nascimento Date: Tue, 10 Mar 2026 00:46:23 -0300 Subject: [PATCH 4/5] Revert changing of atoms to strings --- .../lib/opentelemetry_bandit.ex | 6 ++--- .../test/bandit/opentelemetry_bandit_test.exs | 26 +++++++++---------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/instrumentation/opentelemetry_bandit/lib/opentelemetry_bandit.ex b/instrumentation/opentelemetry_bandit/lib/opentelemetry_bandit.ex index 289c47a2..279de14e 100644 --- a/instrumentation/opentelemetry_bandit/lib/opentelemetry_bandit.ex +++ b/instrumentation/opentelemetry_bandit/lib/opentelemetry_bandit.ex @@ -239,8 +239,8 @@ defmodule OpentelemetryBandit do name = if request_method == HTTPAttributes.http_request_method_values().other, - do: "HTTP", - else: conn.method + do: :HTTP, + else: request_method if public_endpoint?(conn, config) do propagated_ctx = @@ -264,7 +264,7 @@ defmodule OpentelemetryBandit do # error with no conn def handle_request_start(_meta, _config) do - Tracer.start_span("HTTP", %{kind: :server}) + Tracer.start_span(:HTTP, %{kind: :server}) |> Tracer.set_current_span() end diff --git a/instrumentation/opentelemetry_bandit/test/bandit/opentelemetry_bandit_test.exs b/instrumentation/opentelemetry_bandit/test/bandit/opentelemetry_bandit_test.exs index 1d7a611f..eb768be9 100644 --- a/instrumentation/opentelemetry_bandit/test/bandit/opentelemetry_bandit_test.exs +++ b/instrumentation/opentelemetry_bandit/test/bandit/opentelemetry_bandit_test.exs @@ -73,7 +73,7 @@ defmodule OpentelemetryBanditTest do assert_receive {:span, span( - name: "GET", + name: :GET, kind: :server, attributes: span_attrs, parent_span_id: 13_235_353_014_750_950_193 @@ -112,14 +112,14 @@ defmodule OpentelemetryBanditTest do refute_receive {:span, span( - name: "GET", + name: :GET, kind: :server, parent_span_id: 13_235_353_014_750_950_193 )} assert_receive {:span, span( - name: "GET", + name: :GET, kind: :server, links: links, parent_span_id: :undefined @@ -147,14 +147,14 @@ defmodule OpentelemetryBanditTest do refute_receive {:span, span( - name: "GET", + name: :GET, kind: :server, parent_span_id: 13_235_353_014_750_950_193 )} assert_receive {:span, span( - name: "GET", + name: :GET, kind: :server, links: links, parent_span_id: :undefined @@ -173,14 +173,14 @@ defmodule OpentelemetryBanditTest do assert_receive {:span, span( - name: "GET", + name: :GET, kind: :server, parent_span_id: 13_235_353_014_750_950_193 )} refute_receive {:span, span( - name: "GET", + name: :GET, kind: :server, parent_span_id: :undefined )} @@ -210,7 +210,7 @@ defmodule OpentelemetryBanditTest do assert_receive {:span, span( - name: "GET", + name: :GET, attributes: span_attrs )} @@ -334,7 +334,7 @@ defmodule OpentelemetryBanditTest do assert_receive {:span, span( - name: "GET", + name: :GET, kind: :server, attributes: span_attrs )} @@ -385,7 +385,7 @@ defmodule OpentelemetryBanditTest do assert_receive {:span, span( - name: "GET", + name: :GET, attributes: span_attrs, events: events, status: ^expected_status @@ -434,7 +434,7 @@ defmodule OpentelemetryBanditTest do assert_receive {:span, span( - name: "GET", + name: :GET, attributes: span_attributes, events: events, status: ^expected_status @@ -467,7 +467,7 @@ defmodule OpentelemetryBanditTest do assert_receive {:span, span( - name: "GET", + name: :GET, attributes: span_attributes, events: events, status: ^expected_status @@ -555,7 +555,7 @@ defmodule OpentelemetryBanditTest do assert_receive {:span, span( - name: "GET", + name: :GET, kind: :server, attributes: span_attrs, status: ^expected_status From 4420180af2e5c3489aa4cd0a19c0e0e9c530e7cb Mon Sep 17 00:00:00 2001 From: Pedro Nascimento Date: Tue, 10 Mar 2026 00:49:12 -0300 Subject: [PATCH 5/5] Revert mix.lock changes --- instrumentation/opentelemetry_bandit/mix.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/instrumentation/opentelemetry_bandit/mix.lock b/instrumentation/opentelemetry_bandit/mix.lock index 38afadb9..8482cfde 100644 --- a/instrumentation/opentelemetry_bandit/mix.lock +++ b/instrumentation/opentelemetry_bandit/mix.lock @@ -1,5 +1,5 @@ %{ - "acceptor_pool": {:hex, :acceptor_pool, "1.0.1", "d88c2e8a0be9216cf513fbcd3e5a4beb36bee3ff4168e85d6152c6f899359cdb", [:rebar3], [], "hexpm", "f172f3d74513e8edd445c257d596fc84dbdd56d2c6fa287434269648ae5a421e"}, + "acceptor_pool": {:hex, :acceptor_pool, "1.0.1", "d88c2e8a0be9216cf513fbcd3e5a4beb36bee3ff4168e85d6152c6f899359cdb", [], [], "hexpm", "f172f3d74513e8edd445c257d596fc84dbdd56d2c6fa287434269648ae5a421e"}, "bandit": {:hex, :bandit, "1.10.3", "1e5d168fa79ec8de2860d1b4d878d97d4fbbe2fdbe7b0a7d9315a4359d1d4bb9", [:mix], [{:hpax, "~> 1.0", [hex: :hpax, repo: "hexpm", optional: false]}, {:plug, "~> 1.18", [hex: :plug, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}, {:thousand_island, "~> 1.0", [hex: :thousand_island, repo: "hexpm", optional: false]}, {:websock, "~> 0.5", [hex: :websock, repo: "hexpm", optional: false]}], "hexpm", "99a52d909c48db65ca598e1962797659e3c0f1d06e825a50c3d75b74a5e2db18"}, "chatterbox": {:hex, :ts_chatterbox, "0.15.1", "5cac4d15dd7ad61fc3c4415ce4826fc563d4643dee897a558ec4ea0b1c835c9c", [:rebar3], [{:hpack, "~> 0.3.0", [hex: :hpack_erl, repo: "hexpm", optional: false]}], "hexpm", "4f75b91451338bc0da5f52f3480fa6ef6e3a2aeecfc33686d6b3d0a0948f31aa"}, "ctx": {:hex, :ctx, "0.6.0", "8ff88b70e6400c4df90142e7f130625b82086077a45364a78d208ed3ed53c7fe", [:rebar3], [], "hexpm", "a14ed2d1b67723dbebbe423b28d7615eb0bdcba6ff28f2d1f1b0a7e1d4aa5fc2"}, @@ -18,9 +18,9 @@ "makeup_elixir": {:hex, :makeup_elixir, "1.0.1", "e928a4f984e795e41e3abd27bfc09f51db16ab8ba1aebdba2b3a575437efafc2", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.2.3 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "7284900d412a3e5cfd97fdaed4f5ed389b8f2b4cb49efc0eb3bd10e2febf9507"}, "makeup_erlang": {:hex, :makeup_erlang, "1.0.3", "4252d5d4098da7415c390e847c814bad3764c94a814a0b4245176215615e1035", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "953297c02582a33411ac6208f2c6e55f0e870df7f80da724ed613f10e6706afd"}, "mime": {:hex, :mime, "2.0.7", "b8d739037be7cd402aee1ba0306edfdef982687ee7e9859bee6198c1e7e2f128", [:mix], [], "hexpm", "6171188e399ee16023ffc5b76ce445eb6d9672e2e241d2df6050f3c771e80ccd"}, - "mint": {:hex, :mint, "1.7.1", "113fdb2b2f3b59e47c7955971854641c61f378549d73e829e1768de90fc1abf1", [:mix], [{:castore, "~> 0.1.0 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:hpax, "~> 0.1.1 or ~> 0.2.0 or ~> 1.0", [hex: :hpax, repo: "hexpm", optional: false]}], "hexpm", "fceba0a4d0f24301ddee3024ae116df1c3f4bb7a563a731f45fdfeb9d39a231b"}, + "mint": {:hex, :mint, "1.7.1", "113fdb2b2f3b59e47c7955971854641c61f378549d73e829e1768de90fc1abf1", [], [{:castore, "~> 0.1.0 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:hpax, "~> 0.1.1 or ~> 0.2.0 or ~> 1.0", [hex: :hpax, repo: "hexpm", optional: false]}], "hexpm", "fceba0a4d0f24301ddee3024ae116df1c3f4bb7a563a731f45fdfeb9d39a231b"}, "nimble_options": {:hex, :nimble_options, "1.1.1", "e3a492d54d85fc3fd7c5baf411d9d2852922f66e69476317787a7b2bb000a61b", [:mix], [], "hexpm", "821b2470ca9442c4b6984882fe9bb0389371b8ddec4d45a9504f00a66f650b44"}, - "nimble_parsec": {:hex, :nimble_parsec, "1.4.2", "8efba0122db06df95bfaa78f791344a89352ba04baedd3849593bfce4d0dc1c6", [:mix], [], "hexpm", "4b21398942dda052b403bbe1da991ccd03a053668d147d53fb8c4e0efe09c973"}, + "nimble_parsec": {:hex, :nimble_parsec, "1.4.2", "8efba0122db06df95bfaa78f791344a89352ba04baedd3849593bfce4d0dc1c6", [], [], "hexpm", "4b21398942dda052b403bbe1da991ccd03a053668d147d53fb8c4e0efe09c973"}, "nimble_pool": {:hex, :nimble_pool, "1.1.0", "bf9c29fbdcba3564a8b800d1eeb5a3c58f36e1e11d7b7fb2e084a643f645f06b", [:mix], [], "hexpm", "af2e4e6b34197db81f7aad230c1118eac993acc0dae6bc83bac0126d4ae0813a"}, "opentelemetry": {:hex, :opentelemetry, "1.7.0", "20d0f12d3d1c398d3670fd44fd1a7c495dd748ab3e5b692a7906662e2fb1a38a", [:rebar3], [{:opentelemetry_api, "~> 1.5.0", [hex: :opentelemetry_api, repo: "hexpm", optional: false]}], "hexpm", "a9173b058c4549bf824cbc2f1d2fa2adc5cdedc22aa3f0f826951187bbd53131"}, "opentelemetry_api": {:hex, :opentelemetry_api, "1.5.0", "1a676f3e3340cab81c763e939a42e11a70c22863f645aa06aafefc689b5550cf", [:mix, :rebar3], [], "hexpm", "f53ec8a1337ae4a487d43ac89da4bd3a3c99ddf576655d071deed8b56a2d5dda"},