From 297a13fbe4491735e130c6f6953ebaf58a50f26d Mon Sep 17 00:00:00 2001 From: Alejandro Estringana Ruiz Date: Wed, 13 Nov 2024 12:50:15 +0100 Subject: [PATCH] Refactor asm implementation --- appsec/src/extension/commands_helpers.c | 2 +- appsec/src/extension/ddtrace.c | 27 ++++--- appsec/src/extension/ddtrace.h | 2 + appsec/src/extension/tags.c | 70 +++++++------------ appsec/src/extension/tags.h | 1 - config.m4 | 1 + config.w32 | 1 + ddtrace.sym | 1 + ext/ddappsec.c | 23 ++++++ ext/ddappsec.h | 11 +++ ext/ddtrace.c | 3 + ext/ddtrace.h | 2 + ext/handlers_http.h | 39 +++-------- ext/random.h | 1 - ext/serializer.c | 3 +- .../tracer_tag_propagation.c | 56 ++++++++++----- .../tracer_tag_propagation.h | 2 + 17 files changed, 138 insertions(+), 107 deletions(-) create mode 100644 ext/ddappsec.c create mode 100644 ext/ddappsec.h diff --git a/appsec/src/extension/commands_helpers.c b/appsec/src/extension/commands_helpers.c index 46a228ebfc..89c1b4c0f0 100644 --- a/appsec/src/extension/commands_helpers.c +++ b/appsec/src/extension/commands_helpers.c @@ -494,7 +494,7 @@ dd_result dd_command_proc_resp_verd_span_data( if (res == dd_should_block || res == dd_should_redirect || res == dd_should_record) { - dd_appsec_add_asm_event(); + dd_trace_emit_asm_event(); _set_appsec_span_data(mpack_node_array_at(root, 1)); } diff --git a/appsec/src/extension/ddtrace.c b/appsec/src/extension/ddtrace.c index 0e0567d695..e952b7fa81 100644 --- a/appsec/src/extension/ddtrace.c +++ b/appsec/src/extension/ddtrace.c @@ -28,7 +28,6 @@ static zend_string *_ddtrace_root_span_fname; static zend_string *_meta_propname; static zend_string *_metrics_propname; static zend_string *_meta_struct_propname; -static zend_string *_propagated_tags_propname; static THREAD_LOCAL_ON_ZTS bool _suppress_ddtrace_rshutdown; static uint8_t *_ddtrace_runtime_id = NULL; @@ -51,6 +50,8 @@ static zend_string *(*_ddtrace_ip_extraction_find)(zval *server); static const char *nullable (*_ddtrace_remote_config_get_path)(void); +static void *(*nullable _ddtrace_emit_asm_event)(void); + static void dd_trace_load_symbols(void) { bool testing = get_global_DD_APPSEC_TESTING(); @@ -120,6 +121,14 @@ static void dd_trace_load_symbols(void) "Failed to load ddtrace_remote_config_get_path: %s", dlerror()); } + _ddtrace_emit_asm_event = + dlsym(handle, "ddtrace_emit_asm_event"); + if (_ddtrace_emit_asm_event == NULL) { + mlog(dd_log_error, + // NOLINTNEXTLINE(concurrency-mt-unsafe) + "Failed to load ddtrace_emit_asm_event: %s", dlerror()); + } + dlclose(handle); } @@ -131,8 +140,6 @@ void dd_trace_startup() _metrics_propname = zend_string_init_interned(LSTRARG("metrics"), 1); _meta_struct_propname = zend_string_init_interned(LSTRARG("meta_struct"), 1); - _propagated_tags_propname = - zend_string_init_interned(LSTRARG("propagated_tags"), 1); if (get_global_DD_APPSEC_TESTING()) { _register_testing_objects(); @@ -317,11 +324,6 @@ zval *nullable dd_trace_span_get_meta_struct(zend_object *nonnull zobj) return _get_span_modifiable_array_property(zobj, _meta_struct_propname); } -zval *nullable dd_trace_span_get_propagated_tags(zend_object *nonnull zobj) -{ - return _get_span_modifiable_array_property(zobj, _propagated_tags_propname); -} - // NOLINTBEGIN(cppcoreguidelines-avoid-magic-numbers,readability-magic-numbers) zend_string *nullable dd_trace_get_formatted_runtime_id(bool persistent) { @@ -407,6 +409,15 @@ void dd_trace_span_add_propagated_tags( _ddtrace_add_propagated_tag_on_span_zobj(key, value); } +void dd_trace_emit_asm_event(void) +{ + if (UNEXPECTED(_ddtrace_emit_asm_event == NULL)) { + return; + } + + _ddtrace_emit_asm_event(); +} + static PHP_FUNCTION(datadog_appsec_testing_ddtrace_rshutdown) { if (zend_parse_parameters_none() == FAILURE) { diff --git a/appsec/src/extension/ddtrace.h b/appsec/src/extension/ddtrace.h index f4a24a4f6e..bf0ea1bf27 100644 --- a/appsec/src/extension/ddtrace.h +++ b/appsec/src/extension/ddtrace.h @@ -48,6 +48,8 @@ bool dd_trace_span_add_tag_str(zend_object *nonnull zobj, // Flush the tracer spans, can be used on RINIT void dd_trace_close_all_spans_and_flush(void); +void dd_trace_emit_asm_event(void); + // Provides the array zval representing $root_span->meta, if any. // It is ready for modification, with refcount == 1 zval *nullable dd_trace_span_get_meta(zend_object *nonnull); diff --git a/appsec/src/extension/tags.c b/appsec/src/extension/tags.c index f042c1831a..480126cd27 100644 --- a/appsec/src/extension/tags.c +++ b/appsec/src/extension/tags.c @@ -109,7 +109,6 @@ static THREAD_LOCAL_ON_ZTS bool _appsec_json_frags_inited; static THREAD_LOCAL_ON_ZTS zend_llist _appsec_json_frags; static THREAD_LOCAL_ON_ZTS zend_string *nullable _event_user_id; static THREAD_LOCAL_ON_ZTS bool _blocked; -static THREAD_LOCAL_ON_ZTS bool _asm_event_propagated; static THREAD_LOCAL_ON_ZTS bool _force_keep; static void _init_relevant_headers(void); @@ -123,9 +122,6 @@ void _set_runtime_family(zend_object *nonnull span); static bool _set_appsec_enabled(zval *metrics_zv); static void _register_functions(void); static void _register_test_functions(void); -static void _add_new_zstr_to_meta(zend_array *meta_ht, zend_string *key, - zend_string *val, bool copy, bool override); -static zval *nullable _root_span_get_meta(); void dd_tags_startup() { @@ -296,7 +292,6 @@ void dd_tags_rinit() _event_user_id = NULL; _blocked = false; _force_keep = false; - _asm_event_propagated = false; } void dd_tags_add_appsec_json_frag(zend_string *nonnull zstr) @@ -319,26 +314,6 @@ void dd_tags_rshutdown() } } -void dd_appsec_add_asm_event() -{ - if (_asm_event_propagated) { - return; - } - zval *nullable meta = _root_span_get_meta(); - if (meta && Z_TYPE_P(meta) == IS_ARRAY) { - zend_array *meta_ht = Z_ARRVAL_P(meta); - // Indicate there is a ASM EVENT. This tag is used for any event - // threats, business logic events, IAST, etc - _add_new_zstr_to_meta( - meta_ht, _dd_tag_p_appsec_zstr, _1_zstr, true, false); - } - - zval _1_zval; - ZVAL_STR(&_1_zval, _1_zstr); - dd_trace_span_add_propagated_tags(_dd_tag_p_appsec_zstr, &_1_zval); - _asm_event_propagated = true; -} - void dd_tags_add_tags( zend_object *nonnull span, zend_array *nullable superglob_equiv) { @@ -358,6 +333,12 @@ void dd_tags_add_tags( // tag _dd.runtime_family _set_runtime_family(span); + if (_force_keep) { + dd_trace_set_priority_sampling_on_span_zobj( + span, PRIORITY_SAMPLING_USER_KEEP, DD_MECHANISM_MANUAL); + mlog(dd_log_debug, "Updated sampling priority to user_keep"); + } + if (zend_llist_count(&_appsec_json_frags) == 0) { if (!server) { return; @@ -369,21 +350,33 @@ void dd_tags_add_tags( return; } + zval true_zv; + ZVAL_STR_COPY(&true_zv, _true_zstr); + + // tag _dd.p.appsec + bool res = dd_trace_span_add_tag(span, _dd_tag_p_appsec_zstr, &true_zv); + if (!res) { + mlog(dd_log_info, "Failed adding tag " DD_TAG_P_APPSEC " to root span"); + return; + } + + zval _1_zval; + ZVAL_STR(&_1_zval, _1_zstr); + dd_trace_span_add_propagated_tags(_dd_tag_p_appsec_zstr, &_1_zval); + zend_string *tag_value = _concat_json_fragments(); zval tag_value_zv; ZVAL_STR(&tag_value_zv, tag_value); // tag _dd.appsec.json - bool res = dd_trace_span_add_tag(span, _dd_tag_data_zstr, &tag_value_zv); + res = dd_trace_span_add_tag(span, _dd_tag_data_zstr, &tag_value_zv); if (!res) { mlog(dd_log_info, "Failed adding tag " DD_TAG_DATA " to root span"); return; } // tag appsec.event - zval true_zv; - ZVAL_STR_COPY(&true_zv, _true_zstr); res = dd_trace_span_add_tag(span, _dd_tag_event_zstr, &true_zv); if (!res) { mlog(dd_log_info, "Failed adding tag " DD_TAG_EVENT " to root span"); @@ -400,19 +393,7 @@ void dd_tags_add_tags( void dd_tags_add_blocked() { _blocked = true; } -void dd_tags_set_sampling_priority() -{ - if (_force_keep) { - return; - } - - zend_object *nullable span = dd_req_lifecycle_get_cur_span(); - dd_trace_set_priority_sampling_on_span_zobj( - span, PRIORITY_SAMPLING_USER_KEEP, DD_MECHANISM_MANUAL); - mlog(dd_log_debug, "Updated sampling priority to user_keep"); - - _force_keep = true; -} +void dd_tags_set_sampling_priority() { _force_keep = true; } static void _zend_string_release_indirect(void *s) { @@ -555,7 +536,6 @@ static void _add_new_zstr_to_meta(zend_array *meta_ht, zend_string *key, zend_string_release(val); } } - static void _dd_http_method(zend_array *meta_ht) { if (zend_hash_exists(meta_ht, _dd_tag_http_method_zstr)) { @@ -904,15 +884,13 @@ static zval *nullable _root_span_get_meta() { zend_object *nullable span = dd_req_lifecycle_get_cur_span(); if (!span) { -// TODO Uncomment this -// mlog(dd_log_warning, "No root span being tracked by appsec"); + mlog(dd_log_warning, "No root span being tracked by appsec"); return NULL; } zval *nullable meta = dd_trace_span_get_meta(span); if (!meta) { -// TODO Uncomment this -// mlog(dd_log_warning, "Failed to retrieve root span meta"); + mlog(dd_log_warning, "Failed to retrieve root span meta"); } return meta; } diff --git a/appsec/src/extension/tags.h b/appsec/src/extension/tags.h index 6989d52d49..79c9120db5 100644 --- a/appsec/src/extension/tags.h +++ b/appsec/src/extension/tags.h @@ -17,7 +17,6 @@ void dd_tags_startup(void); void dd_tags_shutdown(void); void dd_tags_rinit(void); void dd_tags_rshutdown(void); -void dd_appsec_add_asm_event(); void dd_tags_add_tags(zend_object *nonnull span, zend_array *nullable superglob_equiv); void dd_tags_add_blocked(void); diff --git a/config.m4 b/config.m4 index 88ea035020..498bdc0e44 100644 --- a/config.m4 +++ b/config.m4 @@ -186,6 +186,7 @@ if test "$PHP_DDTRACE" != "no"; then ext/integrations/exec_integration.c \ ext/integrations/integrations.c \ ext/ip_extraction.c \ + ext/ddappsec.c \ ext/live_debugger.c \ ext/logging.c \ ext/limiter/limiter.c \ diff --git a/config.w32 b/config.w32 index 9f37c9ef8f..622f83c50c 100644 --- a/config.w32 +++ b/config.w32 @@ -35,6 +35,7 @@ if (PHP_DDTRACE != 'no') { DDTRACE_EXT_SOURCES += " handlers_internal.c"; DDTRACE_EXT_SOURCES += " handlers_pcntl.c"; DDTRACE_EXT_SOURCES += " ip_extraction.c"; + DDTRACE_EXT_SOURCES += " ddappsec.c"; DDTRACE_EXT_SOURCES += " live_debugger.c"; DDTRACE_EXT_SOURCES += " logging.c"; DDTRACE_EXT_SOURCES += " memory_limit.c"; diff --git a/ddtrace.sym b/ddtrace.sym index 2ee54fced3..e984dc88ef 100644 --- a/ddtrace.sym +++ b/ddtrace.sym @@ -8,6 +8,7 @@ ddtrace_user_req_add_listeners ddtrace_ip_extraction_find ddtrace_set_all_thread_vm_interrupt ddtrace_remote_config_get_path +ddtrace_emit_asm_event ddog_remote_config_reader_for_path ddog_remote_config_read ddog_remote_config_reader_drop diff --git a/ext/ddappsec.c b/ext/ddappsec.c new file mode 100644 index 0000000000..9f335970f0 --- /dev/null +++ b/ext/ddappsec.c @@ -0,0 +1,23 @@ +#include "ddappsec.h" + +#include "configuration.h" +#include "ddtrace.h" +#include "tracer_tag_propagation/tracer_tag_propagation.h" + +ZEND_EXTERN_MODULE_GLOBALS(ddtrace); + +static zend_string *_dd_tag_p_appsec_zstr; +static zend_string *_1_zstr; + +void ddtrace_appsec_minit() { + _1_zstr = zend_string_init_interned(ZEND_STRL("1"), 1 /* permanent */); + _dd_tag_p_appsec_zstr = zend_string_init_interned(ZEND_STRL(DD_TAG_P_APPSEC), 1 /* permanent */); +} + +DDTRACE_PUBLIC void ddtrace_emit_asm_event() { + DDTRACE_G(asm_event_emitted) = true; + + zval _1_zval; + ZVAL_STR(&_1_zval, _1_zstr); + ddtrace_add_propagated_tag(_dd_tag_p_appsec_zstr, &_1_zval); +} diff --git a/ext/ddappsec.h b/ext/ddappsec.h new file mode 100644 index 0000000000..f85b288d4c --- /dev/null +++ b/ext/ddappsec.h @@ -0,0 +1,11 @@ +#ifndef DD_APPSEC_H +#define DD_APPSEC_H + +#include "ddtrace_export.h" + +#define DD_TAG_P_APPSEC "_dd.p.appsec" + +void ddtrace_appsec_minit(); +DDTRACE_PUBLIC void ddtrace_emit_asm_event(); + +#endif // DD_APPSEC_H diff --git a/ext/ddtrace.c b/ext/ddtrace.c index bd97d6115d..eedc5533e3 100644 --- a/ext/ddtrace.c +++ b/ext/ddtrace.c @@ -65,6 +65,7 @@ #include "autoload_php_files.h" #include "remote_config.h" #include "serializer.h" +#include "ddappsec.h" #include "sidecar.h" #ifndef _WIN32 #include "signals.h" @@ -1440,6 +1441,7 @@ static PHP_MINIT_FUNCTION(ddtrace) { ddtrace_live_debugger_minit(); ddtrace_minit_remote_config(); + ddtrace_appsec_minit(); return SUCCESS; } @@ -1532,6 +1534,7 @@ static void dd_initialize_request(void) { DDTRACE_G(additional_global_tags) = zend_new_array(0); DDTRACE_G(default_priority_sampling) = DDTRACE_PRIORITY_SAMPLING_UNKNOWN; DDTRACE_G(propagated_priority_sampling) = DDTRACE_PRIORITY_SAMPLING_UNSET; + DDTRACE_G(asm_event_emitted) = false; zend_hash_init(&DDTRACE_G(root_span_tags_preset), 8, unused, ZVAL_PTR_DTOR, 0); zend_hash_init(&DDTRACE_G(propagated_root_span_tags), 8, unused, ZVAL_PTR_DTOR, 0); zend_hash_init(&DDTRACE_G(tracestate_unknown_dd_keys), 8, unused, ZVAL_PTR_DTOR, 0); diff --git a/ext/ddtrace.h b/ext/ddtrace.h index 8f1c14b2f2..15f36f63bd 100644 --- a/ext/ddtrace.h +++ b/ext/ddtrace.h @@ -145,6 +145,8 @@ ZEND_BEGIN_MODULE_GLOBALS(ddtrace) HashTable telemetry_spans_created_per_integration; ddog_SidecarActionsBuffer *telemetry_buffer; + bool asm_event_emitted; + #if PHP_VERSION_ID >= 80000 HashTable curl_headers; // Multi-handle API: curl_multi_*() diff --git a/ext/handlers_http.h b/ext/handlers_http.h index 1c4b48bcde..8879510164 100644 --- a/ext/handlers_http.h +++ b/ext/handlers_http.h @@ -3,6 +3,7 @@ #include "priority_sampling/priority_sampling.h" #include "tracer_tag_propagation/tracer_tag_propagation.h" #include "span.h" +#include "ddappsec.h" #include ZEND_EXTERN_MODULE_GLOBALS(ddtrace); @@ -135,37 +136,12 @@ 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(); - - 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); + if (get_DD_EXPERIMENTAL_APPSEC_STANDALONE_ENABLED() && DDTRACE_G(asm_event_emitted) == true) { + sampling_priority = PRIORITY_SAMPLING_USER_KEEP; } - 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); - } - } - } - } + if (get_DD_EXPERIMENTAL_APPSEC_STANDALONE_ENABLED() && DDTRACE_G(asm_event_emitted) == false && + ddtrace_propagated_tags_get_tag(DD_TAG_P_APPSEC) == NULL) { return; } @@ -192,7 +168,8 @@ 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); @@ -265,6 +242,8 @@ static inline void ddtrace_inject_distributed_headers_config(zend_array *array, if (propagated_tags) { zend_string_release(propagated_tags); } + +#undef ADD_HEADER } static inline void ddtrace_inject_distributed_headers(zend_array *array, bool key_value_pairs) { diff --git a/ext/random.h b/ext/random.h index 1cedfeaf31..d14c971ded 100644 --- a/ext/random.h +++ b/ext/random.h @@ -21,6 +21,5 @@ 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 diff --git a/ext/serializer.c b/ext/serializer.c index f5624205cc..31880f662d 100644 --- a/ext/serializer.c +++ b/ext/serializer.c @@ -32,6 +32,7 @@ #include "ddtrace.h" #include "engine_api.h" #include "engine_hooks.h" +#include "ddappsec.h" #include "git.h" #include "ip_extraction.h" #include @@ -1699,7 +1700,7 @@ void ddtrace_serialize_span_to_array(ddtrace_span_data *span, zval *array) { zval *asm_event = NULL; if (get_global_DD_EXPERIMENTAL_APPSEC_STANDALONE_ENABLED()) { - asm_event = zend_hash_str_find(meta, ZEND_STRL("_dd.p.appsec")); + asm_event = zend_hash_str_find(meta, ZEND_STRL(DD_TAG_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; diff --git a/ext/tracer_tag_propagation/tracer_tag_propagation.c b/ext/tracer_tag_propagation/tracer_tag_propagation.c index bb5a0e5c1d..1133c02bdd 100644 --- a/ext/tracer_tag_propagation/tracer_tag_propagation.c +++ b/ext/tracer_tag_propagation/tracer_tag_propagation.c @@ -79,15 +79,41 @@ void ddtrace_add_tracer_tags_from_array(zend_array *array, zend_array *root_meta ZEND_HASH_FOREACH_END(); } -void ddtrace_get_propagated_tags(zend_array *tags) { +static zend_array *ddtrace_get_propagated() { zend_array *propagated = &DDTRACE_G(propagated_root_span_tags); + ddtrace_root_span_data *root_span = DDTRACE_G(active_stack)->root_span; + if (root_span) { + propagated = ddtrace_property_array(&root_span->property_propagated_tags); + } + + return propagated; +} + +static zend_array *ddtrace_get_root_meta() { 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); - propagated = ddtrace_property_array(&root_span->property_propagated_tags); } + return root_meta; +} + +zval *ddtrace_propagated_tags_get_tag(const char *tag) { + zend_array *propagated = ddtrace_get_propagated(); + zend_array *root_meta = ddtrace_get_root_meta(); + + if (!zend_hash_str_find(propagated, ZEND_STRL(tag))) { + return NULL; + } + + return zend_hash_str_find(root_meta, ZEND_STRL(tag)); +} + +void ddtrace_get_propagated_tags(zend_array *tags) { + zend_array *propagated = ddtrace_get_propagated(); + zend_array *root_meta = ddtrace_get_root_meta(); + zend_string *tagname; ZEND_HASH_FOREACH_STR_KEY(propagated, tagname) { zval *tag; @@ -100,15 +126,10 @@ void ddtrace_get_propagated_tags(zend_array *tags) { } zend_string *ddtrace_format_root_propagated_tags(void) { - zend_array *propagated = &DDTRACE_G(propagated_root_span_tags); - zend_array *tags = &DDTRACE_G(root_span_tags_preset); - ddtrace_root_span_data *span = DDTRACE_G(active_stack)->root_span; - if (span) { - tags = ddtrace_property_array(&span->property_meta); - propagated = ddtrace_property_array(&span->property_propagated_tags); - } + zend_array *propagated = ddtrace_get_propagated(); + zend_array *root_meta = ddtrace_get_root_meta(); - return ddtrace_format_propagated_tags(propagated, tags); + return ddtrace_format_propagated_tags(propagated, root_meta); } zend_string *ddtrace_format_propagated_tags(zend_array *propagated, zend_array *tags) { @@ -183,17 +204,14 @@ zend_string *ddtrace_format_propagated_tags(zend_array *propagated, zend_array * return taglist.s; } -DDTRACE_PUBLIC void ddtrace_add_propagated_tag_on_span_zobj(zend_string *key, zval *value) { - ddtrace_root_span_data *root_span = DDTRACE_G(active_stack)->root_span; - zend_array *root_meta = &DDTRACE_G(root_span_tags_preset); - zend_array *propagated_tags = &DDTRACE_G(propagated_root_span_tags); - if (root_span) { - root_meta = ddtrace_property_array(&root_span->property_meta); - propagated_tags = ddtrace_property_array(&root_span->property_propagated_tags); - } +void ddtrace_add_propagated_tag(zend_string *key, zval *value) { + zend_array *propagated = ddtrace_get_propagated(); + zend_array *root_meta = ddtrace_get_root_meta(); zval tagstr; ddtrace_convert_to_string(&tagstr, value); zend_hash_update(root_meta, key, &tagstr); - zend_hash_add_empty_element(propagated_tags, key); + zend_hash_add_empty_element(propagated, key); } + +DDTRACE_PUBLIC void ddtrace_add_propagated_tag_on_span_zobj(zend_string *key, zval *value) { ddtrace_add_propagated_tag(key, value); } diff --git a/ext/tracer_tag_propagation/tracer_tag_propagation.h b/ext/tracer_tag_propagation/tracer_tag_propagation.h index a603d4c53c..7af7c58e0c 100644 --- a/ext/tracer_tag_propagation/tracer_tag_propagation.h +++ b/ext/tracer_tag_propagation/tracer_tag_propagation.h @@ -9,7 +9,9 @@ void ddtrace_clean_tracer_tags(zend_array *root_meta, zend_array *propagated_tag void ddtrace_add_tracer_tags_from_header(zend_string *headerstr, zend_array *root_meta, zend_array *propagated_tags); void ddtrace_add_tracer_tags_from_array(zend_array *array, zend_array *root_meta, zend_array *propagated_tags); DDTRACE_PUBLIC void ddtrace_add_propagated_tag_on_span_zobj(zend_string *key, zval *value); +void ddtrace_add_propagated_tag(zend_string *key, zval *value); +zval *ddtrace_propagated_tags_get_tag(const char *tag); void ddtrace_get_propagated_tags(zend_array *tags); zend_string *ddtrace_format_root_propagated_tags(void); zend_string *ddtrace_format_propagated_tags(zend_array *propagated, zend_array *tags);