adding test for integration of datadog on top of faraday backed by httpx

This commit is contained in:
HoneyryderChuck 2025-01-22 12:15:29 +00:00
parent 5b59011a89
commit 016ed04f61
4 changed files with 220 additions and 13 deletions

View File

@ -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")

View File

@ -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

View File

@ -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

View File

@ -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