From a9f74bdaacfa0f406f316d7bd73da795c6050c21 Mon Sep 17 00:00:00 2001 From: Alejandro Estringana Ruiz Date: Fri, 8 Nov 2024 13:53:36 +0100 Subject: [PATCH] wip --- ext/handlers_http.h | 27 ++++++++++++++++++++++++--- ext/random.c | 10 ++++++++++ ext/random.h | 1 + 3 files changed, 35 insertions(+), 3 deletions(-) diff --git a/ext/handlers_http.h b/ext/handlers_http.h index ba380c07836..8e10a45df03 100644 --- a/ext/handlers_http.h +++ b/ext/handlers_http.h @@ -135,6 +135,28 @@ static inline void ddtrace_inject_distributed_headers_config(zend_array *array, bool send_b3single = zend_hash_str_exists(inject, ZEND_STRL("b3 single header")); zend_long sampling_priority = ddtrace_fetch_priority_sampling_from_root(); + ddtrace_trace_id trace_id = ddtrace_peek_trace_id(); + uint64_t span_id = ddtrace_peek_span_id(); + + if (get_DD_EXPERIMENTAL_APPSEC_STANDALONE_ENABLED() && !ddtrace_has_asm_avent()) { + if (sampling_priority != DDTRACE_PRIORITY_SAMPLING_UNKNOWN) { + 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); + } + } + } + } + goto injection_finished; + } + if (sampling_priority != DDTRACE_PRIORITY_SAMPLING_UNKNOWN) { if (send_datadog) { ADD_HEADER("x-datadog-sampling-priority", ZEND_LONG_FMT, sampling_priority); @@ -158,8 +180,7 @@ static inline void ddtrace_inject_distributed_headers_config(zend_array *array, ADD_HEADER("x-datadog-origin", "%s", ZSTR_VAL(origin)); } } - ddtrace_trace_id trace_id = ddtrace_peek_trace_id(); - uint64_t span_id = ddtrace_peek_span_id(); + if (trace_id.low || trace_id.high) { if (send_datadog) { ADD_HEADER("x-datadog-trace-id", "%" PRIu64, trace_id.low); @@ -228,7 +249,7 @@ static inline void ddtrace_inject_distributed_headers_config(zend_array *array, ADD_HEADER("b3", "%s", b3_sampling_decision); } } - +injection_finished: if (propagated_tags) { zend_string_release(propagated_tags); } diff --git a/ext/random.c b/ext/random.c index 9ddbdcd0960..7d4c9d6b660 100644 --- a/ext/random.c +++ b/ext/random.c @@ -118,6 +118,16 @@ 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/random.h b/ext/random.h index d14c971ded9..1cedfeaf312 100644 --- a/ext/random.h +++ b/ext/random.h @@ -21,5 +21,6 @@ ddtrace_trace_id ddtrace_parse_hex_trace_id(char *trace_id, ssize_t trace_id_len uint64_t ddtrace_parse_hex_span_id_str(const char *id, size_t len); uint64_t ddtrace_parse_hex_span_id(zval *zid); int ddtrace_conv10_trace_id(ddtrace_trace_id id, uint8_t reverse[DD_TRACE_MAX_ID_LEN]); +bool ddtrace_has_asm_avent(void); #endif // DD_RANDOM_H