From ed5f895084e5a54a9ec51160453dbafd737c137c Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Fri, 10 Feb 2023 00:45:42 +0100 Subject: [PATCH 1/3] Add IPv6 support to DD_AGENT_HOST Fixes #1667 Signed-off-by: Bob Weinand --- ext/coms.c | 9 ++++++--- .../background_sender_ipv6_support.phpt | 18 ++++++++++++++++++ 2 files changed, 24 insertions(+), 3 deletions(-) create mode 100644 tests/ext/background-sender/background_sender_ipv6_support.phpt diff --git a/ext/coms.c b/ext/coms.c index d64178dea6..942f6ea4fb 100644 --- a/ext/coms.c +++ b/ext/coms.c @@ -658,7 +658,8 @@ static ddtrace_coms_stack_t *_dd_coms_attempt_acquire_stack(void) { } #define TRACE_PATH_STR "/v0.4/traces" -#define HOST_FORMAT_STR "http://%s:%u" +#define HOST_V6_FORMAT_STR "http://[%s]:%u" +#define HOST_V4_FORMAT_STR "http://%s:%u" #define DEFAULT_UDS_PATH "/var/run/datadog/apm.socket" static struct curl_slist *dd_agent_curl_headers = NULL; @@ -729,12 +730,14 @@ char *ddtrace_agent_url(void) { } if (ZSTR_LEN(hostname) > 0) { + bool isIPv6 = memchr(ZSTR_VAL(hostname), ':', ZSTR_LEN(hostname)); + int64_t port = get_global_DD_TRACE_AGENT_PORT(); if (port <= 0 || port > 65535) { port = 8126; } char *formatted_url; - asprintf(&formatted_url, HOST_FORMAT_STR, ZSTR_VAL(hostname), (uint32_t)port); + asprintf(&formatted_url, isIPv6 ? HOST_V6_FORMAT_STR : HOST_V4_FORMAT_STR, ZSTR_VAL(hostname), (uint32_t)port); return formatted_url; } @@ -747,7 +750,7 @@ char *ddtrace_agent_url(void) { port = 8126; } char *formatted_url; - asprintf(&formatted_url, HOST_FORMAT_STR, "localhost", (uint32_t)port); + asprintf(&formatted_url, HOST_V4_FORMAT_STR, "localhost", (uint32_t)port); return formatted_url; } diff --git a/tests/ext/background-sender/background_sender_ipv6_support.phpt b/tests/ext/background-sender/background_sender_ipv6_support.phpt new file mode 100644 index 0000000000..84a7f778b2 --- /dev/null +++ b/tests/ext/background-sender/background_sender_ipv6_support.phpt @@ -0,0 +1,18 @@ +--TEST-- +DD_AGENT_HOST with IPv6 works +--SKIPIF-- + +--ENV-- +DD_AGENT_HOST=::1 +--FILE-- + +--EXPECT-- +agent_url: "http://[::1]:8126" From 6d0ff43ab6d67869a4d31a72090ecadfcce2f87c Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Fri, 10 Feb 2023 00:50:01 +0100 Subject: [PATCH 2/3] Support IPv6 DD_AGENT_HOST in profiler Signed-off-by: Bob Weinand --- profiling/src/lib.rs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/profiling/src/lib.rs b/profiling/src/lib.rs index 64e52cd87d..5e1ec2ba06 100644 --- a/profiling/src/lib.rs +++ b/profiling/src/lib.rs @@ -689,8 +689,13 @@ fn detect_uri_from_config( if port.is_some() || host.is_some() { let host = host.unwrap_or(Cow::Borrowed("localhost")); let port = port.unwrap_or(8126u16); + let url = if host.contains(':') { + format!("http://[{host}]:{port}") + } else { + format!("http://{host}:{port}") + }; - match Uri::from_str(format!("http://{host}:{port}").as_str()) { + match Uri::from_str(url.as_str()) { Ok(uri) => return AgentEndpoint::Uri(uri), Err(err) => { warn!("The combination of DD_AGENT_HOST({host}) and DD_TRACE_AGENT_PORT({port}) was not a valid URL: {err}") From b352b7988ed30620296567ebd9ead62c7f57359b Mon Sep 17 00:00:00 2001 From: Florian Engelhardt Date: Fri, 10 Feb 2023 10:32:02 +0100 Subject: [PATCH 3/3] Add tests for IPv6 agent host --- profiling/src/lib.rs | 62 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/profiling/src/lib.rs b/profiling/src/lib.rs index 5e1ec2ba06..26d120b584 100644 --- a/profiling/src/lib.rs +++ b/profiling/src/lib.rs @@ -1186,3 +1186,65 @@ fn is_zend_mm() -> bool { unsafe { zend::is_zend_mm() } } } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn detect_uri_from_config_works() { + // expected + let endpoint = detect_uri_from_config( + None, + None, + None + ); + let expected = AgentEndpoint::default(); + assert_eq!(endpoint, expected); + + // ipv4 host + let endpoint = detect_uri_from_config( + None, + Some(Cow::Owned("127.0.0.1".to_owned())), + None + ); + let expected = AgentEndpoint::Uri(Uri::from_static("http://127.0.0.1:8126")); + assert_eq!(endpoint, expected); + + // ipv6 host + let endpoint = detect_uri_from_config( + None, + Some(Cow::Owned("::1".to_owned())), + None + ); + let expected = AgentEndpoint::Uri(Uri::from_static("http://[::1]:8126")); + assert_eq!(endpoint, expected); + + // ipv6 host, custom port + let endpoint = detect_uri_from_config( + None, + Some(Cow::Owned("::1".to_owned())), + Some(9000), + ); + let expected = AgentEndpoint::Uri(Uri::from_static("http://[::1]:9000")); + assert_eq!(endpoint, expected); + + // agent_url + let endpoint = detect_uri_from_config( + Some(Cow::Owned("http://[::1]:8126".to_owned())), + None, + None, + ); + let expected = AgentEndpoint::Uri(Uri::from_static("http://[::1]:8126")); + assert_eq!(endpoint, expected); + + // fallback on non existing UDS + let endpoint = detect_uri_from_config( + Some(Cow::Owned("unix://foo/bar/baz/I/do/not/exist".to_owned())), + None, + None, + ); + let expected = AgentEndpoint::default(); + assert_eq!(endpoint, expected); + } +}