From 958f0f262eb94975cf7eb926f1f2c40cd4aa52b6 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Fri, 26 Jan 2024 16:25:48 +0100 Subject: [PATCH] Fix compat Signed-off-by: Bob Weinand --- Cargo.lock | 47 ++++++++++++------- ext/compatibility.h | 24 +++++++++- ext/priority_sampling/priority_sampling.c | 28 ++++++++++- ext/serializer.c | 1 + libdatadog | 2 +- tests/Metrics/SigSegV/SigSegVTest.php | 2 +- .../default_unix_domain_socket_agent.phpt | 2 +- tests/ext/close_spans_until.phpt | 22 ++++----- 8 files changed, 93 insertions(+), 35 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c63dc2a3e8..807f3aba1e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -30,14 +30,15 @@ dependencies = [ [[package]] name = "ahash" -version = "0.8.3" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c99f64d1e06488f620f932677e24bc6e2897582980441ae90a671415bd7ec2f" +checksum = "91429305e9f0a25f6205c5b8e0d2db09e0708a7a6df0f42212bb56c32c8ac97a" dependencies = [ "cfg-if", "getrandom", "once_cell", "version_check 0.9.4", + "zerocopy", ] [[package]] @@ -682,7 +683,7 @@ dependencies = [ name = "datadog-php-profiling" version = "0.97.0" dependencies = [ - "ahash 0.8.3", + "ahash 0.8.6", "anyhow", "bindgen", "bumpalo", @@ -780,7 +781,7 @@ dependencies = [ "tokio", "tokio-util 0.7.9", "tracing", - "tracing-log 0.2.0", + "tracing-log", "tracing-subscriber", "uuid", "zwohash", @@ -930,6 +931,7 @@ dependencies = [ "tokio", "tokio-util 0.7.9", "tracing", + "tracing-subscriber", "uuid", ] @@ -3253,17 +3255,6 @@ dependencies = [ "valuable", ] -[[package]] -name = "tracing-log" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922" -dependencies = [ - "lazy_static", - "log", - "tracing-core", -] - [[package]] name = "tracing-log" version = "0.2.0" @@ -3290,9 +3281,9 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.17" +version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30a651bc37f915e81f087d86e62a18eec5f79550c7faff886f7090b4ea757c77" +checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" dependencies = [ "matchers", "nu-ansi-term", @@ -3303,7 +3294,7 @@ dependencies = [ "thread_local", "tracing", "tracing-core", - "tracing-log 0.1.3", + "tracing-log", ] [[package]] @@ -3629,6 +3620,26 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec" +[[package]] +name = "zerocopy" +version = "0.7.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.38", +] + [[package]] name = "zwohash" version = "0.1.2" diff --git a/ext/compatibility.h b/ext/compatibility.h index 01530f1098..e50e5d7398 100644 --- a/ext/compatibility.h +++ b/ext/compatibility.h @@ -4,6 +4,7 @@ #include #include #include +#include #include "ext/standard/base64.h" @@ -86,6 +87,13 @@ static inline zend_long zval_get_long(zval *op) { } return _zval_get_long(op); } + +#include +#if defined(DBL_MANT_DIG) && defined(DBL_MIN_EXP) +#define PHP_DOUBLE_MAX_LENGTH (3 + DBL_MANT_DIG - DBL_MIN_EXP) +#else +#define PHP_DOUBLE_MAX_LENGTH 1080 +#endif #endif #if PHP_VERSION_ID < 70200 @@ -110,7 +118,6 @@ static zend_always_inline zend_string *zend_string_init_interned(const char *str typedef void zend_type; -#include static inline void smart_str_append_printf(smart_str *dest, const char *format, ...) { va_list arg; va_start(arg, format); @@ -324,6 +331,19 @@ static zend_always_inline zend_result add_next_index_object(zval *arg, zend_obje return zend_hash_next_index_insert(Z_ARRVAL_P(arg), &tmp) ? SUCCESS : FAILURE; } +#include
+#define zend_gcvt php_gcvt +#define ZEND_DOUBLE_MAX_LENGTH PHP_DOUBLE_MAX_LENGTH +static inline void smart_str_append_double(smart_str *str, double num, int precision, bool zero_fraction) { + char buf[ZEND_DOUBLE_MAX_LENGTH]; + /* Model snprintf precision behavior. */ + zend_gcvt(num, precision ? precision : 1, '.', 'E', buf); + smart_str_appends(str, buf); + if (zero_fraction && zend_finite(num) && !strchr(buf, '.')) { + smart_str_appendl(str, ".0", 2); + } +} + #endif #if PHP_VERSION_ID < 80200 @@ -357,6 +377,8 @@ static inline zend_string *ddtrace_strpprintf(size_t max_len, const char *format #undef zend_strpprintf #define zend_strpprintf ddtrace_strpprintf +#define ZEND_HASH_ELEMENT(ht, idx) (&ht->arData[idx].val) + #if PHP_VERSION_ID >= 80000 #define zend_weakrefs_hash_add zend_weakrefs_hash_add_fallback #define zend_weakrefs_hash_del zend_weakrefs_hash_del_fallback diff --git a/ext/priority_sampling/priority_sampling.c b/ext/priority_sampling/priority_sampling.c index e6685ed86a..6536818bbb 100644 --- a/ext/priority_sampling/priority_sampling.c +++ b/ext/priority_sampling/priority_sampling.c @@ -12,6 +12,7 @@ #include "ddshared.h" #include "ddtrace.h" #include "span.h" +#include "components/log/log.h" ZEND_EXTERN_MODULE_GLOBALS(ddtrace); @@ -154,6 +155,22 @@ void ddtrace_decide_on_closed_span_sampling(ddtrace_span_data *span) { ddtrace_rule_result result = dd_match_rules(span, &root->span == span && !root->parent_id, root->sampling_rule.rule); if (result.rule != INT32_MAX) { + LOGEV(Debug, { + smart_str buf = {0}; + const char *rule_str = ""; + if (result.rule == -2) { + rule_str = "manual.keep"; + } else if (result.rule == -1) { + rule_str = "manual.drop"; + } else { + zval *rule = ZEND_HASH_ELEMENT(get_DD_TRACE_SAMPLING_RULES(), result.rule); + zai_json_encode(&buf, rule, 0); + smart_str_0(&buf); + rule_str = ZSTR_VAL(buf.s); + } + log("Evaluated sampling rules for span %" PRIu64 " on trace %s. Matched rule %s.", span->span_id, Z_STRVAL(span->root->property_trace_id), rule_str); + smart_str_free(&buf); + }); root->sampling_rule = result; } } @@ -182,8 +199,7 @@ static ddtrace_rule_result dd_decide_on_open_span_sampling(ddtrace_root_span_dat static void dd_decide_on_sampling(ddtrace_root_span_data *span) { int priority; bool is_trace_root = !span->parent_id; - // manual if it's not just inherited, otherwise this value is irrelevant (as sampling priority will be default) - enum dd_sampling_mechanism mechanism = DD_MECHANISM_MANUAL; + enum dd_sampling_mechanism mechanism; ddtrace_rule_result result = dd_decide_on_open_span_sampling(span); double sample_rate = 0; @@ -213,6 +229,13 @@ static void dd_decide_on_sampling(ddtrace_root_span_data *span) { if (!sample_rate_zv) { // Default rate if no service+env pair matches sample_rate_zv = zend_hash_str_find(DDTRACE_G(agent_rate_by_service), ZEND_STRL("service:,env:")); + if (sample_rate_zv) { + LOG(Debug, "Evaluated agent sampling rules for root span for trace %s and applied a default sample_rate of %f", + Z_STRVAL(span->property_trace_id), zval_get_double(sample_rate_zv)); + } + } else { + LOG(Debug, "Evaluated agent sampling rules for root span for trace %s (service: %s, env: %s) and found a sample_rate of %f", + Z_STRVAL(span->property_trace_id), Z_STR_P(service), Z_STR_P(env), zval_get_double(sample_rate_zv)); } if (sample_rate_zv) { sample_rate = zval_get_double(sample_rate_zv); @@ -259,6 +282,7 @@ static void dd_decide_on_sampling(ddtrace_root_span_data *span) { zend_hash_str_del(metrics, ZEND_STRL("_dd.agent_psr")); } else { + // manual if it's not just inherited, otherwise this value is irrelevant (as sampling priority will be default) mechanism = DDTRACE_G(agent_rate_by_service) ? DD_MECHANISM_AGENT_RATE : DD_MECHANISM_DEFAULT; priority = sampling && !limited ? PRIORITY_SAMPLING_AUTO_KEEP : PRIORITY_SAMPLING_AUTO_REJECT; diff --git a/ext/serializer.c b/ext/serializer.c index b982718a98..aaf1d3f1a3 100644 --- a/ext/serializer.c +++ b/ext/serializer.c @@ -1669,6 +1669,7 @@ void ddtrace_serialize_span_to_array(ddtrace_span_data *span, zval *array) { } ZEND_HASH_FOREACH_END(); smart_str_0(&metrics_str); } + prop_name = zend_hash_str_find(Z_ARR_P(el), ZEND_STRL("name")); // refetch, array may have been rehashed log("Encoding span %" PRIu64 ": trace_id=%s, name='%s', service='%s', resource: '%s', type '%s' with tags: %s; and metrics: %s", span->span_id, Z_STRVAL(span->root->property_trace_id), Z_TYPE_P(prop_name) == IS_STRING ? Z_STRVAL_P(prop_name) : "", diff --git a/libdatadog b/libdatadog index 2a2dc7fe92..5cb01c5c0e 160000 --- a/libdatadog +++ b/libdatadog @@ -1 +1 @@ -Subproject commit 2a2dc7fe927331639a55b2e76555087d6faa3e94 +Subproject commit 5cb01c5c0efc9d36896b1c641209747441d08fec diff --git a/tests/Metrics/SigSegV/SigSegVTest.php b/tests/Metrics/SigSegV/SigSegVTest.php index 040c6a8915..76efdc7cbe 100644 --- a/tests/Metrics/SigSegV/SigSegVTest.php +++ b/tests/Metrics/SigSegV/SigSegVTest.php @@ -45,6 +45,6 @@ public function testGet() self::assertFileExists($log); $contents = \file_get_contents($log); - self::assertRegExp("/.*Segmentation fault\n.*sigsegv health metric sent/", $contents); + self::assertRegExp("/.*Segmentation fault/", $contents); } } diff --git a/tests/ext/background-sender/default_unix_domain_socket_agent.phpt b/tests/ext/background-sender/default_unix_domain_socket_agent.phpt index ab5f78a272..c0a08dd4d7 100644 --- a/tests/ext/background-sender/default_unix_domain_socket_agent.phpt +++ b/tests/ext/background-sender/default_unix_domain_socket_agent.phpt @@ -15,7 +15,7 @@ if (!file_exists("/var/run/datadog/apm.socket")) { RequestReplayer::launchUnixProxy("/var/run/datadog/apm.socket"); } -$logs = dd_get_startup_logs([], ['DD_TRACE_LOG_LEVEL=info,startup=off']); +$logs = dd_get_startup_logs([], ['DD_TRACE_LOG_LEVEL=error,startup=info']); dd_dump_startup_logs($logs, [ 'agent_error', // should be absent diff --git a/tests/ext/close_spans_until.phpt b/tests/ext/close_spans_until.phpt index 311f0626d7..33f5209ba1 100644 --- a/tests/ext/close_spans_until.phpt +++ b/tests/ext/close_spans_until.phpt @@ -25,27 +25,27 @@ var_dump(DDTrace\close_spans_until(null)); ?> --EXPECTF-- -[ddtrace] [span] Creating new root SpanStack: 1, parent_stack: 0 -[ddtrace] [span] Creating new root SpanStack: 3, parent_stack: 1 -[ddtrace] [span] Switching to different SpanStack: 3 -[ddtrace] [span] Starting new root span: trace_id=%s, span_id=%d, parent_id=0, SpanStack=3, parent_SpanStack=1 -[ddtrace] [span] Starting new span: trace_id=%s, span_id=%d, parent_id=%d, SpanStack=3 -[ddtrace] [span] Starting new span: trace_id=%s, span_id=%d, parent_id=%d, SpanStack=3 -[ddtrace] [span] Starting new span: trace_id=%s, span_id=%d, parent_id=%d, SpanStack=3 +[ddtrace] [span] Creating new root SpanStack: %d, parent_stack: 0 +[ddtrace] [span] Creating new root SpanStack: %d, parent_stack: %d +[ddtrace] [span] Switching to different SpanStack: %d +[ddtrace] [span] Starting new root span: trace_id=%s, span_id=%d, parent_id=0, SpanStack=%d, parent_SpanStack=%d +[ddtrace] [span] Starting new span: trace_id=%s, span_id=%d, parent_id=%d, SpanStack=%d +[ddtrace] [span] Starting new span: trace_id=%s, span_id=%d, parent_id=%d, SpanStack=%d +[ddtrace] [span] Starting new span: trace_id=%s, span_id=%d, parent_id=%d, SpanStack=%d bool(false) [ddtrace] [span] Closing span: trace_id=%s, span_id=%d [ddtrace] [span] Closing span: trace_id=%s, span_id=%d int(2) -[ddtrace] [span] Starting new span: trace_id=%s, span_id=%d, parent_id=%d, SpanStack=3 -[ddtrace] [span] Starting new span: trace_id=%s, span_id=%d, parent_id=%d, SpanStack=3 -[ddtrace] [span] Starting new span: trace_id=%s, span_id=%d, parent_id=%d, SpanStack=3 +[ddtrace] [span] Starting new span: trace_id=%s, span_id=%d, parent_id=%d, SpanStack=%d +[ddtrace] [span] Starting new span: trace_id=%s, span_id=%d, parent_id=%d, SpanStack=%d +[ddtrace] [span] Starting new span: trace_id=%s, span_id=%d, parent_id=%d, SpanStack=%d [ddtrace] [span] Closing span: trace_id=%s, span_id=%d [ddtrace] [span] Closing span: trace_id=%s, span_id=%d int(2) [ddtrace] [span] Closing span: trace_id=%s, span_id=%d [ddtrace] [span] Closing span: trace_id=%s, span_id=%d [ddtrace] [span] Closing root span: trace_id=%s, span_id=%d -[ddtrace] [span] Switching to different SpanStack: 1 +[ddtrace] [span] Switching to different SpanStack: %d int(1) int(0) [ddtrace] [span] Encoding span %d: trace_id=%s, name='close_spans_until.php', service='close_spans_until.php', resource: 'close_spans_until.php', type 'cli' with tags: runtime-id='%s', _dd.p.dm='-0', _dd.p.tid='%s'; and metrics: process_id='%d', _dd.agent_psr='1', _sampling_priority_v1='1', php.compilation.total_time_ms='%f'