From bc11851360ce7b4ca73de7ea544b503366e7e118 Mon Sep 17 00:00:00 2001 From: Erick Dennis Date: Mon, 6 Mar 2023 18:51:05 +0100 Subject: [PATCH] Tesla.Middleware.OpenTelemetry: handle 400 as error (#153) --- .../opentelemetry_tesla_middleware.ex | 2 +- .../opentelemetry_tesla_middleware_test.exs | 77 +++++++++++++------ 2 files changed, 56 insertions(+), 23 deletions(-) diff --git a/instrumentation/opentelemetry_tesla/lib/middleware/opentelemetry_tesla_middleware.ex b/instrumentation/opentelemetry_tesla/lib/middleware/opentelemetry_tesla_middleware.ex index 94b96c2..d041e94 100644 --- a/instrumentation/opentelemetry_tesla/lib/middleware/opentelemetry_tesla_middleware.ex +++ b/instrumentation/opentelemetry_tesla/lib/middleware/opentelemetry_tesla_middleware.ex @@ -59,7 +59,7 @@ defmodule Tesla.Middleware.OpenTelemetry do result end - defp handle_result({:ok, %Tesla.Env{status: status} = env}) when status > 400 do + defp handle_result({:ok, %Tesla.Env{status: status} = env}) when status >= 400 do OpenTelemetry.Tracer.set_status(OpenTelemetry.status(:error, "")) {:ok, env} diff --git a/instrumentation/opentelemetry_tesla/test/middleware/opentelemetry_tesla_middleware_test.exs b/instrumentation/opentelemetry_tesla/test/middleware/opentelemetry_tesla_middleware_test.exs index 097de5f..1f8aaeb 100644 --- a/instrumentation/opentelemetry_tesla/test/middleware/opentelemetry_tesla_middleware_test.exs +++ b/instrumentation/opentelemetry_tesla/test/middleware/opentelemetry_tesla_middleware_test.exs @@ -191,32 +191,65 @@ defmodule Tesla.Middleware.OpenTelemetryTest do assert_receive {:span, span(name: "HTTP GET", attributes: _attributes)} end - test "Marks Span status as :error when HTTP request fails", %{bypass: bypass} do - defmodule TestClient do - def get(client) do - Tesla.get(client, "/users/") + @error_codes [ + 400, + 401, + 402, + 403, + 404, + 405, + 406, + 407, + 408, + 409, + 410, + 411, + 412, + 413, + 414, + 415, + 416, + 417, + 418, + 500, + 501, + 502, + 503, + 504, + 505, + 506, + 507, + 508 + ] + + for code <- @error_codes do + test "Marks Span status as :error when HTTP request fails with #{code}", %{bypass: bypass} do + defmodule TestClient do + def get(client) do + Tesla.get(client, "/users/") + end + + def client(url) do + middleware = [ + {Tesla.Middleware.BaseUrl, url}, + Tesla.Middleware.OpenTelemetry + ] + + Tesla.client(middleware) + end end - def client(url) do - middleware = [ - {Tesla.Middleware.BaseUrl, url}, - Tesla.Middleware.OpenTelemetry - ] + Bypass.expect_once(bypass, "GET", "/users", fn conn -> + Plug.Conn.resp(conn, unquote(code), "") + end) - Tesla.client(middleware) - end + bypass.port + |> endpoint_url() + |> TestClient.client() + |> TestClient.get() + + assert_receive {:span, span(status: {:status, :error, ""})} end - - Bypass.expect_once(bypass, "GET", "/users", fn conn -> - Plug.Conn.resp(conn, 500, "") - end) - - bypass.port - |> endpoint_url() - |> TestClient.client() - |> TestClient.get() - - assert_receive {:span, span(status: {:status, :error, ""})} end test "Marks Span status as :errors when max redirects are exceeded", %{bypass: bypass} do