From a0ee5ccedd5ff034aafef10e58e0eb4386f202ba Mon Sep 17 00:00:00 2001 From: Alejandro Estringana Ruiz Date: Tue, 12 Nov 2024 12:05:01 +0100 Subject: [PATCH] Finish fixing system tests --- ext/distributed_tracing_headers.c | 2 +- ext/handlers_http.h | 31 +++++++++++++++++++++++++++++++ ext/random.c | 10 ---------- ext/serializer.c | 16 ++++++++++------ 4 files changed, 42 insertions(+), 17 deletions(-) diff --git a/ext/distributed_tracing_headers.c b/ext/distributed_tracing_headers.c index 497586404b1..f54a4d06e41 100644 --- a/ext/distributed_tracing_headers.c +++ b/ext/distributed_tracing_headers.c @@ -493,7 +493,7 @@ void ddtrace_apply_distributed_tracing_result(ddtrace_distributed_tracing_result result->meta_tags.pDestructor = NULL; // we moved values directly zend_hash_destroy(&result->meta_tags); - if (result->priority_sampling != DDTRACE_PRIORITY_SAMPLING_UNKNOWN && !get_DD_EXPERIMENTAL_APPSEC_STANDALONE_ENABLED()) { + if (result->priority_sampling != DDTRACE_PRIORITY_SAMPLING_UNKNOWN) { bool reset_decision_maker = result->conflicting_sampling_priority || !zend_hash_str_exists(root_meta, ZEND_STRL("_dd.p.dm")); if (reset_decision_maker) { if (result->priority_sampling > 0) { diff --git a/ext/handlers_http.h b/ext/handlers_http.h index d51384b4547..1c4b48bcde3 100644 --- a/ext/handlers_http.h +++ b/ext/handlers_http.h @@ -138,6 +138,37 @@ static inline void ddtrace_inject_distributed_headers_config(zend_array *array, ddtrace_trace_id trace_id = ddtrace_peek_trace_id(); uint64_t span_id = ddtrace_peek_span_id(); + zval tags; + array_init(&tags); + ddtrace_get_propagated_tags(Z_ARR(tags)); + zval *ddtrace_has_appsec_propagation_tag = zend_hash_str_find(Z_ARR(tags), ZEND_STRL("_dd.p.appsec")); + + zend_array *root_meta = &DDTRACE_G(root_span_tags_preset); + ddtrace_root_span_data *root_span = DDTRACE_G(active_stack)->root_span; + if (root_span) { + root_meta = ddtrace_property_array(&root_span->property_meta); + } + zval *ddtrace_has_asm_avent = zend_hash_str_find(root_meta, ZEND_STRL("_dd.p.appsec")); + + if (get_DD_EXPERIMENTAL_APPSEC_STANDALONE_ENABLED() && ddtrace_has_asm_avent == NULL) { + if (ddtrace_has_appsec_propagation_tag != NULL) { + if (send_datadog) { + ADD_HEADER("x-datadog-sampling-priority", ZEND_LONG_FMT, sampling_priority); + } + if (trace_id.low || trace_id.high) { + if (send_datadog) { + ADD_HEADER("x-datadog-trace-id", "%" PRIu64, trace_id.low); + } + if (span_id) { + if (send_datadog) { + ADD_HEADER("x-datadog-parent-id", "%" PRIu64, span_id); + } + } + } + } + return; + } + if (sampling_priority != DDTRACE_PRIORITY_SAMPLING_UNKNOWN) { if (send_datadog) { ADD_HEADER("x-datadog-sampling-priority", ZEND_LONG_FMT, sampling_priority); diff --git a/ext/random.c b/ext/random.c index 7d4c9d6b660..9ddbdcd0960 100644 --- a/ext/random.c +++ b/ext/random.c @@ -118,16 +118,6 @@ ddtrace_trace_id ddtrace_peek_trace_id(void) { return pspan ? SPANDATA(pspan)->root->trace_id : DDTRACE_G(distributed_trace_id); } -bool ddtrace_has_asm_avent(void) { - ddtrace_span_properties *pspan = DDTRACE_G(active_stack) ? DDTRACE_G(active_stack)->active : NULL; - if(!pspan) { - return false; - } - zend_array *meta = ddtrace_property_array(&pspan->property_meta); - - return zend_hash_str_exists(meta, ZEND_STRL("_dd.p.appsec")); -} - int ddtrace_conv10_trace_id(ddtrace_trace_id id, uint8_t reverse[DD_TRACE_MAX_ID_LEN]) { reverse[0] = 0; int i = 0; diff --git a/ext/serializer.c b/ext/serializer.c index 75613016aa6..f5624205cc0 100644 --- a/ext/serializer.c +++ b/ext/serializer.c @@ -1697,11 +1697,11 @@ void ddtrace_serialize_span_to_array(ddtrace_span_data *span, zval *array) { zend_hash_str_del(meta, ZEND_STRL("operation.name")); } -// zval *asm_event = NULL; -// if (get_global_DD_EXPERIMENTAL_APPSEC_STANDALONE_ENABLED()) { -// asm_event = zend_hash_str_find(meta, ZEND_STRL("_dd.p.appsec")); -// } -// bool is_standalone_appsec_span = asm_event ? Z_TYPE_P(asm_event) == IS_STRING && strncmp(Z_STRVAL_P(asm_event), "1", sizeof("1") - 1) == 0 : 0; + zval *asm_event = NULL; + if (get_global_DD_EXPERIMENTAL_APPSEC_STANDALONE_ENABLED()) { + asm_event = zend_hash_str_find(meta, ZEND_STRL("_dd.p.appsec")); + } + bool is_standalone_appsec_span = asm_event ? Z_TYPE_P(asm_event) == IS_STRING && strncmp(Z_STRVAL_P(asm_event), "1", sizeof("1") - 1) == 0 : 0; _serialize_meta(el, span, Z_TYPE_P(prop_service) > IS_NULL ? Z_STR(prop_service_as_string) : ZSTR_EMPTY_ALLOC()); @@ -1717,7 +1717,11 @@ void ddtrace_serialize_span_to_array(ddtrace_span_data *span, zval *array) { if (is_root_span) { if (Z_TYPE_P(&span->root->property_sampling_priority) != IS_UNDEF) { - add_assoc_double(&metrics_zv, "_sampling_priority_v1", zval_get_long(&span->root->property_sampling_priority)); + long sampling_priority = zval_get_long(&span->root->property_sampling_priority); + if (get_global_DD_EXPERIMENTAL_APPSEC_STANDALONE_ENABLED() && !is_standalone_appsec_span) { + sampling_priority = MIN(PRIORITY_SAMPLING_AUTO_KEEP, sampling_priority); + } + add_assoc_double(&metrics_zv, "_sampling_priority_v1", sampling_priority); } if(get_global_DD_EXPERIMENTAL_APPSEC_STANDALONE_ENABLED()) { add_assoc_long(&metrics_zv, "_dd.apm.enabled", 0);