diff --git a/integration_tests/datadog_helpers.rb b/integration_tests/datadog_helpers.rb index a9816d91..41f99d0f 100644 --- a/integration_tests/datadog_helpers.rb +++ b/integration_tests/datadog_helpers.rb @@ -2,6 +2,11 @@ module DatadogHelpers DATADOG_VERSION = defined?(DDTrace) ? DDTrace::VERSION : Datadog::VERSION + ERROR_TAG = if Gem::Version.new(DATADOG_VERSION::STRING) >= Gem::Version.new("1.8.0") + "error.message" + else + "error.msg" + end private @@ -19,21 +24,10 @@ module DatadogHelpers assert span.get_tag("http.method") == verb assert span.get_tag("http.url") == uri.path - error_tag = if Gem::Version.new(DATADOG_VERSION::STRING) >= Gem::Version.new("1.8.0") - "error.message" - else - "error.msg" - end - if status && status >= 400 - assert span.get_tag("http.status_code") == status.to_s - assert span.get_tag("error.type") == error # "Error #{status}" - # assert !span.get_tag(error_tag).nil? - assert span.status == 1 + verify_http_error_span(span, status, error) elsif error - assert span.get_tag("error.type") == "HTTPX::NativeResolveError" - assert !span.get_tag(error_tag).nil? - assert span.status == 1 + verify_error_span(span) else assert span.status.zero? assert span.get_tag("http.status_code") == status.to_s @@ -42,6 +36,19 @@ module DatadogHelpers end end + def verify_http_error_span(span, status, error) + assert span.get_tag("http.status_code") == status.to_s + assert span.get_tag("error.type") == error + assert !span.get_tag(ERROR_TAG).nil? + assert span.status == 1 + end + + def verify_error_span(span) + assert span.get_tag("error.type") == "HTTPX::NativeResolveError" + assert !span.get_tag(ERROR_TAG).nil? + assert span.status == 1 + end + def verify_no_distributed_headers(request_headers) assert !request_headers.key?("x-datadog-parent-id") assert !request_headers.key?("x-datadog-trace-id") diff --git a/integration_tests/datadog_test.rb b/integration_tests/datadog_test.rb index 7d1a77c7..6d6a15f1 100644 --- a/integration_tests/datadog_test.rb +++ b/integration_tests/datadog_test.rb @@ -208,6 +208,7 @@ class DatadogTest < Minitest::Test def teardown super Datadog.registry[:httpx].reset_configuration! + Datadog.configuration.tracing[:httpx].enabled = false end def datadog_service_name diff --git a/integration_tests/faraday_datadog_test.rb b/integration_tests/faraday_datadog_test.rb new file mode 100644 index 00000000..0e86d330 --- /dev/null +++ b/integration_tests/faraday_datadog_test.rb @@ -0,0 +1,188 @@ +# frozen_string_literal: true + +begin + # upcoming 2.0 + require "datadog" +rescue LoadError + require "ddtrace" +end + +require "test_helper" +require "support/http_helpers" +require "httpx/adapters/faraday" +require_relative "datadog_helpers" + +DATADOG_VERSION = defined?(DDTrace) ? DDTrace::VERSION : Datadog::VERSION + +class FaradayDatadogTest < Minitest::Test + include HTTPHelpers + include DatadogHelpers + include FaradayHelpers + + def test_faraday_datadog_successful_get_request + set_datadog + uri = URI(build_uri("/status/200")) + + response = faraday_connection.get(uri) + verify_status(response, 200) + + assert !fetch_spans.empty?, "expected to have spans" + verify_instrumented_request(response.status, verb: "GET", uri: uri) + verify_distributed_headers(request_headers(response)) + end + + def test_faraday_datadog_successful_post_request + set_datadog + uri = URI(build_uri("/status/200")) + + response = faraday_connection.post(uri, "bla") + verify_status(response, 200) + + assert !fetch_spans.empty?, "expected to have spans" + verify_instrumented_request(response.status, verb: "POST", uri: uri) + verify_distributed_headers(request_headers(response)) + end + + def test_faraday_datadog_server_error_request + set_datadog + uri = URI(build_uri("/status/500")) + + ex = assert_raises(Faraday::ServerError) { faraday_connection.get(uri) } + + assert !fetch_spans.empty?, "expected to have spans" + verify_instrumented_request(ex.response[:status], verb: "GET", uri: uri, error: "Error 500") + + verify_distributed_headers(request_headers(ex.response)) + end + + def test_faraday_datadog_client_error_request + set_datadog + uri = URI(build_uri("/status/404")) + + ex = assert_raises(Faraday::ResourceNotFound) { faraday_connection.get(uri) } + + assert !fetch_spans.empty?, "expected to have spans" + verify_instrumented_request(ex.response[:status], verb: "GET", uri: uri, error: "Error 404") + verify_distributed_headers(request_headers(ex.response)) + end + + def test_faraday_datadog_some_other_error + set_datadog + uri = URI("http://unexisting/") + + assert_raises(HTTPX::NativeResolveError) { faraday_connection.get(uri) } + + assert !fetch_spans.empty?, "expected to have spans" + verify_instrumented_request(nil, verb: "GET", uri: uri, error: "HTTPX::NativeResolveError") + end + + def test_faraday_datadog_host_config + uri = URI(build_uri("/status/200")) + set_datadog(describe: /#{uri.host}/) do |http| + http.service_name = "httpbin" + http.split_by_domain = false + end + + response = faraday_connection.get(uri) + verify_status(response, 200) + + assert !fetch_spans.empty?, "expected to have spans" + verify_instrumented_request(response.status, service: "httpbin", verb: "GET", uri: uri) + verify_distributed_headers(request_headers(response)) + end + + def test_faraday_datadog_split_by_domain + uri = URI(build_uri("/status/200")) + set_datadog do |http| + http.split_by_domain = true + end + + response = faraday_connection.get(uri) + verify_status(response, 200) + + assert !fetch_spans.empty?, "expected to have spans" + verify_instrumented_request(response.status, service: uri.host, verb: "GET", uri: uri) + verify_distributed_headers(request_headers(response)) + end + + def test_faraday_datadog_distributed_headers_disabled + set_datadog(distributed_tracing: false) + uri = URI(build_uri("/status/200")) + + sampling_priority = 10 + response = trace_with_sampling_priority(sampling_priority) do + faraday_connection.get(uri) + end + verify_status(response, 200) + + assert !fetch_spans.empty?, "expected to have spans" + span = fetch_spans.last + verify_instrumented_request(response.status, span: span, verb: "GET", uri: uri) + verify_no_distributed_headers(request_headers(response)) + verify_analytics_headers(span) + end + + def test_faraday_datadog_distributed_headers_sampling_priority + set_datadog + uri = URI(build_uri("/status/200")) + + sampling_priority = 10 + response = trace_with_sampling_priority(sampling_priority) do + faraday_connection.get(uri) + end + + verify_status(response, 200) + + assert !fetch_spans.empty?, "expected to have spans" + span = fetch_spans.last + verify_instrumented_request(response.status, span: span, verb: "GET", uri: uri) + verify_distributed_headers(request_headers(response), span: span, sampling_priority: sampling_priority) + verify_analytics_headers(span) + end + + def test_faraday_datadog_analytics_enabled + set_datadog(analytics_enabled: true) + uri = URI(build_uri("/status/200")) + + response = faraday_connection.get(uri) + verify_status(response, 200) + + assert !fetch_spans.empty?, "expected to have spans" + span = fetch_spans.last + verify_instrumented_request(response.status, span: span, verb: "GET", uri: uri) + verify_analytics_headers(span, sample_rate: 1.0) + end + + def test_faraday_datadog_analytics_sample_rate + set_datadog(analytics_enabled: true, analytics_sample_rate: 0.5) + uri = URI(build_uri("/status/200")) + + response = faraday_connection.get(uri) + verify_status(response, 200) + + assert !fetch_spans.empty?, "expected to have spans" + span = fetch_spans.last + verify_instrumented_request(response.status, span: span, verb: "GET", uri: uri) + verify_analytics_headers(span, sample_rate: 0.5) + end + + private + + def setup + super + Datadog.registry[:faraday].reset_configuration! + end + + def teardown + super + Datadog.registry[:faraday].reset_configuration! + end + + def datadog_service_name + :faraday + end + + def origin(orig = httpbin) + "http://#{orig}" + end +end diff --git a/test/support/faraday_helpers.rb b/test/support/faraday_helpers.rb index 6178873f..2f2d6477 100644 --- a/test/support/faraday_helpers.rb +++ b/test/support/faraday_helpers.rb @@ -36,6 +36,17 @@ module FaradayHelpers end.transform_keys(&:downcase) end + def verify_http_error_span(span, status, error) + assert span.get_tag("http.status_code") == status.to_s + + if status >= 500 || Gem::Version.new(DatadogHelpers::DATADOG_VERSION::STRING) >= Gem::Version.new("2.0.0") + assert span.get_tag("error.type") == error + assert span.status == 1 + else + assert span.status.zero? + end + end + def teardown super