From 126946c5e6e7927f587eddf7d6d4c6a8f11d7350 Mon Sep 17 00:00:00 2001 From: Alejandro Estringana Ruiz Date: Mon, 18 Aug 2025 15:16:34 +0200 Subject: [PATCH 01/53] Add new function to add endpoint --- components-rs/ddtrace.h | 16 +- components-rs/telemetry.rs | 36 ++-- ext/ddtrace.c | 9 + ext/ddtrace.stub.php | 7 + ext/ddtrace_arginfo.h | 187 +++++++++--------- .../Laravel/LaravelIntegration.php | 4 + 6 files changed, 150 insertions(+), 109 deletions(-) diff --git a/components-rs/ddtrace.h b/components-rs/ddtrace.h index 35d06a6182..9184668a27 100644 --- a/components-rs/ddtrace.h +++ b/components-rs/ddtrace.h @@ -1,4 +1,6 @@ struct _zend_string; + + #ifndef DDTRACE_PHP_H #define DDTRACE_PHP_H @@ -80,7 +82,7 @@ bool ddog_remote_configs_service_env_change(struct ddog_RemoteConfigState *remot bool ddog_remote_config_alter_dynamic_config(struct ddog_RemoteConfigState *remote_config, ddog_CharSlice config, - ddog_OwnedZendString new_value); + ddog_CharSlice new_value); void ddog_setup_remote_config(ddog_DynamicConfigUpdate update_config, const struct ddog_LiveDebuggerSetup *setup); @@ -110,8 +112,7 @@ ddog_MaybeError ddog_sidecar_connect_php(struct ddog_SidecarTransport **connecti const char *error_path, ddog_CharSlice log_level, bool enable_telemetry, - void (*on_reconnect)(struct ddog_SidecarTransport*), - const struct ddog_Endpoint *crashtracker_endpoint); + void (*on_reconnect)(struct ddog_SidecarTransport*)); void ddtrace_sidecar_reconnect(struct ddog_SidecarTransport **transport, struct ddog_SidecarTransport *(*factory)(void)); @@ -181,9 +182,12 @@ ddog_MaybeError ddog_sidecar_telemetry_filter_flush(struct ddog_SidecarTransport ddog_CharSlice service, ddog_CharSlice env); -void ddog_init_span_func(void (*free_func)(ddog_OwnedZendString), - void (*addref_func)(struct _zend_string*), - ddog_OwnedZendString (*init_func)(ddog_CharSlice)); +bool ddog_sidecar_telemetry_are_endpoints_collected(ddog_ShmCacheMap *cache, + ddog_CharSlice service, + ddog_CharSlice env); + +void ddog_init_span_func(void (*free_func)(struct _zend_string*), + void (*addref_func)(struct _zend_string*)); void ddog_set_span_service_zstr(ddog_SpanBytes *ptr, struct _zend_string *str); diff --git a/components-rs/telemetry.rs b/components-rs/telemetry.rs index c572bceea8..576abc9f9f 100644 --- a/components-rs/telemetry.rs +++ b/components-rs/telemetry.rs @@ -12,15 +12,15 @@ use datadog_sidecar::service::{ blocking::{self, SidecarTransport}, InstanceId, QueueId, SidecarAction, }; -use libdd_common::tag::parse_tags; -use libdd_common_ffi::slice::AsBytes; -use libdd_common_ffi::{self as ffi, CharSlice, MaybeError}; -use libdd_telemetry::data; -use libdd_telemetry::data::metrics::{MetricNamespace, MetricType}; -use libdd_telemetry::data::{Dependency, Integration, LogLevel}; -use libdd_telemetry::metrics::MetricContext; -use libdd_telemetry::worker::{LogIdentifier, TelemetryActions}; -use libdd_telemetry_ffi::try_c; +use ddcommon::tag::parse_tags; +use ddcommon_ffi::slice::AsBytes; +use ddcommon_ffi::{self as ffi, CharSlice, MaybeError}; +use ddtelemetry::data; +use ddtelemetry::data::metrics::{MetricNamespace, MetricType}; +use ddtelemetry::data::{Dependency, Endpoint, Integration, LogLevel}; +use ddtelemetry::metrics::MetricContext; +use ddtelemetry::worker::{LogIdentifier, TelemetryActions}; +use ddtelemetry_ffi::try_c; use std::error::Error; use std::hash::{Hash, Hasher}; use std::str::FromStr; @@ -236,11 +236,12 @@ pub struct ShmCache { pub config_sent: bool, pub integrations: HashSet, pub composer_paths: HashSet, + pub endpoints: HashSet, pub reader: OneWayShmReader, } #[derive(Hash, Eq, PartialEq)] -pub struct ShmCacheKey(String, String); +struct ShmCacheKey(String, String); impl Equivalent for (&str, &str) { fn equivalent(&self, key: &ShmCacheKey) -> bool { @@ -289,8 +290,8 @@ unsafe fn ddog_sidecar_telemetry_cache_get_or_update<'a>( } } - if let Ok((config_sent, integrations, composer_paths)) = - bincode::deserialize::<(bool, HashSet, HashSet)>(buf) + if let Ok((config_sent, integrations, composer_paths, endpoints)) = + bincode::deserialize::<(bool, HashSet, HashSet, HashSet)>(buf) { cache.config_sent = config_sent; cache.integrations = integrations; @@ -358,3 +359,14 @@ pub unsafe extern "C" fn ddog_sidecar_telemetry_filter_flush( MaybeError::None } + +#[no_mangle] +pub unsafe extern "C" fn ddog_sidecar_telemetry_are_endpoints_collected( + cache: &mut ShmCacheMap, + service: CharSlice, + env: CharSlice, +) -> bool { + let cache_entry = ddog_sidecar_telemetry_cache_get_or_update(cache, service, env); + + cache_entry.map_or(false, |entry| !entry.endpoints.is_empty()) +} diff --git a/ext/ddtrace.c b/ext/ddtrace.c index 7b6ec4b1f4..b3269a280c 100644 --- a/ext/ddtrace.c +++ b/ext/ddtrace.c @@ -2362,6 +2362,15 @@ PHP_FUNCTION(datadog_appsec_v2_track_user_login_failure) { } } +PHP_FUNCTION(DDTrace_are_endpoints_collected) { + UNUSED(execute_data); + + ddog_CharSlice service_name = dd_zend_string_to_CharSlice(DDTRACE_G(last_service_name)); + ddog_CharSlice env_name = dd_zend_string_to_CharSlice(DDTRACE_G(last_env_name)); + + RETURN_BOOL(ddog_sidecar_telemetry_are_endpoints_collected(ddtrace_telemetry_cache(), service_name, env_name)); +} + PHP_FUNCTION(dd_trace_serialize_closed_spans) { UNUSED(execute_data); diff --git a/ext/ddtrace.stub.php b/ext/ddtrace.stub.php index fbc182c45c..4eaa18b616 100644 --- a/ext/ddtrace.stub.php +++ b/ext/ddtrace.stub.php @@ -822,6 +822,13 @@ function resource_weak_store(mixed $resource, string $key, mixed $value): void { * @return mixed|null The stored value, or null if missing. */ function resource_weak_get(mixed $resource, string $key): mixed {} + + /** + * Check if endpoints are already collected + * + * @return bool + */ + function are_endpoints_collected(): bool {} } namespace DDTrace\System { diff --git a/ext/ddtrace_arginfo.h b/ext/ddtrace_arginfo.h index 9c005f69d0..46b1e805e8 100644 --- a/ext/ddtrace_arginfo.h +++ b/ext/ddtrace_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: 4936b63014f9af91c1d499f9871745fb9c642066 */ + * Stub hash: 0ac2d264686a54fb18a7e7fa8c14f5ff1f0dfac6 */ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_DDTrace_trace_method, 0, 3, _IS_BOOL, 0) ZEND_ARG_TYPE_INFO(0, className, IS_STRING, 0) @@ -132,7 +132,8 @@ ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_DDTrace_flush, 0, 0, IS_VOID, 0) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_DDTrace_curl_multi_exec_get_request_spans, 1, 0, IS_ARRAY, 0) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_DDTrace_curl_multi_exec_get_request_spans, 0, 1, IS_VOID, 0) + ZEND_ARG_INFO(1, array) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_DDTrace_dogstatsd_count, 0, 2, IS_VOID, 0) @@ -164,6 +165,9 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_DDTrace_resource_weak_get, 0, 2, ZEND_ARG_TYPE_INFO(0, key, IS_STRING, 0) ZEND_END_ARG_INFO() +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_DDTrace_are_endpoints_collected, 0, 0, _IS_BOOL, 0) +ZEND_END_ARG_INFO() + ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_DDTrace_System_container_id, 0, 0, IS_STRING, 1) ZEND_END_ARG_INFO() @@ -175,8 +179,7 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_DDTrace_Config_integration_analy ZEND_ARG_TYPE_INFO(0, integrationName, IS_STRING, 0) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_DDTrace_UserRequest_has_listeners, 0, 0, _IS_BOOL, 0) -ZEND_END_ARG_INFO() +#define arginfo_DDTrace_UserRequest_has_listeners arginfo_DDTrace_are_endpoints_collected ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_DDTrace_UserRequest_notify_start, 0, 2, IS_ARRAY, 1) ZEND_ARG_OBJ_INFO(0, span, DDTrace\\RootSpanData, 0) @@ -226,9 +229,9 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_dd_trace_env_config, 0, 1, IS_MI ZEND_ARG_TYPE_INFO(0, envName, IS_STRING, 0) ZEND_END_ARG_INFO() -#define arginfo_dd_trace_disable_in_request arginfo_DDTrace_UserRequest_has_listeners +#define arginfo_dd_trace_disable_in_request arginfo_DDTrace_are_endpoints_collected -#define arginfo_dd_trace_reset arginfo_DDTrace_UserRequest_has_listeners +#define arginfo_dd_trace_reset arginfo_DDTrace_are_endpoints_collected ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_dd_trace_serialize_msgpack, 0, 1, MAY_BE_BOOL|MAY_BE_STRING) ZEND_ARG_TYPE_INFO(0, traceArray, IS_ARRAY, 0) @@ -241,15 +244,15 @@ ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_dd_trace_dd_get_memory_limit, 0, 0, IS_LONG, 0) ZEND_END_ARG_INFO() -#define arginfo_dd_trace_check_memory_under_limit arginfo_DDTrace_UserRequest_has_listeners +#define arginfo_dd_trace_check_memory_under_limit arginfo_DDTrace_are_endpoints_collected ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ddtrace_config_app_name, 0, 0, IS_STRING, 1) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, fallbackName, IS_STRING, 1, "null") ZEND_END_ARG_INFO() -#define arginfo_ddtrace_config_distributed_tracing_enabled arginfo_DDTrace_UserRequest_has_listeners +#define arginfo_ddtrace_config_distributed_tracing_enabled arginfo_DDTrace_are_endpoints_collected -#define arginfo_ddtrace_config_trace_enabled arginfo_DDTrace_UserRequest_has_listeners +#define arginfo_ddtrace_config_trace_enabled arginfo_DDTrace_are_endpoints_collected #define arginfo_ddtrace_config_integration_enabled arginfo_DDTrace_Config_integration_analytics_enabled @@ -276,7 +279,7 @@ ZEND_END_ARG_INFO() #define arginfo_dd_trace_closed_spans_count arginfo_dd_trace_dd_get_memory_limit -#define arginfo_dd_trace_tracer_is_limited arginfo_DDTrace_UserRequest_has_listeners +#define arginfo_dd_trace_tracer_is_limited arginfo_DDTrace_are_endpoints_collected #define arginfo_dd_trace_compile_time_microseconds arginfo_dd_trace_dd_get_memory_limit @@ -374,6 +377,7 @@ ZEND_FUNCTION(DDTrace_dogstatsd_histogram); ZEND_FUNCTION(DDTrace_dogstatsd_set); ZEND_FUNCTION(DDTrace_resource_weak_store); ZEND_FUNCTION(DDTrace_resource_weak_get); +ZEND_FUNCTION(DDTrace_are_endpoints_collected); ZEND_FUNCTION(DDTrace_System_container_id); ZEND_FUNCTION(DDTrace_Config_integration_analytics_enabled); ZEND_FUNCTION(DDTrace_Config_integration_analytics_sample_rate); @@ -464,6 +468,7 @@ static const zend_function_entry ext_functions[] = { ZEND_RAW_FENTRY(ZEND_NS_NAME("DDTrace", "dogstatsd_set"), zif_DDTrace_dogstatsd_set, arginfo_DDTrace_dogstatsd_set, 0, NULL, NULL) ZEND_RAW_FENTRY(ZEND_NS_NAME("DDTrace", "resource_weak_store"), zif_DDTrace_resource_weak_store, arginfo_DDTrace_resource_weak_store, 0, NULL, NULL) ZEND_RAW_FENTRY(ZEND_NS_NAME("DDTrace", "resource_weak_get"), zif_DDTrace_resource_weak_get, arginfo_DDTrace_resource_weak_get, 0, NULL, NULL) + ZEND_RAW_FENTRY(ZEND_NS_NAME("DDTrace", "are_endpoints_collected"), zif_DDTrace_are_endpoints_collected, arginfo_DDTrace_are_endpoints_collected, 0, NULL, NULL) ZEND_RAW_FENTRY(ZEND_NS_NAME("DDTrace\\System", "container_id"), zif_DDTrace_System_container_id, arginfo_DDTrace_System_container_id, 0, NULL, NULL) ZEND_RAW_FENTRY(ZEND_NS_NAME("DDTrace\\Config", "integration_analytics_enabled"), zif_DDTrace_Config_integration_analytics_enabled, arginfo_DDTrace_Config_integration_analytics_enabled, 0, NULL, NULL) ZEND_RAW_FENTRY(ZEND_NS_NAME("DDTrace\\Config", "integration_analytics_sample_rate"), zif_DDTrace_Config_integration_analytics_sample_rate, arginfo_DDTrace_Config_integration_analytics_sample_rate, 0, NULL, NULL) @@ -532,7 +537,7 @@ static const zend_function_entry class_DDTrace_SpanData_methods[] = { }; static const zend_function_entry class_DDTrace_Integration_methods[] = { - ZEND_RAW_FENTRY("init", NULL, arginfo_class_DDTrace_Integration_init, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC|ZEND_ACC_ABSTRACT, NULL, NULL) + ZEND_RAW_FENTRY("init", NULL, arginfo_class_DDTrace_Integration_init, ZEND_ACC_PUBLIC|ZEND_ACC_ABSTRACT, NULL, NULL) ZEND_FE_END }; @@ -566,15 +571,15 @@ static zend_class_entry *register_class_DDTrace_SpanEvent(zend_class_entry *clas zval property_attributes_default_value; ZVAL_UNDEF(&property_attributes_default_value); - zend_string *property_attributes_name = zend_string_init("attributes", sizeof("attributes") - 1, true); + zend_string *property_attributes_name = zend_string_init("attributes", sizeof("attributes") - 1, 1); zend_declare_typed_property(class_entry, property_attributes_name, &property_attributes_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_ARRAY)); - zend_string_release_ex(property_attributes_name, true); + zend_string_release(property_attributes_name); zval property_timestamp_default_value; ZVAL_UNDEF(&property_timestamp_default_value); - zend_string *property_timestamp_name = zend_string_init("timestamp", sizeof("timestamp") - 1, true); + zend_string *property_timestamp_name = zend_string_init("timestamp", sizeof("timestamp") - 1, 1); zend_declare_typed_property(class_entry, property_timestamp_name, &property_timestamp_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG)); - zend_string_release_ex(property_timestamp_name, true); + zend_string_release(property_timestamp_name); return class_entry; } @@ -588,10 +593,10 @@ static zend_class_entry *register_class_DDTrace_ExceptionSpanEvent(zend_class_en zval property_exception_default_value; ZVAL_UNDEF(&property_exception_default_value); - zend_string *property_exception_name = zend_string_init("exception", sizeof("exception") - 1, true); + zend_string *property_exception_name = zend_string_init("exception", sizeof("exception") - 1, 1); zend_string *property_exception_class_Throwable = zend_string_init("Throwable", sizeof("Throwable")-1, 1); zend_declare_typed_property(class_entry, property_exception_name, &property_exception_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_exception_class_Throwable, 0, 0)); - zend_string_release_ex(property_exception_name, true); + zend_string_release(property_exception_name); return class_entry; } @@ -606,33 +611,33 @@ static zend_class_entry *register_class_DDTrace_SpanLink(zend_class_entry *class zval property_traceId_default_value; ZVAL_UNDEF(&property_traceId_default_value); - zend_string *property_traceId_name = zend_string_init("traceId", sizeof("traceId") - 1, true); + zend_string *property_traceId_name = zend_string_init("traceId", sizeof("traceId") - 1, 1); zend_declare_typed_property(class_entry, property_traceId_name, &property_traceId_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING)); - zend_string_release_ex(property_traceId_name, true); + zend_string_release(property_traceId_name); zval property_spanId_default_value; ZVAL_UNDEF(&property_spanId_default_value); - zend_string *property_spanId_name = zend_string_init("spanId", sizeof("spanId") - 1, true); + zend_string *property_spanId_name = zend_string_init("spanId", sizeof("spanId") - 1, 1); zend_declare_typed_property(class_entry, property_spanId_name, &property_spanId_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING)); - zend_string_release_ex(property_spanId_name, true); + zend_string_release(property_spanId_name); zval property_traceState_default_value; ZVAL_UNDEF(&property_traceState_default_value); - zend_string *property_traceState_name = zend_string_init("traceState", sizeof("traceState") - 1, true); + zend_string *property_traceState_name = zend_string_init("traceState", sizeof("traceState") - 1, 1); zend_declare_typed_property(class_entry, property_traceState_name, &property_traceState_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING)); - zend_string_release_ex(property_traceState_name, true); + zend_string_release(property_traceState_name); zval property_attributes_default_value; ZVAL_UNDEF(&property_attributes_default_value); - zend_string *property_attributes_name = zend_string_init("attributes", sizeof("attributes") - 1, true); + zend_string *property_attributes_name = zend_string_init("attributes", sizeof("attributes") - 1, 1); zend_declare_typed_property(class_entry, property_attributes_name, &property_attributes_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_ARRAY)); - zend_string_release_ex(property_attributes_name, true); + zend_string_release(property_attributes_name); zval property_droppedAttributesCount_default_value; ZVAL_UNDEF(&property_droppedAttributesCount_default_value); - zend_string *property_droppedAttributesCount_name = zend_string_init("droppedAttributesCount", sizeof("droppedAttributesCount") - 1, true); + zend_string *property_droppedAttributesCount_name = zend_string_init("droppedAttributesCount", sizeof("droppedAttributesCount") - 1, 1); zend_declare_typed_property(class_entry, property_droppedAttributesCount_name, &property_droppedAttributesCount_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG)); - zend_string_release_ex(property_droppedAttributesCount_name, true); + zend_string_release(property_droppedAttributesCount_name); return class_entry; } @@ -646,15 +651,15 @@ static zend_class_entry *register_class_DDTrace_GitMetadata(void) zval property_commitSha_default_value; ZVAL_EMPTY_STRING(&property_commitSha_default_value); - zend_string *property_commitSha_name = zend_string_init("commitSha", sizeof("commitSha") - 1, true); + zend_string *property_commitSha_name = zend_string_init("commitSha", sizeof("commitSha") - 1, 1); zend_declare_typed_property(class_entry, property_commitSha_name, &property_commitSha_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING)); - zend_string_release_ex(property_commitSha_name, true); + zend_string_release(property_commitSha_name); zval property_repositoryUrl_default_value; ZVAL_EMPTY_STRING(&property_repositoryUrl_default_value); - zend_string *property_repositoryUrl_name = zend_string_init("repositoryUrl", sizeof("repositoryUrl") - 1, true); + zend_string *property_repositoryUrl_name = zend_string_init("repositoryUrl", sizeof("repositoryUrl") - 1, 1); zend_declare_typed_property(class_entry, property_repositoryUrl_name, &property_repositoryUrl_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING)); - zend_string_release_ex(property_repositoryUrl_name, true); + zend_string_release(property_repositoryUrl_name); return class_entry; } @@ -676,27 +681,27 @@ static zend_class_entry *register_class_DDTrace_SpanData(void) zval property_service_default_value; ZVAL_EMPTY_STRING(&property_service_default_value); - zend_string *property_service_name = zend_string_init("service", sizeof("service") - 1, true); + zend_string *property_service_name = zend_string_init("service", sizeof("service") - 1, 1); zend_declare_typed_property(class_entry, property_service_name, &property_service_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING|MAY_BE_NULL)); - zend_string_release_ex(property_service_name, true); + zend_string_release(property_service_name); zval property_env_default_value; ZVAL_EMPTY_STRING(&property_env_default_value); - zend_string *property_env_name = zend_string_init("env", sizeof("env") - 1, true); + zend_string *property_env_name = zend_string_init("env", sizeof("env") - 1, 1); zend_declare_typed_property(class_entry, property_env_name, &property_env_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING)); - zend_string_release_ex(property_env_name, true); + zend_string_release(property_env_name); zval property_version_default_value; ZVAL_EMPTY_STRING(&property_version_default_value); - zend_string *property_version_name = zend_string_init("version", sizeof("version") - 1, true); + zend_string *property_version_name = zend_string_init("version", sizeof("version") - 1, 1); zend_declare_typed_property(class_entry, property_version_name, &property_version_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING)); - zend_string_release_ex(property_version_name, true); + zend_string_release(property_version_name); zval property_meta_struct_default_value; ZVAL_EMPTY_ARRAY(&property_meta_struct_default_value); - zend_string *property_meta_struct_name = zend_string_init("meta_struct", sizeof("meta_struct") - 1, true); + zend_string *property_meta_struct_name = zend_string_init("meta_struct", sizeof("meta_struct") - 1, 1); zend_declare_typed_property(class_entry, property_meta_struct_name, &property_meta_struct_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_ARRAY)); - zend_string_release_ex(property_meta_struct_name, true); + zend_string_release(property_meta_struct_name); zval property_type_default_value; ZVAL_EMPTY_STRING(&property_type_default_value); @@ -704,70 +709,70 @@ static zend_class_entry *register_class_DDTrace_SpanData(void) zval property_meta_default_value; ZVAL_EMPTY_ARRAY(&property_meta_default_value); - zend_string *property_meta_name = zend_string_init("meta", sizeof("meta") - 1, true); + zend_string *property_meta_name = zend_string_init("meta", sizeof("meta") - 1, 1); zend_declare_typed_property(class_entry, property_meta_name, &property_meta_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_ARRAY)); - zend_string_release_ex(property_meta_name, true); + zend_string_release(property_meta_name); zval property_metrics_default_value; ZVAL_EMPTY_ARRAY(&property_metrics_default_value); - zend_string *property_metrics_name = zend_string_init("metrics", sizeof("metrics") - 1, true); + zend_string *property_metrics_name = zend_string_init("metrics", sizeof("metrics") - 1, 1); zend_declare_typed_property(class_entry, property_metrics_name, &property_metrics_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_ARRAY)); - zend_string_release_ex(property_metrics_name, true); + zend_string_release(property_metrics_name); zval property_exception_default_value; ZVAL_NULL(&property_exception_default_value); - zend_string *property_exception_name = zend_string_init("exception", sizeof("exception") - 1, true); + zend_string *property_exception_name = zend_string_init("exception", sizeof("exception") - 1, 1); zend_string *property_exception_class_Throwable = zend_string_init("Throwable", sizeof("Throwable")-1, 1); zend_declare_typed_property(class_entry, property_exception_name, &property_exception_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_exception_class_Throwable, 0, MAY_BE_NULL)); - zend_string_release_ex(property_exception_name, true); + zend_string_release(property_exception_name); zval property_id_default_value; ZVAL_UNDEF(&property_id_default_value); - zend_string *property_id_name = zend_string_init("id", sizeof("id") - 1, true); + zend_string *property_id_name = zend_string_init("id", sizeof("id") - 1, 1); zend_declare_typed_property(class_entry, property_id_name, &property_id_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_READONLY, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING)); - zend_string_release_ex(property_id_name, true); + zend_string_release(property_id_name); zval property_links_default_value; ZVAL_EMPTY_ARRAY(&property_links_default_value); - zend_string *property_links_name = zend_string_init("links", sizeof("links") - 1, true); + zend_string *property_links_name = zend_string_init("links", sizeof("links") - 1, 1); zend_declare_typed_property(class_entry, property_links_name, &property_links_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_ARRAY)); - zend_string_release_ex(property_links_name, true); + zend_string_release(property_links_name); zval property_events_default_value; ZVAL_EMPTY_ARRAY(&property_events_default_value); - zend_string *property_events_name = zend_string_init("events", sizeof("events") - 1, true); + zend_string *property_events_name = zend_string_init("events", sizeof("events") - 1, 1); zend_declare_typed_property(class_entry, property_events_name, &property_events_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_ARRAY)); - zend_string_release_ex(property_events_name, true); + zend_string_release(property_events_name); zval property_peerServiceSources_default_value; ZVAL_EMPTY_ARRAY(&property_peerServiceSources_default_value); - zend_string *property_peerServiceSources_name = zend_string_init("peerServiceSources", sizeof("peerServiceSources") - 1, true); + zend_string *property_peerServiceSources_name = zend_string_init("peerServiceSources", sizeof("peerServiceSources") - 1, 1); zend_declare_typed_property(class_entry, property_peerServiceSources_name, &property_peerServiceSources_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_ARRAY)); - zend_string_release_ex(property_peerServiceSources_name, true); + zend_string_release(property_peerServiceSources_name); zval property_parent_default_value; - ZVAL_UNDEF(&property_parent_default_value); + ZVAL_NULL(&property_parent_default_value); zend_string *property_parent_class_DDTrace_SpanData = zend_string_init("DDTrace\\SpanData", sizeof("DDTrace\\SpanData")-1, 1); zend_declare_typed_property(class_entry, ZSTR_KNOWN(ZEND_STR_PARENT), &property_parent_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_READONLY, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_parent_class_DDTrace_SpanData, 0, MAY_BE_NULL)); zval property_stack_default_value; ZVAL_UNDEF(&property_stack_default_value); - zend_string *property_stack_name = zend_string_init("stack", sizeof("stack") - 1, true); + zend_string *property_stack_name = zend_string_init("stack", sizeof("stack") - 1, 1); zend_string *property_stack_class_DDTrace_SpanStack = zend_string_init("DDTrace\\SpanStack", sizeof("DDTrace\\SpanStack")-1, 1); zend_declare_typed_property(class_entry, property_stack_name, &property_stack_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_READONLY, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_stack_class_DDTrace_SpanStack, 0, 0)); - zend_string_release_ex(property_stack_name, true); + zend_string_release(property_stack_name); zval property_onClose_default_value; ZVAL_EMPTY_ARRAY(&property_onClose_default_value); - zend_string *property_onClose_name = zend_string_init("onClose", sizeof("onClose") - 1, true); + zend_string *property_onClose_name = zend_string_init("onClose", sizeof("onClose") - 1, 1); zend_declare_typed_property(class_entry, property_onClose_name, &property_onClose_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_ARRAY)); - zend_string_release_ex(property_onClose_name, true); + zend_string_release(property_onClose_name); zval property_baggage_default_value; ZVAL_EMPTY_ARRAY(&property_baggage_default_value); - zend_string *property_baggage_name = zend_string_init("baggage", sizeof("baggage") - 1, true); + zend_string *property_baggage_name = zend_string_init("baggage", sizeof("baggage") - 1, 1); zend_declare_typed_property(class_entry, property_baggage_name, &property_baggage_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_ARRAY)); - zend_string_release_ex(property_baggage_name, true); + zend_string_release(property_baggage_name); return class_entry; } @@ -791,65 +796,65 @@ static zend_class_entry *register_class_DDTrace_RootSpanData(zend_class_entry *c zval property_origin_default_value; ZVAL_UNDEF(&property_origin_default_value); - zend_string *property_origin_name = zend_string_init("origin", sizeof("origin") - 1, true); + zend_string *property_origin_name = zend_string_init("origin", sizeof("origin") - 1, 1); zend_declare_typed_property(class_entry, property_origin_name, &property_origin_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING)); - zend_string_release_ex(property_origin_name, true); + zend_string_release(property_origin_name); zval property_propagatedTags_default_value; ZVAL_EMPTY_ARRAY(&property_propagatedTags_default_value); - zend_string *property_propagatedTags_name = zend_string_init("propagatedTags", sizeof("propagatedTags") - 1, true); + zend_string *property_propagatedTags_name = zend_string_init("propagatedTags", sizeof("propagatedTags") - 1, 1); zend_declare_typed_property(class_entry, property_propagatedTags_name, &property_propagatedTags_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_ARRAY)); - zend_string_release_ex(property_propagatedTags_name, true); + zend_string_release(property_propagatedTags_name); zval property_samplingPriority_default_value; ZVAL_LONG(&property_samplingPriority_default_value, DDTRACE_PRIORITY_SAMPLING_UNKNOWN); - zend_string *property_samplingPriority_name = zend_string_init("samplingPriority", sizeof("samplingPriority") - 1, true); + zend_string *property_samplingPriority_name = zend_string_init("samplingPriority", sizeof("samplingPriority") - 1, 1); zend_declare_typed_property(class_entry, property_samplingPriority_name, &property_samplingPriority_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG)); - zend_string_release_ex(property_samplingPriority_name, true); + zend_string_release(property_samplingPriority_name); zval property_propagatedSamplingPriority_default_value; ZVAL_UNDEF(&property_propagatedSamplingPriority_default_value); - zend_string *property_propagatedSamplingPriority_name = zend_string_init("propagatedSamplingPriority", sizeof("propagatedSamplingPriority") - 1, true); + zend_string *property_propagatedSamplingPriority_name = zend_string_init("propagatedSamplingPriority", sizeof("propagatedSamplingPriority") - 1, 1); zend_declare_typed_property(class_entry, property_propagatedSamplingPriority_name, &property_propagatedSamplingPriority_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG)); - zend_string_release_ex(property_propagatedSamplingPriority_name, true); + zend_string_release(property_propagatedSamplingPriority_name); zval property_tracestate_default_value; ZVAL_UNDEF(&property_tracestate_default_value); - zend_string *property_tracestate_name = zend_string_init("tracestate", sizeof("tracestate") - 1, true); + zend_string *property_tracestate_name = zend_string_init("tracestate", sizeof("tracestate") - 1, 1); zend_declare_typed_property(class_entry, property_tracestate_name, &property_tracestate_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING)); - zend_string_release_ex(property_tracestate_name, true); + zend_string_release(property_tracestate_name); zval property_tracestateTags_default_value; ZVAL_EMPTY_ARRAY(&property_tracestateTags_default_value); - zend_string *property_tracestateTags_name = zend_string_init("tracestateTags", sizeof("tracestateTags") - 1, true); + zend_string *property_tracestateTags_name = zend_string_init("tracestateTags", sizeof("tracestateTags") - 1, 1); zend_declare_typed_property(class_entry, property_tracestateTags_name, &property_tracestateTags_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_ARRAY)); - zend_string_release_ex(property_tracestateTags_name, true); + zend_string_release(property_tracestateTags_name); zval property_parentId_default_value; ZVAL_UNDEF(&property_parentId_default_value); - zend_string *property_parentId_name = zend_string_init("parentId", sizeof("parentId") - 1, true); + zend_string *property_parentId_name = zend_string_init("parentId", sizeof("parentId") - 1, 1); zend_declare_typed_property(class_entry, property_parentId_name, &property_parentId_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING)); - zend_string_release_ex(property_parentId_name, true); + zend_string_release(property_parentId_name); zval property_traceId_default_value; ZVAL_EMPTY_STRING(&property_traceId_default_value); - zend_string *property_traceId_name = zend_string_init("traceId", sizeof("traceId") - 1, true); + zend_string *property_traceId_name = zend_string_init("traceId", sizeof("traceId") - 1, 1); zend_declare_typed_property(class_entry, property_traceId_name, &property_traceId_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING)); - zend_string_release_ex(property_traceId_name, true); + zend_string_release(property_traceId_name); zval property_gitMetadata_default_value; ZVAL_NULL(&property_gitMetadata_default_value); - zend_string *property_gitMetadata_name = zend_string_init("gitMetadata", sizeof("gitMetadata") - 1, true); + zend_string *property_gitMetadata_name = zend_string_init("gitMetadata", sizeof("gitMetadata") - 1, 1); zend_string *property_gitMetadata_class_DDTrace_GitMetadata = zend_string_init("DDTrace\\GitMetadata", sizeof("DDTrace\\GitMetadata")-1, 1); zend_declare_typed_property(class_entry, property_gitMetadata_name, &property_gitMetadata_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_gitMetadata_class_DDTrace_GitMetadata, 0, MAY_BE_NULL)); - zend_string_release_ex(property_gitMetadata_name, true); + zend_string_release(property_gitMetadata_name); zval property_inferredSpan_default_value; ZVAL_NULL(&property_inferredSpan_default_value); - zend_string *property_inferredSpan_name = zend_string_init("inferredSpan", sizeof("inferredSpan") - 1, true); + zend_string *property_inferredSpan_name = zend_string_init("inferredSpan", sizeof("inferredSpan") - 1, 1); zend_string *property_inferredSpan_class_DDTrace_InferredSpanData = zend_string_init("DDTrace\\InferredSpanData", sizeof("DDTrace\\InferredSpanData")-1, 1); zend_declare_typed_property(class_entry, property_inferredSpan_name, &property_inferredSpan_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_inferredSpan_class_DDTrace_InferredSpanData, 0, MAY_BE_NULL)); - zend_string_release_ex(property_inferredSpan_name, true); + zend_string_release(property_inferredSpan_name); return class_entry; } @@ -862,22 +867,22 @@ static zend_class_entry *register_class_DDTrace_SpanStack(void) class_entry = zend_register_internal_class_with_flags(&ce, NULL, 0); zval property_parent_default_value; - ZVAL_UNDEF(&property_parent_default_value); + ZVAL_NULL(&property_parent_default_value); zend_string *property_parent_class_DDTrace_SpanStack = zend_string_init("DDTrace\\SpanStack", sizeof("DDTrace\\SpanStack")-1, 1); zend_declare_typed_property(class_entry, ZSTR_KNOWN(ZEND_STR_PARENT), &property_parent_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_READONLY, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_parent_class_DDTrace_SpanStack, 0, MAY_BE_NULL)); zval property_active_default_value; ZVAL_NULL(&property_active_default_value); - zend_string *property_active_name = zend_string_init("active", sizeof("active") - 1, true); + zend_string *property_active_name = zend_string_init("active", sizeof("active") - 1, 1); zend_string *property_active_class_DDTrace_SpanData = zend_string_init("DDTrace\\SpanData", sizeof("DDTrace\\SpanData")-1, 1); zend_declare_typed_property(class_entry, property_active_name, &property_active_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_active_class_DDTrace_SpanData, 0, MAY_BE_NULL)); - zend_string_release_ex(property_active_name, true); + zend_string_release(property_active_name); zval property_spanCreationObservers_default_value; ZVAL_EMPTY_ARRAY(&property_spanCreationObservers_default_value); - zend_string *property_spanCreationObservers_name = zend_string_init("spanCreationObservers", sizeof("spanCreationObservers") - 1, true); + zend_string *property_spanCreationObservers_name = zend_string_init("spanCreationObservers", sizeof("spanCreationObservers") - 1, 1); zend_declare_typed_property(class_entry, property_spanCreationObservers_name, &property_spanCreationObservers_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_ARRAY)); - zend_string_release_ex(property_spanCreationObservers_name, true); + zend_string_release(property_spanCreationObservers_name); return class_entry; } @@ -891,21 +896,21 @@ static zend_class_entry *register_class_DDTrace_Integration(void) zval const_NOT_LOADED_value; ZVAL_LONG(&const_NOT_LOADED_value, DD_TRACE_INTEGRATION_NOT_LOADED); - zend_string *const_NOT_LOADED_name = zend_string_init_interned("NOT_LOADED", sizeof("NOT_LOADED") - 1, true); + zend_string *const_NOT_LOADED_name = zend_string_init_interned("NOT_LOADED", sizeof("NOT_LOADED") - 1, 1); zend_declare_class_constant_ex(class_entry, const_NOT_LOADED_name, &const_NOT_LOADED_value, ZEND_ACC_PUBLIC, NULL); - zend_string_release_ex(const_NOT_LOADED_name, true); + zend_string_release(const_NOT_LOADED_name); zval const_LOADED_value; ZVAL_LONG(&const_LOADED_value, DD_TRACE_INTEGRATION_LOADED); - zend_string *const_LOADED_name = zend_string_init_interned("LOADED", sizeof("LOADED") - 1, true); + zend_string *const_LOADED_name = zend_string_init_interned("LOADED", sizeof("LOADED") - 1, 1); zend_declare_class_constant_ex(class_entry, const_LOADED_name, &const_LOADED_value, ZEND_ACC_PUBLIC, NULL); - zend_string_release_ex(const_LOADED_name, true); + zend_string_release(const_LOADED_name); zval const_NOT_AVAILABLE_value; ZVAL_LONG(&const_NOT_AVAILABLE_value, DD_TRACE_INTEGRATION_NOT_AVAILABLE); - zend_string *const_NOT_AVAILABLE_name = zend_string_init_interned("NOT_AVAILABLE", sizeof("NOT_AVAILABLE") - 1, true); + zend_string *const_NOT_AVAILABLE_name = zend_string_init_interned("NOT_AVAILABLE", sizeof("NOT_AVAILABLE") - 1, 1); zend_declare_class_constant_ex(class_entry, const_NOT_AVAILABLE_name, &const_NOT_AVAILABLE_value, ZEND_ACC_PUBLIC, NULL); - zend_string_release_ex(const_NOT_AVAILABLE_name, true); + zend_string_release(const_NOT_AVAILABLE_name); return class_entry; } diff --git a/src/DDTrace/Integrations/Laravel/LaravelIntegration.php b/src/DDTrace/Integrations/Laravel/LaravelIntegration.php index 3e1971666b..ec15b8fc8e 100644 --- a/src/DDTrace/Integrations/Laravel/LaravelIntegration.php +++ b/src/DDTrace/Integrations/Laravel/LaravelIntegration.php @@ -577,6 +577,10 @@ static function (HookData $hook) { } ); + if (!\DDTrace\are_endpoints_collected()) { + var_dump("endpoints not collected"); + } + return Integration::LOADED; } From d9635812c1aa85f87963ff47fdd3948466445b3d Mon Sep 17 00:00:00 2001 From: Alejandro Estringana Ruiz Date: Thu, 21 Aug 2025 16:50:57 +0200 Subject: [PATCH 02/53] Aproaching solution --- components-rs/common.h | 27 ++++++++++++++ components-rs/ddtrace.h | 11 ++++-- components-rs/telemetry.rs | 28 ++++++++++++--- ext/ddtrace.c | 36 ++++++++++++++----- ext/ddtrace.stub.php | 7 ++++ ext/ddtrace_arginfo.h | 11 +++++- .../Laravel/LaravelIntegration.php | 6 ++-- 7 files changed, 106 insertions(+), 20 deletions(-) diff --git a/components-rs/common.h b/components-rs/common.h index bfe1502bce..1bd97177a9 100644 --- a/components-rs/common.h +++ b/components-rs/common.h @@ -306,6 +306,33 @@ typedef enum ddog_Log { DDOG_LOG_HOOK_TRACE = (5 | (4 << 4)), } ddog_Log; +typedef enum ddog_EndpointMethod { + DDOG_ENDPOINT_METHOD_GET = 0, + DDOG_ENDPOINT_METHOD_POST = 1, + DDOG_ENDPOINT_METHOD_PUT = 2, + DDOG_ENDPOINT_METHOD_DELETE = 3, + DDOG_ENDPOINT_METHOD_PATCH = 4, + DDOG_ENDPOINT_METHOD_HEAD = 5, + DDOG_ENDPOINT_METHOD_OPTIONS = 6, + DDOG_ENDPOINT_METHOD_TRACE = 7, + DDOG_ENDPOINT_METHOD_CONNECT = 8, + DDOG_ENDPOINT_METHOD_OTHER = 9, +} ddog_EndpointMethod; + +typedef enum ddog_EndpointAuthentication { + DDOG_ENDPOINT_AUTHENTICATION_JWT = 0, + DDOG_ENDPOINT_AUTHENTICATION_BASIC = 1, + DDOG_ENDPOINT_AUTHENTICATION_OAUTH = 2, + DDOG_ENDPOINT_AUTHENTICATION_OIDC = 3, + DDOG_ENDPOINT_AUTHENTICATION_API_KEY = 4, + DDOG_ENDPOINT_AUTHENTICATION_SESSION = 5, + DDOG_ENDPOINT_AUTHENTICATION_MTLS = 6, + DDOG_ENDPOINT_AUTHENTICATION_SAML = 7, + DDOG_ENDPOINT_AUTHENTICATION_LDAP = 8, + DDOG_ENDPOINT_AUTHENTICATION_FORM = 9, + DDOG_ENDPOINT_AUTHENTICATION_OTHER = 10, +} ddog_EndpointAuthentication; + typedef enum ddog_MetricKind { DDOG_METRIC_KIND_COUNT, DDOG_METRIC_KIND_GAUGE, diff --git a/components-rs/ddtrace.h b/components-rs/ddtrace.h index 9184668a27..5ee1d7cfc8 100644 --- a/components-rs/ddtrace.h +++ b/components-rs/ddtrace.h @@ -182,9 +182,14 @@ ddog_MaybeError ddog_sidecar_telemetry_filter_flush(struct ddog_SidecarTransport ddog_CharSlice service, ddog_CharSlice env); -bool ddog_sidecar_telemetry_are_endpoints_collected(ddog_ShmCacheMap *cache, - ddog_CharSlice service, - ddog_CharSlice env); +bool ddog_sidecar_telemetry_are_endpoints_collected(struct ddog_SidecarActionsBuffer *buffer); + +void ddog_sidecar_telemetry_add_endpoint(struct ddog_SidecarActionsBuffer *buffer, + ddog_CharSlice type, + ddog_EndpointMethod method, + ddog_CharSlice path, + ddog_CharSlice operation_name, + ddog_CharSlice resource_name); void ddog_init_span_func(void (*free_func)(struct _zend_string*), void (*addref_func)(struct _zend_string*)); diff --git a/components-rs/telemetry.rs b/components-rs/telemetry.rs index 576abc9f9f..e322c82ce8 100644 --- a/components-rs/telemetry.rs +++ b/components-rs/telemetry.rs @@ -362,11 +362,29 @@ pub unsafe extern "C" fn ddog_sidecar_telemetry_filter_flush( #[no_mangle] pub unsafe extern "C" fn ddog_sidecar_telemetry_are_endpoints_collected( - cache: &mut ShmCacheMap, - service: CharSlice, - env: CharSlice, + buffer: &SidecarActionsBuffer, ) -> bool { - let cache_entry = ddog_sidecar_telemetry_cache_get_or_update(cache, service, env); + buffer.buffer.iter().any(|action| match action { + SidecarAction::AddEndpoint(_) => true, + _ => false, + }) +} - cache_entry.map_or(false, |entry| !entry.endpoints.is_empty()) +#[no_mangle] +pub unsafe extern "C" fn ddog_sidecar_telemetry_add_endpoint( + buffer: &mut SidecarActionsBuffer, + r#type: CharSlice, + method: ddtelemetry::data::Method, + path: CharSlice, + operation_name: CharSlice, + resource_name: CharSlice, +) { + let endpoint = Endpoint { + r#type: Some(r#type.to_utf8_lossy().into_owned()), + method: Some(method), + path: Some(path.to_utf8_lossy().into_owned()), + operation_name: operation_name.to_utf8_lossy().into_owned(), + resource_name: resource_name.to_utf8_lossy().into_owned(), + }; + buffer.buffer.push(SidecarAction::AddEndpoint(endpoint)); } diff --git a/ext/ddtrace.c b/ext/ddtrace.c index b3269a280c..33b731c269 100644 --- a/ext/ddtrace.c +++ b/ext/ddtrace.c @@ -2362,15 +2362,6 @@ PHP_FUNCTION(datadog_appsec_v2_track_user_login_failure) { } } -PHP_FUNCTION(DDTrace_are_endpoints_collected) { - UNUSED(execute_data); - - ddog_CharSlice service_name = dd_zend_string_to_CharSlice(DDTRACE_G(last_service_name)); - ddog_CharSlice env_name = dd_zend_string_to_CharSlice(DDTRACE_G(last_env_name)); - - RETURN_BOOL(ddog_sidecar_telemetry_are_endpoints_collected(ddtrace_telemetry_cache(), service_name, env_name)); -} - PHP_FUNCTION(dd_trace_serialize_closed_spans) { UNUSED(execute_data); @@ -2774,6 +2765,33 @@ PHP_FUNCTION(DDTrace_dogstatsd_set) { RETURN_NULL(); } +PHP_FUNCTION(DDTrace_are_endpoints_collected) { + UNUSED(execute_data); + + RETURN_BOOL(ddog_sidecar_telemetry_are_endpoints_collected(ddtrace_telemetry_buffer())); +} + +PHP_FUNCTION(DDTrace_add_endpoint) { + UNUSED(execute_data); + zend_string *type = NULL; + zend_string *path = NULL; + zend_string *operation_name = NULL; + zend_string *resource_name = NULL; + + if (zend_parse_parameters(ZEND_NUM_ARGS(), "SSSS", &type, &path, &operation_name, &resource_name) == FAILURE) { + RETURN_THROWS(); + } + + ddog_CharSlice type_slice = dd_zend_string_to_CharSlice(type); + ddog_EndpointMethod method_enum = DDOG_ENDPOINT_METHOD_GET; + ddog_CharSlice path_slice = dd_zend_string_to_CharSlice(path); + ddog_CharSlice operation_name_slice = dd_zend_string_to_CharSlice(operation_name); + ddog_CharSlice resource_name_slice = dd_zend_string_to_CharSlice(resource_name); + + ddog_sidecar_telemetry_add_endpoint(ddtrace_telemetry_buffer(), type_slice, method_enum, path_slice, operation_name_slice, resource_name_slice); + RETURN_NULL(); +} + PHP_FUNCTION(dd_trace_send_traces_via_thread) { char *payload = NULL; ddtrace_zpplong_t num_traces = 0; diff --git a/ext/ddtrace.stub.php b/ext/ddtrace.stub.php index 4eaa18b616..042a62a380 100644 --- a/ext/ddtrace.stub.php +++ b/ext/ddtrace.stub.php @@ -829,6 +829,13 @@ function resource_weak_get(mixed $resource, string $key): mixed {} * @return bool */ function are_endpoints_collected(): bool {} + + /** + * Add an endpoint + * + * @param string $endpoint The endpoint to add + */ + function add_endpoint(string $type, string $path, string $operation_name, string $resource_name): void {} } namespace DDTrace\System { diff --git a/ext/ddtrace_arginfo.h b/ext/ddtrace_arginfo.h index 46b1e805e8..fd2de45cd4 100644 --- a/ext/ddtrace_arginfo.h +++ b/ext/ddtrace_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: 0ac2d264686a54fb18a7e7fa8c14f5ff1f0dfac6 */ + * Stub hash: a4f186a04a4ff627f06ea20f02e168091d637430 */ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_DDTrace_trace_method, 0, 3, _IS_BOOL, 0) ZEND_ARG_TYPE_INFO(0, className, IS_STRING, 0) @@ -168,6 +168,13 @@ ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_DDTrace_are_endpoints_collected, 0, 0, _IS_BOOL, 0) ZEND_END_ARG_INFO() +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_DDTrace_add_endpoint, 0, 4, IS_VOID, 0) + ZEND_ARG_TYPE_INFO(0, type, IS_STRING, 0) + ZEND_ARG_TYPE_INFO(0, path, IS_STRING, 0) + ZEND_ARG_TYPE_INFO(0, operation_name, IS_STRING, 0) + ZEND_ARG_TYPE_INFO(0, resource_name, IS_STRING, 0) +ZEND_END_ARG_INFO() + ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_DDTrace_System_container_id, 0, 0, IS_STRING, 1) ZEND_END_ARG_INFO() @@ -378,6 +385,7 @@ ZEND_FUNCTION(DDTrace_dogstatsd_set); ZEND_FUNCTION(DDTrace_resource_weak_store); ZEND_FUNCTION(DDTrace_resource_weak_get); ZEND_FUNCTION(DDTrace_are_endpoints_collected); +ZEND_FUNCTION(DDTrace_add_endpoint); ZEND_FUNCTION(DDTrace_System_container_id); ZEND_FUNCTION(DDTrace_Config_integration_analytics_enabled); ZEND_FUNCTION(DDTrace_Config_integration_analytics_sample_rate); @@ -469,6 +477,7 @@ static const zend_function_entry ext_functions[] = { ZEND_RAW_FENTRY(ZEND_NS_NAME("DDTrace", "resource_weak_store"), zif_DDTrace_resource_weak_store, arginfo_DDTrace_resource_weak_store, 0, NULL, NULL) ZEND_RAW_FENTRY(ZEND_NS_NAME("DDTrace", "resource_weak_get"), zif_DDTrace_resource_weak_get, arginfo_DDTrace_resource_weak_get, 0, NULL, NULL) ZEND_RAW_FENTRY(ZEND_NS_NAME("DDTrace", "are_endpoints_collected"), zif_DDTrace_are_endpoints_collected, arginfo_DDTrace_are_endpoints_collected, 0, NULL, NULL) + ZEND_RAW_FENTRY(ZEND_NS_NAME("DDTrace", "add_endpoint"), zif_DDTrace_add_endpoint, arginfo_DDTrace_add_endpoint, 0, NULL, NULL) ZEND_RAW_FENTRY(ZEND_NS_NAME("DDTrace\\System", "container_id"), zif_DDTrace_System_container_id, arginfo_DDTrace_System_container_id, 0, NULL, NULL) ZEND_RAW_FENTRY(ZEND_NS_NAME("DDTrace\\Config", "integration_analytics_enabled"), zif_DDTrace_Config_integration_analytics_enabled, arginfo_DDTrace_Config_integration_analytics_enabled, 0, NULL, NULL) ZEND_RAW_FENTRY(ZEND_NS_NAME("DDTrace\\Config", "integration_analytics_sample_rate"), zif_DDTrace_Config_integration_analytics_sample_rate, arginfo_DDTrace_Config_integration_analytics_sample_rate, 0, NULL, NULL) diff --git a/src/DDTrace/Integrations/Laravel/LaravelIntegration.php b/src/DDTrace/Integrations/Laravel/LaravelIntegration.php index ec15b8fc8e..8ef5a15356 100644 --- a/src/DDTrace/Integrations/Laravel/LaravelIntegration.php +++ b/src/DDTrace/Integrations/Laravel/LaravelIntegration.php @@ -578,9 +578,11 @@ static function (HookData $hook) { ); if (!\DDTrace\are_endpoints_collected()) { - var_dump("endpoints not collected"); + \DDTrace\add_endpoint("type", "/api/v1/traces", "operation_name", "resource_name"); + file_put_contents('/tmp/alex.log', "Adding endpoints" . PHP_EOL, FILE_APPEND); + } else { + file_put_contents('/tmp/alex.log', "Endpoints already added" . PHP_EOL, FILE_APPEND); } - return Integration::LOADED; } From 9101018337e2c3e9f6f400a0d2333b0431a1f24e Mon Sep 17 00:00:00 2001 From: Alejandro Estringana Ruiz Date: Fri, 22 Aug 2025 16:22:50 +0200 Subject: [PATCH 03/53] Use shared cache instead of local --- components-rs/ddtrace.h | 8 +++- components-rs/telemetry.rs | 46 ++++++++++++++++--- ext/ddtrace.c | 26 ++++++++++- .../Laravel/LaravelIntegration.php | 5 ++ 4 files changed, 74 insertions(+), 11 deletions(-) diff --git a/components-rs/ddtrace.h b/components-rs/ddtrace.h index 5ee1d7cfc8..b4543a3bd9 100644 --- a/components-rs/ddtrace.h +++ b/components-rs/ddtrace.h @@ -182,9 +182,13 @@ ddog_MaybeError ddog_sidecar_telemetry_filter_flush(struct ddog_SidecarTransport ddog_CharSlice service, ddog_CharSlice env); -bool ddog_sidecar_telemetry_are_endpoints_collected(struct ddog_SidecarActionsBuffer *buffer); +bool ddog_sidecar_telemetry_are_endpoints_collected(ddog_ShmCacheMap *cache, + ddog_CharSlice service, + ddog_CharSlice env); -void ddog_sidecar_telemetry_add_endpoint(struct ddog_SidecarActionsBuffer *buffer, +void ddog_sidecar_telemetry_add_endpoint(ddog_ShmCacheMap *cache, + ddog_CharSlice service, + ddog_CharSlice env, ddog_CharSlice type, ddog_EndpointMethod method, ddog_CharSlice path, diff --git a/components-rs/telemetry.rs b/components-rs/telemetry.rs index e322c82ce8..a4649968b3 100644 --- a/components-rs/telemetry.rs +++ b/components-rs/telemetry.rs @@ -25,6 +25,8 @@ use std::error::Error; use std::hash::{Hash, Hasher}; use std::str::FromStr; use zwohash::ZwoHasher; +use std::fs::OpenOptions; +use std::io::Write; #[cfg(windows)] macro_rules! windowsify_path { @@ -362,17 +364,29 @@ pub unsafe extern "C" fn ddog_sidecar_telemetry_filter_flush( #[no_mangle] pub unsafe extern "C" fn ddog_sidecar_telemetry_are_endpoints_collected( - buffer: &SidecarActionsBuffer, + cache: &mut ShmCacheMap, + service: CharSlice, + env: CharSlice, ) -> bool { - buffer.buffer.iter().any(|action| match action { - SidecarAction::AddEndpoint(_) => true, - _ => false, - }) + if let Ok(mut file) = OpenOptions::new().create(true).append(true).open("/tmp/rust.log") { + let _ = writeln!(file, "Checking if endpoints are collected"); + } + + let cache_entry = ddog_sidecar_telemetry_cache_get_or_update(cache, service, env); + if let Some(entry) = cache_entry { + if let Ok(mut file) = OpenOptions::new().create(true).append(true).open("/tmp/rust.log") { + let _ = writeln!(file, "Cache entry found"); + } + return !entry.endpoints.is_empty(); + } + false } #[no_mangle] pub unsafe extern "C" fn ddog_sidecar_telemetry_add_endpoint( - buffer: &mut SidecarActionsBuffer, + cache: &mut ShmCacheMap, + service: CharSlice, + env: CharSlice, r#type: CharSlice, method: ddtelemetry::data::Method, path: CharSlice, @@ -386,5 +400,23 @@ pub unsafe extern "C" fn ddog_sidecar_telemetry_add_endpoint( operation_name: operation_name.to_utf8_lossy().into_owned(), resource_name: resource_name.to_utf8_lossy().into_owned(), }; - buffer.buffer.push(SidecarAction::AddEndpoint(endpoint)); + if let Ok(mut file) = OpenOptions::new().create(true).append(true).open("/tmp/rust.log") { + let _ = writeln!(file, "Starting adding endpoint"); + } + let cache_entry = ddog_sidecar_telemetry_cache_get_or_update(cache, service, env); + if let Some(entry) = cache_entry { + if let Ok(mut file) = OpenOptions::new().create(true).append(true).open("/tmp/rust.log") { + let _ = writeln!(file, "Getting cache entry"); + } + if let Some(endpoints) = (&entry.endpoints as *const _ as *mut std::collections::HashSet).as_mut() { + if let Ok(mut file) = OpenOptions::new().create(true).append(true).open("/tmp/rust.log") { + let _ = writeln!(file, "Adding endpoint"); + } + endpoints.insert(endpoint); + } + + if let Ok(mut file) = OpenOptions::new().create(true).append(true).open("/tmp/rust.log") { + let _ = writeln!(file, "Ending adding endpoint"); + } + } } diff --git a/ext/ddtrace.c b/ext/ddtrace.c index 33b731c269..d7cab9b025 100644 --- a/ext/ddtrace.c +++ b/ext/ddtrace.c @@ -2768,7 +2768,19 @@ PHP_FUNCTION(DDTrace_dogstatsd_set) { PHP_FUNCTION(DDTrace_are_endpoints_collected) { UNUSED(execute_data); - RETURN_BOOL(ddog_sidecar_telemetry_are_endpoints_collected(ddtrace_telemetry_buffer())); + zend_string *service_string; + service_string = zend_string_init(ZEND_STRL("service"), 0); + ddog_CharSlice service_slice = dd_zend_string_to_CharSlice(service_string); + + zend_string *env_string = NULL; + env_string = zend_string_init(ZEND_STRL("env"), 0); + ddog_CharSlice env_slice = dd_zend_string_to_CharSlice(env_string); + bool result = ddog_sidecar_telemetry_are_endpoints_collected(ddtrace_telemetry_cache(), service_slice, env_slice); + + zend_string_release(service_string); + zend_string_release(env_string); + + RETURN_BOOL(result); } PHP_FUNCTION(DDTrace_add_endpoint) { @@ -2788,7 +2800,17 @@ PHP_FUNCTION(DDTrace_add_endpoint) { ddog_CharSlice operation_name_slice = dd_zend_string_to_CharSlice(operation_name); ddog_CharSlice resource_name_slice = dd_zend_string_to_CharSlice(resource_name); - ddog_sidecar_telemetry_add_endpoint(ddtrace_telemetry_buffer(), type_slice, method_enum, path_slice, operation_name_slice, resource_name_slice); + zend_string *service_string; + service_string = zend_string_init(ZEND_STRL("service"), 0); + ddog_CharSlice service_slice = dd_zend_string_to_CharSlice(service_string); + + zend_string *env_string = NULL; + env_string = zend_string_init(ZEND_STRL("env"), 0); + ddog_CharSlice env_slice = dd_zend_string_to_CharSlice(env_string); + + ddog_sidecar_telemetry_add_endpoint(ddtrace_telemetry_cache(), service_slice, env_slice, type_slice, method_enum, path_slice, operation_name_slice, resource_name_slice); + zend_string_release(service_string); + zend_string_release(env_string); RETURN_NULL(); } diff --git a/src/DDTrace/Integrations/Laravel/LaravelIntegration.php b/src/DDTrace/Integrations/Laravel/LaravelIntegration.php index 8ef5a15356..84a3a1f270 100644 --- a/src/DDTrace/Integrations/Laravel/LaravelIntegration.php +++ b/src/DDTrace/Integrations/Laravel/LaravelIntegration.php @@ -583,6 +583,11 @@ static function (HookData $hook) { } else { file_put_contents('/tmp/alex.log', "Endpoints already added" . PHP_EOL, FILE_APPEND); } + + if (\DDTrace\are_endpoints_collected()) { + file_put_contents('/tmp/alex.log', "2Endpoints already added" . PHP_EOL, FILE_APPEND); + } + return Integration::LOADED; } From 5ded43b18cf877b01981b2a0f8b44f710ee5871b Mon Sep 17 00:00:00 2001 From: Alejandro Estringana Ruiz Date: Mon, 25 Aug 2025 17:58:45 +0200 Subject: [PATCH 04/53] wip --- components-rs/ddtrace.h | 16 +++---- components-rs/sidecar.h | 14 +++--- components-rs/telemetry.rs | 46 ------------------- ext/ddtrace.c | 37 +++++++-------- .../Laravel/V9_x/CommonScenariosTest.php | 1 + 5 files changed, 34 insertions(+), 80 deletions(-) diff --git a/components-rs/ddtrace.h b/components-rs/ddtrace.h index b4543a3bd9..2f80eedc18 100644 --- a/components-rs/ddtrace.h +++ b/components-rs/ddtrace.h @@ -182,19 +182,19 @@ ddog_MaybeError ddog_sidecar_telemetry_filter_flush(struct ddog_SidecarTransport ddog_CharSlice service, ddog_CharSlice env); -bool ddog_sidecar_telemetry_are_endpoints_collected(ddog_ShmCacheMap *cache, - ddog_CharSlice service, - ddog_CharSlice env); - -void ddog_sidecar_telemetry_add_endpoint(ddog_ShmCacheMap *cache, - ddog_CharSlice service, - ddog_CharSlice env, +void ddog_sidecar_telemetry_addEndpoint(struct ddog_SidecarTransport **transport, + const struct ddog_InstanceId *instance_id, + const ddog_QueueId *queue_id, ddog_CharSlice type, - ddog_EndpointMethod method, + enum ddog_EndpointMethod method, ddog_CharSlice path, ddog_CharSlice operation_name, ddog_CharSlice resource_name); +bool ddog_sidecar_telemetry_are_endpoints_collected(ddog_ShmCacheMap *cache, + ddog_CharSlice service, + ddog_CharSlice env); + void ddog_init_span_func(void (*free_func)(struct _zend_string*), void (*addref_func)(struct _zend_string*)); diff --git a/components-rs/sidecar.h b/components-rs/sidecar.h index 4746e0d216..2a2b7678e3 100644 --- a/components-rs/sidecar.h +++ b/components-rs/sidecar.h @@ -132,12 +132,14 @@ ddog_MaybeError ddog_sidecar_telemetry_addDependency(struct ddog_SidecarTranspor /** * Reports an integration to the telemetry. */ -ddog_MaybeError ddog_sidecar_telemetry_addIntegration(struct ddog_SidecarTransport **transport, - const struct ddog_InstanceId *instance_id, - const ddog_QueueId *queue_id, - ddog_CharSlice integration_name, - ddog_CharSlice integration_version, - bool integration_enabled); + ddog_MaybeError ddog_sidecar_telemetry_addIntegration(struct ddog_SidecarTransport **transport, + const struct ddog_InstanceId *instance_id, + const ddog_QueueId *queue_id, + ddog_CharSlice type, + enum ddog_EndpointMethod method, + ddog_CharSlice path, + ddog_CharSlice operation_name, + ddog_CharSlice resource_name); /** * Enqueues a list of actions to be performed. diff --git a/components-rs/telemetry.rs b/components-rs/telemetry.rs index a4649968b3..00da89b2cf 100644 --- a/components-rs/telemetry.rs +++ b/components-rs/telemetry.rs @@ -368,55 +368,9 @@ pub unsafe extern "C" fn ddog_sidecar_telemetry_are_endpoints_collected( service: CharSlice, env: CharSlice, ) -> bool { - if let Ok(mut file) = OpenOptions::new().create(true).append(true).open("/tmp/rust.log") { - let _ = writeln!(file, "Checking if endpoints are collected"); - } - let cache_entry = ddog_sidecar_telemetry_cache_get_or_update(cache, service, env); if let Some(entry) = cache_entry { - if let Ok(mut file) = OpenOptions::new().create(true).append(true).open("/tmp/rust.log") { - let _ = writeln!(file, "Cache entry found"); - } return !entry.endpoints.is_empty(); } false } - -#[no_mangle] -pub unsafe extern "C" fn ddog_sidecar_telemetry_add_endpoint( - cache: &mut ShmCacheMap, - service: CharSlice, - env: CharSlice, - r#type: CharSlice, - method: ddtelemetry::data::Method, - path: CharSlice, - operation_name: CharSlice, - resource_name: CharSlice, -) { - let endpoint = Endpoint { - r#type: Some(r#type.to_utf8_lossy().into_owned()), - method: Some(method), - path: Some(path.to_utf8_lossy().into_owned()), - operation_name: operation_name.to_utf8_lossy().into_owned(), - resource_name: resource_name.to_utf8_lossy().into_owned(), - }; - if let Ok(mut file) = OpenOptions::new().create(true).append(true).open("/tmp/rust.log") { - let _ = writeln!(file, "Starting adding endpoint"); - } - let cache_entry = ddog_sidecar_telemetry_cache_get_or_update(cache, service, env); - if let Some(entry) = cache_entry { - if let Ok(mut file) = OpenOptions::new().create(true).append(true).open("/tmp/rust.log") { - let _ = writeln!(file, "Getting cache entry"); - } - if let Some(endpoints) = (&entry.endpoints as *const _ as *mut std::collections::HashSet).as_mut() { - if let Ok(mut file) = OpenOptions::new().create(true).append(true).open("/tmp/rust.log") { - let _ = writeln!(file, "Adding endpoint"); - } - endpoints.insert(endpoint); - } - - if let Ok(mut file) = OpenOptions::new().create(true).append(true).open("/tmp/rust.log") { - let _ = writeln!(file, "Ending adding endpoint"); - } - } -} diff --git a/ext/ddtrace.c b/ext/ddtrace.c index d7cab9b025..f12deb8267 100644 --- a/ext/ddtrace.c +++ b/ext/ddtrace.c @@ -2768,19 +2768,21 @@ PHP_FUNCTION(DDTrace_dogstatsd_set) { PHP_FUNCTION(DDTrace_are_endpoints_collected) { UNUSED(execute_data); - zend_string *service_string; - service_string = zend_string_init(ZEND_STRL("service"), 0); - ddog_CharSlice service_slice = dd_zend_string_to_CharSlice(service_string); + if (!DDTRACE_G(last_service_name) || !DDTRACE_G(last_env_name)) { + RETURN_FALSE; + } - zend_string *env_string = NULL; - env_string = zend_string_init(ZEND_STRL("env"), 0); - ddog_CharSlice env_slice = dd_zend_string_to_CharSlice(env_string); - bool result = ddog_sidecar_telemetry_are_endpoints_collected(ddtrace_telemetry_cache(), service_slice, env_slice); + ddog_CharSlice service_name = dd_zend_string_to_CharSlice(DDTRACE_G(last_service_name)); + ddog_CharSlice env_name = dd_zend_string_to_CharSlice(DDTRACE_G(last_env_name)); - zend_string_release(service_string); - zend_string_release(env_string); + RETURN_BOOL(ddog_sidecar_telemetry_are_endpoints_collected(ddtrace_telemetry_cache(), service_name, env_name)); +} - RETURN_BOOL(result); +zend_string *get_env() { + if (get_DD_ENV() == NULL) { + return zend_string_init(ZEND_STRL("env"), 0); + } + return get_DD_ENV(); } PHP_FUNCTION(DDTrace_add_endpoint) { @@ -2800,18 +2802,13 @@ PHP_FUNCTION(DDTrace_add_endpoint) { ddog_CharSlice operation_name_slice = dd_zend_string_to_CharSlice(operation_name); ddog_CharSlice resource_name_slice = dd_zend_string_to_CharSlice(resource_name); - zend_string *service_string; - service_string = zend_string_init(ZEND_STRL("service"), 0); - ddog_CharSlice service_slice = dd_zend_string_to_CharSlice(service_string); + if (!ddtrace_sidecar || !ddtrace_sidecar_instance_id || !DDTRACE_G(sidecar_queue_id)) { + RETURN_FALSE; + } - zend_string *env_string = NULL; - env_string = zend_string_init(ZEND_STRL("env"), 0); - ddog_CharSlice env_slice = dd_zend_string_to_CharSlice(env_string); + ddog_sidecar_telemetry_addEndpoint(&ddtrace_sidecar, ddtrace_sidecar_instance_id, &DDTRACE_G(sidecar_queue_id), type_slice, method_enum, path_slice, operation_name_slice, resource_name_slice); - ddog_sidecar_telemetry_add_endpoint(ddtrace_telemetry_cache(), service_slice, env_slice, type_slice, method_enum, path_slice, operation_name_slice, resource_name_slice); - zend_string_release(service_string); - zend_string_release(env_string); - RETURN_NULL(); + RETURN_TRUE; } PHP_FUNCTION(dd_trace_send_traces_via_thread) { diff --git a/tests/Integrations/Laravel/V9_x/CommonScenariosTest.php b/tests/Integrations/Laravel/V9_x/CommonScenariosTest.php index 9c66a2a545..78ba4fb494 100644 --- a/tests/Integrations/Laravel/V9_x/CommonScenariosTest.php +++ b/tests/Integrations/Laravel/V9_x/CommonScenariosTest.php @@ -19,6 +19,7 @@ protected static function getEnvs() return array_merge(parent::getEnvs(), [ 'APP_NAME' => 'laravel_test_app', 'DD_SERVICE' => 'my_service', + 'DD_ENV' => 'my_env', ]); } } From 7f656594fa3dedf11f45e349fe62d96937df15a9 Mon Sep 17 00:00:00 2001 From: Alejandro Estringana Ruiz Date: Tue, 26 Aug 2025 12:50:59 +0200 Subject: [PATCH 05/53] Used last push endpoints --- components-rs/telemetry.rs | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/components-rs/telemetry.rs b/components-rs/telemetry.rs index 00da89b2cf..e2c4e693bd 100644 --- a/components-rs/telemetry.rs +++ b/components-rs/telemetry.rs @@ -5,6 +5,10 @@ use hashbrown::{Equivalent, HashMap}; use std::collections::HashSet; use std::ffi::CString; use std::path::PathBuf; +<<<<<<< HEAD +======= +use std::time::{Duration, Instant, SystemTime}; +>>>>>>> 76779fb28 (Used last push endpoints) use datadog_ipc::platform::NamedShmHandle; use datadog_sidecar::one_way_shared_memory::{open_named_shm, OneWayShmReader}; @@ -17,7 +21,7 @@ use ddcommon_ffi::slice::AsBytes; use ddcommon_ffi::{self as ffi, CharSlice, MaybeError}; use ddtelemetry::data; use ddtelemetry::data::metrics::{MetricNamespace, MetricType}; -use ddtelemetry::data::{Dependency, Endpoint, Integration, LogLevel}; +use ddtelemetry::data::{Dependency, Integration, LogLevel}; use ddtelemetry::metrics::MetricContext; use ddtelemetry::worker::{LogIdentifier, TelemetryActions}; use ddtelemetry_ffi::try_c; @@ -238,7 +242,7 @@ pub struct ShmCache { pub config_sent: bool, pub integrations: HashSet, pub composer_paths: HashSet, - pub endpoints: HashSet, + pub last_endpoints_push: SystemTime, pub reader: OneWayShmReader, } @@ -292,8 +296,8 @@ unsafe fn ddog_sidecar_telemetry_cache_get_or_update<'a>( } } - if let Ok((config_sent, integrations, composer_paths, endpoints)) = - bincode::deserialize::<(bool, HashSet, HashSet, HashSet)>(buf) + if let Ok((config_sent, integrations, composer_paths)) = + bincode::deserialize::<(bool, HashSet, HashSet)>(buf) { cache.config_sent = config_sent; cache.integrations = integrations; @@ -370,7 +374,7 @@ pub unsafe extern "C" fn ddog_sidecar_telemetry_are_endpoints_collected( ) -> bool { let cache_entry = ddog_sidecar_telemetry_cache_get_or_update(cache, service, env); if let Some(entry) = cache_entry { - return !entry.endpoints.is_empty(); + return entry.last_endpoints_push.elapsed().map_or(false, |d| d < Duration::from_secs(1800)); // 30 minutes } false } From 9bcf1051e00e7fd2f02f0fd401c33c11b720760b Mon Sep 17 00:00:00 2001 From: Alejandro Estringana Ruiz Date: Wed, 27 Aug 2025 11:33:14 +0200 Subject: [PATCH 06/53] Tests passing --- components-rs/ddtrace.h | 11 +---------- components-rs/sidecar.h | 9 +++++++++ ext/ddtrace.c | 2 +- ext/ddtrace.stub.php | 2 +- ext/ddtrace_arginfo.h | 4 ++-- .../Integrations/Laravel/V9_x/CommonScenariosTest.php | 1 - 6 files changed, 14 insertions(+), 15 deletions(-) diff --git a/components-rs/ddtrace.h b/components-rs/ddtrace.h index 2f80eedc18..844041ebd8 100644 --- a/components-rs/ddtrace.h +++ b/components-rs/ddtrace.h @@ -182,16 +182,7 @@ ddog_MaybeError ddog_sidecar_telemetry_filter_flush(struct ddog_SidecarTransport ddog_CharSlice service, ddog_CharSlice env); -void ddog_sidecar_telemetry_addEndpoint(struct ddog_SidecarTransport **transport, - const struct ddog_InstanceId *instance_id, - const ddog_QueueId *queue_id, - ddog_CharSlice type, - enum ddog_EndpointMethod method, - ddog_CharSlice path, - ddog_CharSlice operation_name, - ddog_CharSlice resource_name); - -bool ddog_sidecar_telemetry_are_endpoints_collected(ddog_ShmCacheMap *cache, +bool ddog_sidecar_telemetry_are_endpoints_collected(const ddog_ShmCacheMap *cache, ddog_CharSlice service, ddog_CharSlice env); diff --git a/components-rs/sidecar.h b/components-rs/sidecar.h index 2a2b7678e3..f9146df7c2 100644 --- a/components-rs/sidecar.h +++ b/components-rs/sidecar.h @@ -129,6 +129,15 @@ ddog_MaybeError ddog_sidecar_telemetry_addDependency(struct ddog_SidecarTranspor ddog_CharSlice dependency_name, ddog_CharSlice dependency_version); +ddog_MaybeError ddog_sidecar_telemetry_addEndpoint(struct ddog_SidecarTransport **transport, + const struct ddog_InstanceId *instance_id, + const ddog_QueueId *queue_id, + ddog_CharSlice type, + enum ddog_EndpointMethod method, + ddog_CharSlice path, + ddog_CharSlice operation_name, + ddog_CharSlice resource_name); + /** * Reports an integration to the telemetry. */ diff --git a/ext/ddtrace.c b/ext/ddtrace.c index f12deb8267..34f03ff471 100644 --- a/ext/ddtrace.c +++ b/ext/ddtrace.c @@ -2793,7 +2793,7 @@ PHP_FUNCTION(DDTrace_add_endpoint) { zend_string *resource_name = NULL; if (zend_parse_parameters(ZEND_NUM_ARGS(), "SSSS", &type, &path, &operation_name, &resource_name) == FAILURE) { - RETURN_THROWS(); + RETURN_FALSE; } ddog_CharSlice type_slice = dd_zend_string_to_CharSlice(type); diff --git a/ext/ddtrace.stub.php b/ext/ddtrace.stub.php index 042a62a380..c09fcd5068 100644 --- a/ext/ddtrace.stub.php +++ b/ext/ddtrace.stub.php @@ -835,7 +835,7 @@ function are_endpoints_collected(): bool {} * * @param string $endpoint The endpoint to add */ - function add_endpoint(string $type, string $path, string $operation_name, string $resource_name): void {} + function add_endpoint(string $type, string $path, string $operation_name, string $resource_name): bool {} } namespace DDTrace\System { diff --git a/ext/ddtrace_arginfo.h b/ext/ddtrace_arginfo.h index fd2de45cd4..55747b4798 100644 --- a/ext/ddtrace_arginfo.h +++ b/ext/ddtrace_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: a4f186a04a4ff627f06ea20f02e168091d637430 */ + * Stub hash: 2e20ff786d3d6b49f409648a8d98ce9b7d5f9850 */ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_DDTrace_trace_method, 0, 3, _IS_BOOL, 0) ZEND_ARG_TYPE_INFO(0, className, IS_STRING, 0) @@ -168,7 +168,7 @@ ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_DDTrace_are_endpoints_collected, 0, 0, _IS_BOOL, 0) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_DDTrace_add_endpoint, 0, 4, IS_VOID, 0) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_DDTrace_add_endpoint, 0, 4, _IS_BOOL, 0) ZEND_ARG_TYPE_INFO(0, type, IS_STRING, 0) ZEND_ARG_TYPE_INFO(0, path, IS_STRING, 0) ZEND_ARG_TYPE_INFO(0, operation_name, IS_STRING, 0) diff --git a/tests/Integrations/Laravel/V9_x/CommonScenariosTest.php b/tests/Integrations/Laravel/V9_x/CommonScenariosTest.php index 78ba4fb494..9c66a2a545 100644 --- a/tests/Integrations/Laravel/V9_x/CommonScenariosTest.php +++ b/tests/Integrations/Laravel/V9_x/CommonScenariosTest.php @@ -19,7 +19,6 @@ protected static function getEnvs() return array_merge(parent::getEnvs(), [ 'APP_NAME' => 'laravel_test_app', 'DD_SERVICE' => 'my_service', - 'DD_ENV' => 'my_env', ]); } } From 17bf6d7c97ab05c937aba94b6580ee4d5f80e7a5 Mon Sep 17 00:00:00 2001 From: Alejandro Estringana Ruiz Date: Wed, 27 Aug 2025 12:39:13 +0200 Subject: [PATCH 07/53] Fix rebase errors --- components-rs/telemetry.rs | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/components-rs/telemetry.rs b/components-rs/telemetry.rs index e2c4e693bd..bed7627fa3 100644 --- a/components-rs/telemetry.rs +++ b/components-rs/telemetry.rs @@ -5,10 +5,7 @@ use hashbrown::{Equivalent, HashMap}; use std::collections::HashSet; use std::ffi::CString; use std::path::PathBuf; -<<<<<<< HEAD -======= use std::time::{Duration, Instant, SystemTime}; ->>>>>>> 76779fb28 (Used last push endpoints) use datadog_ipc::platform::NamedShmHandle; use datadog_sidecar::one_way_shared_memory::{open_named_shm, OneWayShmReader}; @@ -292,16 +289,18 @@ unsafe fn ddog_sidecar_telemetry_cache_get_or_update<'a>( cache.config_sent = false; cache.integrations.clear(); cache.composer_paths.clear(); + cache.last_endpoints_push = SystemTime::UNIX_EPOCH; return; } } - if let Ok((config_sent, integrations, composer_paths)) = - bincode::deserialize::<(bool, HashSet, HashSet)>(buf) + if let Ok((config_sent, integrations, composer_paths, last_endpoints_push)) = + bincode::deserialize::<(bool, HashSet, HashSet, SystemTime)>(buf) { cache.config_sent = config_sent; cache.integrations = integrations; cache.composer_paths = composer_paths; + cache.last_endpoints_push = last_endpoints_push; } } } @@ -322,6 +321,7 @@ unsafe fn ddog_sidecar_telemetry_cache_get_or_update<'a>( config_sent: false, integrations: HashSet::new(), composer_paths: HashSet::new(), + last_endpoints_push: SystemTime::UNIX_EPOCH, }).into_mut(); refresh_cache(cached_entry); @@ -373,8 +373,9 @@ pub unsafe extern "C" fn ddog_sidecar_telemetry_are_endpoints_collected( env: CharSlice, ) -> bool { let cache_entry = ddog_sidecar_telemetry_cache_get_or_update(cache, service, env); - if let Some(entry) = cache_entry { - return entry.last_endpoints_push.elapsed().map_or(false, |d| d < Duration::from_secs(1800)); // 30 minutes + let result = cache_entry.last_endpoints_push.elapsed().map_or(false, |d| d < Duration::from_secs(1800)); // 30 minutes + if let Ok(mut file) = OpenOptions::new().create(true).append(true).open("/tmp/rust.log") { + let _ = writeln!(file, "Result: {} - {} - {}", result, cache_entry.last_endpoints_push.elapsed().unwrap().as_secs(), SystemTime::UNIX_EPOCH.elapsed().unwrap().as_secs()); } - false + result } From 58dba7fbf3ecd572cf161a01980fee7205e7023f Mon Sep 17 00:00:00 2001 From: Alejandro Estringana Ruiz Date: Thu, 25 Sep 2025 12:02:25 +0200 Subject: [PATCH 08/53] wip --- appsec/tests/extension/add_endpoints.phpt | 13 ++++++++++++ components-rs/remote_config.rs | 10 +++++++-- components-rs/telemetry.rs | 2 +- ext/ddtrace.c | 26 +++++++++++++++++++---- ext/ddtrace.stub.php | 2 +- ext/ddtrace_arginfo.h | 8 +++++-- 6 files changed, 51 insertions(+), 10 deletions(-) create mode 100644 appsec/tests/extension/add_endpoints.phpt diff --git a/appsec/tests/extension/add_endpoints.phpt b/appsec/tests/extension/add_endpoints.phpt new file mode 100644 index 0000000000..bda4df0b4b --- /dev/null +++ b/appsec/tests/extension/add_endpoints.phpt @@ -0,0 +1,13 @@ +--TEST-- +Add endpoints +--INI-- +extension=ddtrace.so +datadog.appsec.enabled=1 +--ENV-- +DD_INSTRUMENTATION_TELEMETRY_ENABLED=1 +--FILE-- + *mut Vec { - Box::into_raw(Box::new(str.as_slice().into())) +pub unsafe extern "C" fn ddog_CharSlice_to_owned(str: CharSlice) -> *mut ddcommon_ffi::Vec { + let std_vec: Vec = str.as_slice().into(); + Box::into_raw(Box::new(std_vec.into())) +} + +#[no_mangle] +pub unsafe extern "C" fn ddog_Vec_CChar_drop(ptr: *mut ddcommon_ffi::Vec) { + Box::from_raw(ptr); } #[no_mangle] diff --git a/components-rs/telemetry.rs b/components-rs/telemetry.rs index bed7627fa3..22f7d62172 100644 --- a/components-rs/telemetry.rs +++ b/components-rs/telemetry.rs @@ -375,7 +375,7 @@ pub unsafe extern "C" fn ddog_sidecar_telemetry_are_endpoints_collected( let cache_entry = ddog_sidecar_telemetry_cache_get_or_update(cache, service, env); let result = cache_entry.last_endpoints_push.elapsed().map_or(false, |d| d < Duration::from_secs(1800)); // 30 minutes if let Ok(mut file) = OpenOptions::new().create(true).append(true).open("/tmp/rust.log") { - let _ = writeln!(file, "Result: {} - {} - {}", result, cache_entry.last_endpoints_push.elapsed().unwrap().as_secs(), SystemTime::UNIX_EPOCH.elapsed().unwrap().as_secs()); + let _ = writeln!(file, "are_endpoints_collected?: {} - {} - {}", result, cache_entry.last_endpoints_push.elapsed().unwrap().as_secs(), SystemTime::UNIX_EPOCH.elapsed().unwrap().as_secs()); } result } diff --git a/ext/ddtrace.c b/ext/ddtrace.c index 34f03ff471..f133952306 100644 --- a/ext/ddtrace.c +++ b/ext/ddtrace.c @@ -2791,22 +2791,40 @@ PHP_FUNCTION(DDTrace_add_endpoint) { zend_string *path = NULL; zend_string *operation_name = NULL; zend_string *resource_name = NULL; - - if (zend_parse_parameters(ZEND_NUM_ARGS(), "SSSS", &type, &path, &operation_name, &resource_name) == FAILURE) { + zend_string *request_body_type = NULL; + zend_string *response_body_type = NULL; + zend_long response_code = 0; + int32_t authentication = 0; + php_printf("Here Alex 0\n"); + + if (zend_parse_parameters(ZEND_NUM_ARGS(), "SSSSSSll", &type, &path, &operation_name, &resource_name, &request_body_type, &response_body_type, &response_code, &authentication) == FAILURE) { + php_printf("Here Alex 1\n"); RETURN_FALSE; } ddog_CharSlice type_slice = dd_zend_string_to_CharSlice(type); - ddog_EndpointMethod method_enum = DDOG_ENDPOINT_METHOD_GET; + ddog_Method method_enum = DDOG_METHOD_GET; ddog_CharSlice path_slice = dd_zend_string_to_CharSlice(path); ddog_CharSlice operation_name_slice = dd_zend_string_to_CharSlice(operation_name); ddog_CharSlice resource_name_slice = dd_zend_string_to_CharSlice(resource_name); + zend_string *request_body_type_copy = zend_string_copy(request_body_type); + zend_string *response_body_type_copy = zend_string_copy(response_body_type); + struct ddog_Vec_CChar *request_body_type_vec = ddog_CharSlice_to_owned(dd_zend_string_to_CharSlice(request_body_type_copy)); + struct ddog_Vec_CChar *response_body_type_vec = ddog_CharSlice_to_owned(dd_zend_string_to_CharSlice(response_body_type_copy)); + // struct ddog_Vec_i32 *response_code_vec = ddog_number_to_owned_i32(response_code); + // // struct ddog_Vec_EndpointAuthentication authentication_vec = *ddog_number_to_owned_i32(authentication); + if (!ddtrace_sidecar || !ddtrace_sidecar_instance_id || !DDTRACE_G(sidecar_queue_id)) { + php_printf("Here Alex 2\n"); RETURN_FALSE; } - ddog_sidecar_telemetry_addEndpoint(&ddtrace_sidecar, ddtrace_sidecar_instance_id, &DDTRACE_G(sidecar_queue_id), type_slice, method_enum, path_slice, operation_name_slice, resource_name_slice); + php_printf("Here Alex \n"); + ddog_sidecar_telemetry_addEndpoint( + &ddtrace_sidecar, ddtrace_sidecar_instance_id, &DDTRACE_G(sidecar_queue_id), type_slice, method_enum, path_slice, operation_name_slice, resource_name_slice, request_body_type_vec, response_body_type_vec); + + php_printf("Here Alex 3\n"); RETURN_TRUE; } diff --git a/ext/ddtrace.stub.php b/ext/ddtrace.stub.php index c09fcd5068..7fbc8ce481 100644 --- a/ext/ddtrace.stub.php +++ b/ext/ddtrace.stub.php @@ -835,7 +835,7 @@ function are_endpoints_collected(): bool {} * * @param string $endpoint The endpoint to add */ - function add_endpoint(string $type, string $path, string $operation_name, string $resource_name): bool {} + function add_endpoint(string $type, string $path, string $operation_name, string $resource_name, string $body_type, string $response_type, int $response_code, int $authentication ): bool {} } namespace DDTrace\System { diff --git a/ext/ddtrace_arginfo.h b/ext/ddtrace_arginfo.h index 55747b4798..138071309f 100644 --- a/ext/ddtrace_arginfo.h +++ b/ext/ddtrace_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: 2e20ff786d3d6b49f409648a8d98ce9b7d5f9850 */ + * Stub hash: 7bd6ecc16babe0a130e1c41bbfe24af9dc623931 */ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_DDTrace_trace_method, 0, 3, _IS_BOOL, 0) ZEND_ARG_TYPE_INFO(0, className, IS_STRING, 0) @@ -168,11 +168,15 @@ ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_DDTrace_are_endpoints_collected, 0, 0, _IS_BOOL, 0) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_DDTrace_add_endpoint, 0, 4, _IS_BOOL, 0) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_DDTrace_add_endpoint, 0, 8, _IS_BOOL, 0) ZEND_ARG_TYPE_INFO(0, type, IS_STRING, 0) ZEND_ARG_TYPE_INFO(0, path, IS_STRING, 0) ZEND_ARG_TYPE_INFO(0, operation_name, IS_STRING, 0) ZEND_ARG_TYPE_INFO(0, resource_name, IS_STRING, 0) + ZEND_ARG_TYPE_INFO(0, body_type, IS_STRING, 0) + ZEND_ARG_TYPE_INFO(0, response_type, IS_STRING, 0) + ZEND_ARG_TYPE_INFO(0, response_code, IS_LONG, 0) + ZEND_ARG_TYPE_INFO(0, authentication, IS_LONG, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_DDTrace_System_container_id, 0, 0, IS_STRING, 1) From 85e515b7f3f9a6f9a2fbb17dcd221af5038c20c6 Mon Sep 17 00:00:00 2001 From: Alejandro Estringana Ruiz Date: Thu, 25 Sep 2025 12:07:00 +0200 Subject: [PATCH 09/53] Update generated files --- Cargo.lock | 1404 +++++++++++++++++----------------- components-rs/common.h | 198 +---- components-rs/crashtracker.h | 34 + components-rs/ddtrace.h | 121 ++- components-rs/sidecar.h | 43 +- 5 files changed, 896 insertions(+), 904 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 2ab8bec926..2969057723 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -57,7 +57,7 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" dependencies = [ - "libc 0.2.177", + "libc 0.2.173", ] [[package]] @@ -317,7 +317,7 @@ checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" dependencies = [ "addr2line", "cfg-if", - "libc 0.2.177", + "libc 0.2.173", "miniz_oxide", "object 0.36.7", "rustc-demangle", @@ -400,7 +400,7 @@ checksum = "95824d1dd4f20b4a4dfa63b72954e81914a718357231468180b30314e85057fa" dependencies = [ "cpp_demangle", "gimli 0.32.0", - "libc 0.2.177", + "libc 0.2.173", "memmap2", "miniz_oxide", "rustc-demangle", @@ -518,6 +518,16 @@ dependencies = [ "serde_json", ] +[[package]] +name = "build_common" +version = "21.0.0" +source = "git+https://github.com/DataDog/libdatadog?rev=0b59f64c4fc08105e5b73c5a0752ced3cf8f653e#0b59f64c4fc08105e5b73c5a0752ced3cf8f653e" +dependencies = [ + "cbindgen 0.29.0", + "serde", + "serde_json", +] + [[package]] name = "bumpalo" version = "3.16.0" @@ -594,7 +604,7 @@ checksum = "3fce8dd7fcfcbf3a0a87d8f515194b49d6135acab73e18bd380d1d93bb1a15eb" dependencies = [ "clap", "heck 0.4.1", - "indexmap 2.12.0", + "indexmap 2.7.1", "log", "proc-macro2", "quote", @@ -613,7 +623,7 @@ checksum = "975982cdb7ad6a142be15bdf84aea7ec6a9e5d4d797c004d43185b24cfe4e684" dependencies = [ "clap", "heck 0.5.0", - "indexmap 2.12.0", + "indexmap 2.7.1", "log", "proc-macro2", "quote", @@ -631,7 +641,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fcb57c740ae1daf453ae85f16e37396f672b039e00d9d866e07ddb24e328e3a" dependencies = [ "jobserver", - "libc 0.2.177", + "libc 0.2.173", "shlex", ] @@ -713,7 +723,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" dependencies = [ "glob", - "libc 0.2.177", + "libc 0.2.173", "libloading", ] @@ -875,7 +885,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b55271e5c8c478ad3f38ad24ef34923091e0548492a266d19b3c0b4d82574c63" dependencies = [ "core-foundation-sys", - "libc 0.2.177", + "libc 0.2.173", ] [[package]] @@ -899,7 +909,7 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e9e393a7668fe1fad3075085b86c781883000b4ede868f43627b34a87c8b7ded" dependencies = [ - "libc 0.2.177", + "libc 0.2.173", "winapi 0.3.9", ] @@ -909,7 +919,7 @@ version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "16b80225097f2e5ae4e7179dd2266824648f3e2f49d9134d584b76389d31c4c3" dependencies = [ - "libc 0.2.177", + "libc 0.2.173", ] [[package]] @@ -1088,6 +1098,114 @@ dependencies = [ "syn 2.0.96", ] +[[package]] +name = "data-pipeline" +version = "0.0.1" +dependencies = [ + "anyhow", + "arc-swap", + "bytes", + "clap", + "criterion", + "datadog-ddsketch", + "datadog-trace-protobuf", + "datadog-trace-utils", + "ddcommon 0.0.1", + "ddtelemetry", + "dogstatsd-client", + "either", + "hashbrown 0.15.2", + "http", + "http-body-util", + "httpmock", + "hyper", + "hyper-util", + "rand 0.8.5", + "regex", + "rmp-serde", + "serde", + "serde_json", + "sha2", + "tempfile", + "tinybytes", + "tokio", + "tokio-util", + "tracing", + "uuid", +] + +[[package]] +name = "datadog-alloc" +version = "21.0.0" +source = "git+https://github.com/DataDog/libdatadog?rev=0b59f64c4fc08105e5b73c5a0752ced3cf8f653e#0b59f64c4fc08105e5b73c5a0752ced3cf8f653e" +dependencies = [ + "allocator-api2", + "libc 0.2.173", + "windows-sys 0.52.0", +] + +[[package]] +name = "datadog-crashtracker" +version = "0.0.1" +dependencies = [ + "anyhow", + "backtrace", + "blazesym", + "cc", + "chrono", + "criterion", + "ddcommon 0.0.1", + "ddtelemetry", + "goblin", + "http", + "libc 0.2.173", + "nix", + "num-derive", + "num-traits", + "os_info", + "page_size", + "portable-atomic", + "rand 0.8.5", + "schemars", + "serde", + "serde_json", + "symbolic-common", + "symbolic-demangle", + "tempfile", + "thiserror 1.0.69", + "tokio", + "uuid", + "windows 0.59.0", +] + +[[package]] +name = "datadog-crashtracker-ffi" +version = "0.0.1" +dependencies = [ + "anyhow", + "build_common 0.0.1", + "datadog-crashtracker", + "ddcommon 0.0.1", + "ddcommon-ffi 0.0.1", + "function_name", + "libc 0.2.173", + "serde", + "serde_json", + "symbolic-common", + "symbolic-demangle", + "tempfile", + "windows 0.59.0", +] + +[[package]] +name = "datadog-ddsketch" +version = "0.0.1" +dependencies = [ + "prost", + "prost-build", + "protoc-bin-vendored", +] + [[package]] name = "datadog-ipc" version = "0.1.0" @@ -1096,12 +1214,11 @@ dependencies = [ "bytes", "criterion", "datadog-ipc-macros", + "ddcommon 0.0.1", "futures", "glibc_version", "io-lifetimes", - "libc 0.2.177", - "libdd-common 1.0.0", - "libdd-tinybytes", + "libc 0.2.173", "memfd", "nix", "page_size", @@ -1112,6 +1229,7 @@ dependencies = [ "spawn_worker", "tarpc", "tempfile", + "tinybytes", "tokio", "tokio-serde", "tokio-util", @@ -1129,16 +1247,69 @@ dependencies = [ "syn 2.0.96", ] +[[package]] +name = "datadog-library-config" +version = "0.0.2" +dependencies = [ + "anyhow", + "memfd", + "rand 0.8.5", + "rmp", + "rmp-serde", + "serde", + "serde_yaml", + "tempfile", +] + +[[package]] +name = "datadog-library-config" +version = "0.0.2" +source = "git+https://github.com/DataDog/libdatadog?rev=0b59f64c4fc08105e5b73c5a0752ced3cf8f653e#0b59f64c4fc08105e5b73c5a0752ced3cf8f653e" +dependencies = [ + "anyhow", + "memfd", + "rand 0.8.5", + "rmp", + "rmp-serde", + "serde", + "serde_yaml", +] + +[[package]] +name = "datadog-library-config-ffi" +version = "0.0.2" +dependencies = [ + "anyhow", + "build_common 0.0.1", + "constcat", + "datadog-library-config 0.0.2", + "ddcommon 0.0.1", + "ddcommon-ffi 0.0.1", + "tempfile", +] + +[[package]] +name = "datadog-library-config-ffi" +version = "0.0.2" +source = "git+https://github.com/DataDog/libdatadog?rev=0b59f64c4fc08105e5b73c5a0752ced3cf8f653e#0b59f64c4fc08105e5b73c5a0752ced3cf8f653e" +dependencies = [ + "anyhow", + "build_common 21.0.0", + "constcat", + "datadog-library-config 0.0.2 (git+https://github.com/DataDog/libdatadog?rev=0b59f64c4fc08105e5b73c5a0752ced3cf8f653e)", + "ddcommon 21.0.0", + "ddcommon-ffi 21.0.0", +] + [[package]] name = "datadog-live-debugger" version = "0.0.1" dependencies = [ "anyhow", "constcat", + "ddcommon 0.0.1", "http-body-util", "hyper", - "libdd-common 1.0.0", - "libdd-data-pipeline", "percent-encoding", "regex", "regex-automata 0.4.9", @@ -1154,10 +1325,10 @@ dependencies = [ name = "datadog-live-debugger-ffi" version = "0.0.1" dependencies = [ - "build_common", + "build_common 0.0.1", "datadog-live-debugger", - "libdd-common 1.0.0", - "libdd-common-ffi", + "ddcommon 0.0.1", + "ddcommon-ffi 0.0.1", "log", "percent-encoding", "serde_json", @@ -1181,14 +1352,14 @@ dependencies = [ "criterion", "criterion-perf-events", "crossbeam-channel", + "datadog-alloc", + "datadog-library-config-ffi 0.0.2 (git+https://github.com/DataDog/libdatadog?rev=0b59f64c4fc08105e5b73c5a0752ced3cf8f653e)", "datadog-php-profiling", + "datadog-profiling", + "ddcommon 21.0.0", "env_logger 0.11.6", "lazy_static", - "libc 0.2.177", - "libdd-alloc", - "libdd-common 1.0.0 (git+https://github.com/DataDog/libdatadog?tag=v24.0.2)", - "libdd-library-config-ffi", - "libdd-profiling", + "libc 0.2.173", "log", "once_cell", "perfcnt", @@ -1203,6 +1374,44 @@ dependencies = [ "uuid", ] +[[package]] +name = "datadog-profiling" +version = "21.0.0" +source = "git+https://github.com/DataDog/libdatadog?rev=0b59f64c4fc08105e5b73c5a0752ced3cf8f653e#0b59f64c4fc08105e5b73c5a0752ced3cf8f653e" +dependencies = [ + "anyhow", + "bitmaps", + "byteorder", + "bytes", + "chrono", + "datadog-alloc", + "datadog-profiling-protobuf", + "ddcommon 21.0.0", + "futures", + "http", + "http-body-util", + "hyper", + "hyper-multipart-rfc7578", + "indexmap 2.7.1", + "lz4_flex", + "mime", + "prost", + "rustc-hash", + "serde", + "serde_json", + "target-triple", + "tokio", + "tokio-util", +] + +[[package]] +name = "datadog-profiling-protobuf" +version = "21.0.0" +source = "git+https://github.com/DataDog/libdatadog?rev=0b59f64c4fc08105e5b73c5a0752ced3cf8f653e#0b59f64c4fc08105e5b73c5a0752ced3cf8f653e" +dependencies = [ + "prost", +] + [[package]] name = "datadog-remote-config" version = "0.0.1" @@ -1211,14 +1420,14 @@ dependencies = [ "base64 0.22.1", "datadog-live-debugger", "datadog-remote-config", + "datadog-trace-protobuf", + "ddcommon 0.0.1", "futures", "futures-util", "http", "http-body-util", "hyper", "hyper-util", - "libdd-common 1.0.0", - "libdd-trace-protobuf", "manual_future", "serde", "serde_json", @@ -1241,26 +1450,25 @@ dependencies = [ "bincode", "chrono", "console-subscriber", + "data-pipeline", + "datadog-crashtracker", + "datadog-crashtracker-ffi", "datadog-ipc", "datadog-ipc-macros", "datadog-live-debugger", "datadog-remote-config", "datadog-sidecar-macros", + "datadog-trace-utils", + "ddcommon 0.0.1", + "ddcommon-ffi 0.0.1", + "ddtelemetry", + "dogstatsd-client", "futures", "http", "http-body-util", "httpmock", "hyper", - "libc 0.2.177", - "libdd-common 1.0.0", - "libdd-common-ffi", - "libdd-crashtracker", - "libdd-crashtracker-ffi", - "libdd-data-pipeline", - "libdd-dogstatsd-client", - "libdd-telemetry", - "libdd-tinybytes", - "libdd-trace-utils", + "libc 0.2.173", "manual_future", "memory-stats", "microseh", @@ -1276,6 +1484,7 @@ dependencies = [ "simd-json", "spawn_worker", "tempfile", + "tinybytes", "tokio", "tokio-util", "tracing", @@ -1291,23 +1500,23 @@ dependencies = [ name = "datadog-sidecar-ffi" version = "0.0.1" dependencies = [ + "datadog-crashtracker-ffi", "datadog-ipc", "datadog-live-debugger", "datadog-remote-config", "datadog-sidecar", + "datadog-trace-utils", + "ddcommon 0.0.1", + "ddcommon-ffi 0.0.1", + "ddtelemetry", + "ddtelemetry-ffi", + "dogstatsd-client", "http", - "libc 0.2.177", - "libdd-common 1.0.0", - "libdd-common-ffi", - "libdd-crashtracker-ffi", - "libdd-dogstatsd-client", - "libdd-telemetry", - "libdd-telemetry-ffi", - "libdd-tinybytes", - "libdd-trace-utils", + "libc 0.2.173", "paste", "rmp-serde", "tempfile", + "tinybytes", "tracing", ] @@ -1320,96 +1529,302 @@ dependencies = [ ] [[package]] -name = "ddtrace-php" +name = "datadog-trace-normalization" version = "0.0.1" dependencies = [ "anyhow", - "bincode", - "cbindgen 0.27.0", - "const-str", - "datadog-ipc", - "datadog-live-debugger", - "datadog-live-debugger-ffi", - "datadog-remote-config", - "datadog-sidecar", - "datadog-sidecar-ffi", - "env_logger 0.10.2", - "hashbrown 0.15.2", - "http", - "itertools 0.11.0", - "lazy_static", - "libc 0.2.177", - "libdd-common 1.0.0", - "libdd-common-ffi", - "libdd-crashtracker-ffi", - "libdd-library-config-ffi", - "libdd-telemetry", - "libdd-telemetry-ffi", - "libdd-tinybytes", - "libdd-trace-utils", - "log", - "paste", - "regex", - "regex-automata 0.4.9", - "serde", - "serde_json", - "serde_with", - "simd-json", - "spawn_worker", - "tempfile", - "tracing", - "tracing-core", - "tracing-subscriber", - "uuid", - "zwohash", -] - -[[package]] -name = "debugid" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef552e6f588e446098f6ba40d89ac146c8c7b64aade83c051ee00bb5d2bc18d" -dependencies = [ - "uuid", + "criterion", + "datadog-trace-protobuf", + "duplicate", + "rand 0.8.5", ] [[package]] -name = "deranged" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +name = "datadog-trace-protobuf" +version = "0.0.1" dependencies = [ - "powerfmt", + "prost", + "prost-build", + "protoc-bin-vendored", "serde", + "serde_bytes", + "serde_json", + "tokio", ] [[package]] -name = "diff" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" - -[[package]] -name = "digest" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +name = "datadog-trace-utils" +version = "0.0.1" dependencies = [ - "block-buffer", - "crypto-common", + "anyhow", + "bolero", + "bytes", + "cargo-platform", + "cargo_metadata", + "criterion", + "datadog-trace-normalization", + "datadog-trace-protobuf", + "datadog-trace-utils", + "ddcommon 0.0.1", + "flate2", + "futures", + "http-body-util", + "httpmock", + "hyper", + "hyper-http-proxy", + "prost", + "rand 0.8.5", + "rmp", + "rmp-serde", + "rmpv", + "serde", + "serde_json", + "tempfile", + "tinybytes", + "tokio", + "tracing", + "urlencoding", + "zstd", ] [[package]] -name = "displaydoc" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +name = "ddcommon" +version = "0.0.1" +dependencies = [ + "anyhow", + "cc", + "const_format", + "futures", + "futures-core", + "futures-util", + "hex", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-rustls", + "hyper-util", + "indexmap 2.7.1", + "libc 0.2.173", + "maplit", + "nix", + "pin-project", + "regex", + "rustls", + "rustls-native-certs", + "serde", + "static_assertions", + "tempfile", + "thiserror 1.0.69", + "tokio", + "tokio-rustls", + "tower-service", + "windows-sys 0.52.0", +] + +[[package]] +name = "ddcommon" +version = "21.0.0" +source = "git+https://github.com/DataDog/libdatadog?rev=0b59f64c4fc08105e5b73c5a0752ced3cf8f653e#0b59f64c4fc08105e5b73c5a0752ced3cf8f653e" +dependencies = [ + "anyhow", + "cc", + "const_format", + "futures", + "futures-core", + "futures-util", + "hex", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-rustls", + "hyper-util", + "libc 0.2.173", + "nix", + "pin-project", + "regex", + "rustls", + "rustls-native-certs", + "serde", + "static_assertions", + "thiserror 1.0.69", + "tokio", + "tokio-rustls", + "tower-service", + "windows-sys 0.52.0", +] + +[[package]] +name = "ddcommon-ffi" +version = "0.0.1" +dependencies = [ + "anyhow", + "bolero", + "build_common 0.0.1", + "chrono", + "crossbeam-queue", + "ddcommon 0.0.1", + "hyper", + "serde", +] + +[[package]] +name = "ddcommon-ffi" +version = "21.0.0" +source = "git+https://github.com/DataDog/libdatadog?rev=0b59f64c4fc08105e5b73c5a0752ced3cf8f653e#0b59f64c4fc08105e5b73c5a0752ced3cf8f653e" +dependencies = [ + "anyhow", + "build_common 21.0.0", + "chrono", + "crossbeam-queue", + "ddcommon 21.0.0", + "hyper", + "serde", +] + +[[package]] +name = "ddtelemetry" +version = "0.0.1" +dependencies = [ + "anyhow", + "base64 0.22.1", + "datadog-ddsketch", + "ddcommon 0.0.1", + "futures", + "hashbrown 0.15.2", + "http", + "http-body-util", + "hyper", + "hyper-util", + "serde", + "serde_json", + "sys-info", + "tokio", + "tokio-util", + "tracing", + "tracing-subscriber", + "uuid", +] + +[[package]] +name = "ddtelemetry-ffi" +version = "0.0.1" +dependencies = [ + "build_common 0.0.1", + "ddcommon 0.0.1", + "ddcommon-ffi 0.0.1", + "ddtelemetry", + "function_name", + "libc 0.2.173", + "paste", + "tempfile", +] + +[[package]] +name = "ddtrace-php" +version = "0.0.1" +dependencies = [ + "anyhow", + "bincode", + "cbindgen 0.27.0", + "const-str", + "datadog-crashtracker-ffi", + "datadog-ipc", + "datadog-library-config-ffi 0.0.2", + "datadog-live-debugger", + "datadog-live-debugger-ffi", + "datadog-remote-config", + "datadog-sidecar", + "datadog-sidecar-ffi", + "datadog-trace-utils", + "ddcommon 0.0.1", + "ddcommon-ffi 0.0.1", + "ddtelemetry", + "ddtelemetry-ffi", + "env_logger 0.10.2", + "hashbrown 0.15.2", + "http", + "itertools 0.11.0", + "lazy_static", + "libc 0.2.173", + "log", + "paste", + "regex", + "regex-automata 0.4.9", + "serde", + "serde_json", + "serde_with", + "simd-json", + "spawn_worker", + "tempfile", + "tinybytes", + "tracing", + "tracing-core", + "tracing-subscriber", + "uuid", + "zwohash", +] + +[[package]] +name = "debugid" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef552e6f588e446098f6ba40d89ac146c8c7b64aade83c051ee00bb5d2bc18d" +dependencies = [ + "uuid", +] + +[[package]] +name = "deranged" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +dependencies = [ + "powerfmt", + "serde", +] + +[[package]] +name = "diff" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", "syn 2.0.96", ] +[[package]] +name = "dogstatsd-client" +version = "0.0.1" +dependencies = [ + "anyhow", + "cadence", + "ddcommon 0.0.1", + "http", + "serde", + "tokio", + "tracing", +] + [[package]] name = "dunce" version = "1.0.5" @@ -1507,7 +1922,7 @@ version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" dependencies = [ - "libc 0.2.177", + "libc 0.2.173", "windows-sys 0.59.0", ] @@ -1746,7 +2161,7 @@ checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", "js-sys", - "libc 0.2.177", + "libc 0.2.173", "wasi 0.11.0+wasi-snapshot-preview1", "wasm-bindgen", ] @@ -1758,7 +2173,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73fea8450eea4bac3940448fb7ae50d91f034f941199fcd9d909a5a07aa455f0" dependencies = [ "cfg-if", - "libc 0.2.177", + "libc 0.2.173", "r-efi", "wasi 0.14.2+wasi-0.2.4", ] @@ -1776,7 +2191,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "93563d740bc9ef04104f9ed6f86f1e3275c2cdafb95664e26584b9ca807a8ffe" dependencies = [ "fallible-iterator", - "indexmap 2.12.0", + "indexmap 2.7.1", "stable_deref_trait", ] @@ -1818,7 +2233,7 @@ dependencies = [ "futures-core", "futures-sink", "http", - "indexmap 2.12.0", + "indexmap 2.7.1", "slab", "tokio", "tokio-util", @@ -1872,12 +2287,6 @@ dependencies = [ "foldhash", ] -[[package]] -name = "hashbrown" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" - [[package]] name = "hdrhistogram" version = "7.5.4" @@ -2061,6 +2470,26 @@ dependencies = [ "want", ] +[[package]] +name = "hyper-http-proxy" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ad4b0a1e37510028bc4ba81d0e38d239c39671b0f0ce9e02dfa93a8133f7c08" +dependencies = [ + "bytes", + "futures-util", + "headers", + "http", + "hyper", + "hyper-rustls", + "hyper-util", + "pin-project-lite", + "tokio", + "tokio-rustls", + "tower-service", + "webpki-roots", +] + [[package]] name = "hyper-multipart-rfc7578" version = "0.9.0" @@ -2119,7 +2548,7 @@ dependencies = [ "http", "http-body", "hyper", - "libc 0.2.177", + "libc 0.2.173", "pin-project-lite", "socket2", "tokio", @@ -2298,551 +2727,144 @@ dependencies = [ [[package]] name = "indexmap" version = "1.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" -dependencies = [ - "autocfg", - "hashbrown 0.12.3", - "serde", -] - -[[package]] -name = "indexmap" -version = "2.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6717a8d2a5a929a1a2eb43a12812498ed141a0bcfb7e8f7844fbdbe4303bba9f" -dependencies = [ - "equivalent", - "hashbrown 0.16.0", - "serde", - "serde_core", -] - -[[package]] -name = "integer-encoding" -version = "3.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bb03732005da905c88227371639bf1ad885cc712789c011c31c5fb3ab3ccf02" - -[[package]] -name = "io-lifetimes" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" -dependencies = [ - "hermit-abi 0.3.9", - "libc 0.2.177", - "windows-sys 0.48.0", -] - -[[package]] -name = "is-terminal" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "261f68e344040fbd0edea105bef17c66edf46f984ddb1115b775ce31be948f4b" -dependencies = [ - "hermit-abi 0.4.0", - "libc 0.2.177", - "windows-sys 0.52.0", -] - -[[package]] -name = "is_terminal_polyfill" -version = "1.70.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" - -[[package]] -name = "itertools" -version = "0.10.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" -dependencies = [ - "either", -] - -[[package]] -name = "itertools" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" -dependencies = [ - "either", -] - -[[package]] -name = "itertools" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" -dependencies = [ - "either", -] - -[[package]] -name = "itoa" -version = "1.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" - -[[package]] -name = "jobserver" -version = "0.1.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" -dependencies = [ - "libc 0.2.177", -] - -[[package]] -name = "js-sys" -version = "0.3.77" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" -dependencies = [ - "once_cell", - "wasm-bindgen", -] - -[[package]] -name = "kernel32-sys" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" -dependencies = [ - "winapi 0.2.8", - "winapi-build", -] - -[[package]] -name = "lazy_static" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" - -[[package]] -name = "lazycell" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" - -[[package]] -name = "libc" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e32a70cf75e5846d53a673923498228bbec6a8624708a9ea5645f075d6276122" - -[[package]] -name = "libc" -version = "0.2.177" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" - -[[package]] -name = "libdd-alloc" -version = "1.0.0" -source = "git+https://github.com/DataDog/libdatadog?tag=v24.0.2#d0393310c6e86ed7eb120c6cb6255f4f6eab1b9b" -dependencies = [ - "allocator-api2", - "libc 0.2.177", - "windows-sys 0.52.0", -] - -[[package]] -name = "libdd-common" -version = "1.0.0" -dependencies = [ - "anyhow", - "cc", - "const_format", - "futures", - "futures-core", - "futures-util", - "hex", - "http", - "http-body", - "http-body-util", - "hyper", - "hyper-rustls", - "hyper-util", - "indexmap 2.12.0", - "libc 0.2.177", - "maplit", - "nix", - "pin-project", - "regex", - "rustls", - "rustls-native-certs", - "serde", - "static_assertions", - "tempfile", - "thiserror 1.0.69", - "tokio", - "tokio-rustls", - "tower-service", - "windows-sys 0.52.0", -] - -[[package]] -name = "libdd-common" -version = "1.0.0" -source = "git+https://github.com/DataDog/libdatadog?tag=v24.0.2#d0393310c6e86ed7eb120c6cb6255f4f6eab1b9b" -dependencies = [ - "anyhow", - "cc", - "const_format", - "futures", - "futures-core", - "futures-util", - "hex", - "http", - "http-body", - "http-body-util", - "hyper", - "hyper-rustls", - "hyper-util", - "libc 0.2.177", - "nix", - "pin-project", - "regex", - "rustls", - "rustls-native-certs", - "serde", - "static_assertions", - "thiserror 1.0.69", - "tokio", - "tokio-rustls", - "tower-service", - "windows-sys 0.52.0", -] - -[[package]] -name = "libdd-common-ffi" -version = "0.0.1" -dependencies = [ - "anyhow", - "bolero", - "build_common", - "chrono", - "crossbeam-queue", - "hyper", - "libdd-common 1.0.0", - "serde", -] - -[[package]] -name = "libdd-crashtracker" -version = "1.0.0" -dependencies = [ - "anyhow", - "backtrace", - "blazesym", - "cc", - "chrono", - "criterion", - "goblin", - "http", - "libc 0.2.177", - "libdd-common 1.0.0", - "libdd-telemetry", - "nix", - "num-derive", - "num-traits", - "os_info", - "page_size", - "portable-atomic", - "rand 0.8.5", - "schemars", - "serde", - "serde_json", - "symbolic-common", - "symbolic-demangle", - "tempfile", - "thiserror 1.0.69", - "tokio", - "uuid", - "windows 0.59.0", -] - -[[package]] -name = "libdd-crashtracker-ffi" -version = "0.0.1" -dependencies = [ - "anyhow", - "build_common", - "function_name", - "libc 0.2.177", - "libdd-common 1.0.0", - "libdd-common-ffi", - "libdd-crashtracker", - "serde", - "serde_json", - "symbolic-common", - "symbolic-demangle", - "tempfile", - "windows 0.59.0", -] - -[[package]] -name = "libdd-data-pipeline" -version = "1.0.0" -dependencies = [ - "anyhow", - "arc-swap", - "bytes", - "clap", - "criterion", - "either", - "http", - "http-body-util", - "httpmock", - "hyper", - "hyper-util", - "libdd-common 1.0.0", - "libdd-ddsketch", - "libdd-dogstatsd-client", - "libdd-log", - "libdd-telemetry", - "libdd-tinybytes", - "libdd-trace-protobuf", - "libdd-trace-stats", - "libdd-trace-utils", - "rand 0.8.5", - "regex", - "rmp-serde", - "serde", - "serde_json", - "sha2", - "tempfile", - "tokio", - "tokio-util", - "tracing", - "uuid", -] - -[[package]] -name = "libdd-ddsketch" -version = "1.0.0" -dependencies = [ - "prost", - "prost-build", - "protoc-bin-vendored", -] - -[[package]] -name = "libdd-dogstatsd-client" -version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" dependencies = [ - "anyhow", - "cadence", - "http", - "libdd-common 1.0.0", + "autocfg", + "hashbrown 0.12.3", "serde", - "tokio", - "tracing", ] [[package]] -name = "libdd-library-config" -version = "1.0.0" +name = "indexmap" +version = "2.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c9c992b02b5b4c94ea26e32fe5bccb7aa7d9f390ab5c1221ff895bc7ea8b652" dependencies = [ - "anyhow", - "memfd", - "rand 0.8.5", - "rmp", - "rmp-serde", + "equivalent", + "hashbrown 0.15.2", "serde", - "serde_yaml", - "tempfile", ] [[package]] -name = "libdd-library-config-ffi" -version = "0.0.2" +name = "integer-encoding" +version = "3.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bb03732005da905c88227371639bf1ad885cc712789c011c31c5fb3ab3ccf02" + +[[package]] +name = "io-lifetimes" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" dependencies = [ - "anyhow", - "build_common", - "constcat", - "libdd-common 1.0.0", - "libdd-common-ffi", - "libdd-library-config", - "tempfile", + "hermit-abi 0.3.9", + "libc 0.2.173", + "windows-sys 0.48.0", ] [[package]] -name = "libdd-log" -version = "1.0.0" +name = "is-terminal" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "261f68e344040fbd0edea105bef17c66edf46f984ddb1115b775ce31be948f4b" dependencies = [ - "chrono", - "tempfile", - "tracing", - "tracing-appender", - "tracing-subscriber", + "hermit-abi 0.4.0", + "libc 0.2.173", + "windows-sys 0.52.0", ] [[package]] -name = "libdd-profiling" -version = "1.0.0" -source = "git+https://github.com/DataDog/libdatadog?tag=v24.0.2#d0393310c6e86ed7eb120c6cb6255f4f6eab1b9b" +name = "is_terminal_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" dependencies = [ - "anyhow", - "bitmaps", - "byteorder", - "bytes", - "chrono", - "futures", - "http", - "http-body-util", - "hyper", - "hyper-multipart-rfc7578", - "indexmap 2.12.0", - "libdd-alloc", - "libdd-common 1.0.0 (git+https://github.com/DataDog/libdatadog?tag=v24.0.2)", - "libdd-profiling-protobuf", - "lz4_flex", - "mime", - "prost", - "rustc-hash", - "serde", - "serde_json", - "target-triple", - "tokio", - "tokio-util", - "zstd", + "either", ] [[package]] -name = "libdd-profiling-protobuf" -version = "1.0.0" -source = "git+https://github.com/DataDog/libdatadog?tag=v24.0.2#d0393310c6e86ed7eb120c6cb6255f4f6eab1b9b" +name = "itertools" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" dependencies = [ - "prost", + "either", ] [[package]] -name = "libdd-telemetry" -version = "1.0.0" +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" dependencies = [ - "anyhow", - "base64 0.22.1", - "futures", - "hashbrown 0.15.2", - "http", - "http-body-util", - "hyper", - "hyper-util", - "libc 0.2.177", - "libdd-common 1.0.0", - "libdd-ddsketch", - "serde", - "serde_json", - "sys-info", - "tokio", - "tokio-util", - "tracing", - "tracing-subscriber", - "uuid", - "winver", + "either", ] [[package]] -name = "libdd-telemetry-ffi" -version = "0.0.1" +name = "itoa" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" + +[[package]] +name = "jobserver" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" dependencies = [ - "build_common", - "function_name", - "libc 0.2.177", - "libdd-common 1.0.0", - "libdd-common-ffi", - "libdd-telemetry", - "paste", - "tempfile", + "libc 0.2.173", ] [[package]] -name = "libdd-tinybytes" -version = "1.0.0" +name = "js-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" dependencies = [ - "libdd-tinybytes", "once_cell", - "pretty_assertions", - "proptest", - "rmp-serde", - "serde", - "serde_json", - "test-case", + "wasm-bindgen", ] [[package]] -name = "libdd-trace-normalization" -version = "1.0.0" +name = "kernel32-sys" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" dependencies = [ - "anyhow", - "criterion", - "duplicate", - "libdd-trace-protobuf", - "rand 0.8.5", + "winapi 0.2.8", + "winapi-build", ] [[package]] -name = "libdd-trace-protobuf" -version = "1.0.0" -dependencies = [ - "prost", - "prost-build", - "protoc-bin-vendored", - "serde", - "serde_bytes", - "serde_json", - "tokio", -] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] -name = "libdd-trace-stats" -version = "1.0.0" -dependencies = [ - "criterion", - "hashbrown 0.15.2", - "libdd-ddsketch", - "libdd-trace-protobuf", - "libdd-trace-utils", - "rand 0.8.5", -] +name = "lazycell" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] -name = "libdd-trace-utils" -version = "1.0.0" -dependencies = [ - "anyhow", - "bolero", - "bytes", - "cargo-platform", - "cargo_metadata", - "criterion", - "flate2", - "futures", - "http-body-util", - "httpmock", - "hyper", - "indexmap 2.12.0", - "libdd-common 1.0.0", - "libdd-tinybytes", - "libdd-trace-normalization", - "libdd-trace-protobuf", - "libdd-trace-utils", - "prost", - "rand 0.8.5", - "rmp", - "rmp-serde", - "rmpv", - "serde", - "serde_json", - "tempfile", - "tokio", - "tracing", - "urlencoding", - "zstd", -] +name = "libc" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e32a70cf75e5846d53a673923498228bbec6a8624708a9ea5645f075d6276122" + +[[package]] +name = "libc" +version = "0.2.173" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8cfeafaffdbc32176b64fb251369d52ea9f0a8fbc6f8759edffef7b525d64bb" [[package]] name = "libloading" @@ -2948,7 +2970,7 @@ version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fd3f7eed9d3848f8b98834af67102b720745c4ec028fcd0aa0239277e7de374f" dependencies = [ - "libc 0.2.177", + "libc 0.2.173", ] [[package]] @@ -2966,7 +2988,7 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c73f5c649995a115e1a0220b35e4df0a1294500477f97a91d0660fb5abeb574a" dependencies = [ - "libc 0.2.177", + "libc 0.2.173", "windows-sys 0.52.0", ] @@ -2977,7 +2999,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f26b2a7c5ccfb370edd57fda423f3a551516ee127e10bc22a6215e8c63b20a38" dependencies = [ "cc", - "libc 0.2.177", + "libc 0.2.173", "windows-sys 0.42.0", ] @@ -3019,7 +3041,7 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" dependencies = [ - "libc 0.2.177", + "libc 0.2.173", "wasi 0.11.0+wasi-snapshot-preview1", "windows-sys 0.52.0", ] @@ -3058,7 +3080,7 @@ dependencies = [ "bitflags 2.8.0", "cfg-if", "cfg_aliases", - "libc 0.2.177", + "libc 0.2.173", "memoffset", ] @@ -3145,7 +3167,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" dependencies = [ "hermit-abi 0.3.9", - "libc 0.2.177", + "libc 0.2.173", ] [[package]] @@ -3263,7 +3285,7 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "30d5b2194ed13191c1999ae0704b7839fb18384fa22e49b57eeaa97d79ce40da" dependencies = [ - "libc 0.2.177", + "libc 0.2.173", "winapi 0.3.9", ] @@ -3290,7 +3312,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if", - "libc 0.2.177", + "libc 0.2.173", "redox_syscall", "smallvec", "windows-targets 0.52.6", @@ -3324,7 +3346,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ba1fd955270ca6f8bd8624ec0c4ee1a251dd3cc0cc18e1e2665ca8f5acb1501" dependencies = [ "bitflags 1.3.2", - "libc 0.2.177", + "libc 0.2.173", "mmap", "nom 4.2.3", "x86", @@ -3337,7 +3359,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" dependencies = [ "fixedbitset", - "indexmap 2.12.0", + "indexmap 2.7.1", ] [[package]] @@ -3489,7 +3511,7 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "059a34f111a9dee2ce1ac2826a68b24601c4298cfeb1a587c3cb493d5ab46f52" dependencies = [ - "libc 0.2.177", + "libc 0.2.173", "nix", ] @@ -3527,7 +3549,7 @@ checksum = "714c75db297bc88a63783ffc6ab9f830698a6705aa0201416931759ef4c8183d" dependencies = [ "autocfg", "equivalent", - "indexmap 2.12.0", + "indexmap 2.7.1", ] [[package]] @@ -3719,7 +3741,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "552840b97013b1a26992c11eac34bdd778e464601a4c2054b5f0bff7c6761293" dependencies = [ "fuchsia-cprng", - "libc 0.2.177", + "libc 0.2.173", "rand_core 0.3.1", "rdrand", "winapi 0.3.9", @@ -3731,7 +3753,7 @@ version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ - "libc 0.2.177", + "libc 0.2.173", "rand_chacha 0.3.1", "rand_core 0.6.4", ] @@ -3957,7 +3979,7 @@ dependencies = [ "cc", "cfg-if", "getrandom 0.2.15", - "libc 0.2.177", + "libc 0.2.173", "untrusted", "windows-sys 0.52.0", ] @@ -3968,7 +3990,7 @@ version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8a29d87a652dc4d43c586328706bb5cdff211f3f39a530f240b53f7221dab8e" dependencies = [ - "libc 0.2.177", + "libc 0.2.173", ] [[package]] @@ -4032,7 +4054,7 @@ checksum = "a78891ee6bf2340288408954ac787aa063d8e8817e9f53abb37c695c6d834ef6" dependencies = [ "bitflags 2.8.0", "errno", - "libc 0.2.177", + "libc 0.2.173", "linux-raw-sys", "windows-sys 0.59.0", ] @@ -4182,7 +4204,7 @@ dependencies = [ "bitflags 2.8.0", "core-foundation", "core-foundation-sys", - "libc 0.2.177", + "libc 0.2.173", "security-framework-sys", ] @@ -4193,7 +4215,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" dependencies = [ "core-foundation-sys", - "libc 0.2.177", + "libc 0.2.173", ] [[package]] @@ -4211,17 +4233,16 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "604b71b8fc267e13bb3023a2c901126c8f349393666a6d98ac1ae5729b701798" dependencies = [ - "libc 0.2.177", + "libc 0.2.173", "tokio", ] [[package]] name = "serde" -version = "1.0.228" +version = "1.0.217" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70" dependencies = [ - "serde_core", "serde_derive", ] @@ -4234,20 +4255,11 @@ dependencies = [ "serde", ] -[[package]] -name = "serde_core" -version = "1.0.228" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" -dependencies = [ - "serde_derive", -] - [[package]] name = "serde_derive" -version = "1.0.228" +version = "1.0.217" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" dependencies = [ "proc-macro2", "quote", @@ -4306,7 +4318,7 @@ dependencies = [ "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.12.0", + "indexmap 2.7.1", "serde", "serde_derive", "serde_json", @@ -4332,7 +4344,7 @@ version = "0.9.34+deprecated" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" dependencies = [ - "indexmap 2.12.0", + "indexmap 2.7.1", "itoa", "ryu", "serde", @@ -4389,7 +4401,7 @@ version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" dependencies = [ - "libc 0.2.177", + "libc 0.2.173", ] [[package]] @@ -4452,7 +4464,7 @@ version = "0.5.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" dependencies = [ - "libc 0.2.177", + "libc 0.2.173", "windows-sys 0.52.0", ] @@ -4465,7 +4477,6 @@ dependencies = [ "fastrand", "io-lifetimes", "kernel32-sys", - "libc 0.2.177", "memfd", "nix", "rlimit", @@ -4574,7 +4585,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b3a0d0aba8bf96a0e1ddfdc352fc53b3df7f39318c71854910c3c4b024ae52c" dependencies = [ "cc", - "libc 0.2.177", + "libc 0.2.173", ] [[package]] @@ -4795,6 +4806,20 @@ dependencies = [ "time-core", ] +[[package]] +name = "tinybytes" +version = "0.0.1" +dependencies = [ + "once_cell", + "pretty_assertions", + "proptest", + "rmp-serde", + "serde", + "serde_json", + "test-case", + "tinybytes", +] + [[package]] name = "tinystr" version = "0.7.6" @@ -4823,7 +4848,7 @@ checksum = "3d61fa4ffa3de412bfea335c6ecff681de2b609ba3c77ef3e00e521813a9ed9e" dependencies = [ "backtrace", "bytes", - "libc 0.2.177", + "libc 0.2.173", "mio", "parking_lot", "pin-project-lite", @@ -4925,7 +4950,7 @@ version = "0.20.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "70f427fce4d84c72b5b732388bf4a9f4531b53f74e2887e3ecb2481f68f66d81" dependencies = [ - "indexmap 2.12.0", + "indexmap 2.7.1", "toml_datetime", "winnow 0.5.40", ] @@ -4936,7 +4961,7 @@ version = "0.22.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" dependencies = [ - "indexmap 2.12.0", + "indexmap 2.7.1", "serde", "serde_spanned", "toml_datetime", @@ -5031,18 +5056,6 @@ dependencies = [ "tracing-core", ] -[[package]] -name = "tracing-appender" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3566e8ce28cc0a3fe42519fc80e6b4c943cc4c8cef275620eb8dac2d3d4e06cf" -dependencies = [ - "crossbeam-channel", - "thiserror 1.0.69", - "time", - "tracing-subscriber", -] - [[package]] name = "tracing-attributes" version = "0.1.28" @@ -5056,9 +5069,9 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.35" +version = "0.1.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a04e24fab5c89c6a36eb8558c9656f30d81de51dfa4d3b45f26b21d61fa0a6c" +checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" dependencies = [ "once_cell", "valuable", @@ -5088,16 +5101,6 @@ dependencies = [ "tracing-subscriber", ] -[[package]] -name = "tracing-serde" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "704b1aeb7be0d0a84fc9828cae51dab5970fee5088f83d1dd7ee6f6246fc6ff1" -dependencies = [ - "serde", - "tracing-core", -] - [[package]] name = "tracing-subscriber" version = "0.3.19" @@ -5108,15 +5111,12 @@ dependencies = [ "nu-ansi-term", "once_cell", "regex", - "serde", - "serde_json", "sharded-slab", "smallvec", "thread_local", "tracing", "tracing-core", "tracing-log", - "tracing-serde", ] [[package]] @@ -5439,15 +5439,6 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" -[[package]] -name = "windows" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" -dependencies = [ - "windows-targets 0.48.5", -] - [[package]] name = "windows" version = "0.51.1" @@ -5832,15 +5823,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "winver" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e0e7162b9e282fd75a0a832cce93994bdb21208d848a418cd05a5fdd9b9ab33" -dependencies = [ - "windows 0.48.0", -] - [[package]] name = "wit-bindgen-rt" version = "0.39.0" diff --git a/components-rs/common.h b/components-rs/common.h index 1bd97177a9..393752b612 100644 --- a/components-rs/common.h +++ b/components-rs/common.h @@ -306,33 +306,6 @@ typedef enum ddog_Log { DDOG_LOG_HOOK_TRACE = (5 | (4 << 4)), } ddog_Log; -typedef enum ddog_EndpointMethod { - DDOG_ENDPOINT_METHOD_GET = 0, - DDOG_ENDPOINT_METHOD_POST = 1, - DDOG_ENDPOINT_METHOD_PUT = 2, - DDOG_ENDPOINT_METHOD_DELETE = 3, - DDOG_ENDPOINT_METHOD_PATCH = 4, - DDOG_ENDPOINT_METHOD_HEAD = 5, - DDOG_ENDPOINT_METHOD_OPTIONS = 6, - DDOG_ENDPOINT_METHOD_TRACE = 7, - DDOG_ENDPOINT_METHOD_CONNECT = 8, - DDOG_ENDPOINT_METHOD_OTHER = 9, -} ddog_EndpointMethod; - -typedef enum ddog_EndpointAuthentication { - DDOG_ENDPOINT_AUTHENTICATION_JWT = 0, - DDOG_ENDPOINT_AUTHENTICATION_BASIC = 1, - DDOG_ENDPOINT_AUTHENTICATION_OAUTH = 2, - DDOG_ENDPOINT_AUTHENTICATION_OIDC = 3, - DDOG_ENDPOINT_AUTHENTICATION_API_KEY = 4, - DDOG_ENDPOINT_AUTHENTICATION_SESSION = 5, - DDOG_ENDPOINT_AUTHENTICATION_MTLS = 6, - DDOG_ENDPOINT_AUTHENTICATION_SAML = 7, - DDOG_ENDPOINT_AUTHENTICATION_LDAP = 8, - DDOG_ENDPOINT_AUTHENTICATION_FORM = 9, - DDOG_ENDPOINT_AUTHENTICATION_OTHER = 10, -} ddog_EndpointAuthentication; - typedef enum ddog_MetricKind { DDOG_METRIC_KIND_COUNT, DDOG_METRIC_KIND_GAUGE, @@ -650,121 +623,8 @@ typedef struct ddog_Vec_DebuggerPayload { uintptr_t capacity; } ddog_Vec_DebuggerPayload; -/** - * `QueueId` is a struct that represents a unique identifier for a queue. - * It contains a single field, `inner`, which is a 64-bit unsigned integer. - */ -typedef uint64_t ddog_QueueId; - typedef struct ddog_HashMap_ShmCacheKey__ShmCache ddog_ShmCacheMap; -/** - * A 128-bit (16 byte) buffer containing the UUID. - * - * # ABI - * - * The `Bytes` type is always guaranteed to be have the same ABI as [`Uuid`]. - */ -typedef uint8_t ddog_Bytes[16]; - -/** - * A Universally Unique Identifier (UUID). - * - * # Examples - * - * Parse a UUID given in the simple format and print it as a urn: - * - * ``` - * # use uuid::Uuid; - * # fn main() -> Result<(), uuid::Error> { - * let my_uuid = Uuid::parse_str("a1a2a3a4b1b2c1c2d1d2d3d4d5d6d7d8")?; - * - * println!("{}", my_uuid.urn()); - * # Ok(()) - * # } - * ``` - * - * Create a new random (V4) UUID and print it out in hexadecimal form: - * - * ``` - * // Note that this requires the `v4` feature enabled in the uuid crate. - * # use uuid::Uuid; - * # fn main() { - * # #[cfg(feature = "v4")] { - * let my_uuid = Uuid::new_v4(); - * - * println!("{}", my_uuid); - * # } - * # } - * ``` - * - * # Formatting - * - * A UUID can be formatted in one of a few ways: - * - * * [`simple`](#method.simple): `a1a2a3a4b1b2c1c2d1d2d3d4d5d6d7d8`. - * * [`hyphenated`](#method.hyphenated): - * `a1a2a3a4-b1b2-c1c2-d1d2-d3d4d5d6d7d8`. - * * [`urn`](#method.urn): `urn:uuid:A1A2A3A4-B1B2-C1C2-D1D2-D3D4D5D6D7D8`. - * * [`braced`](#method.braced): `{a1a2a3a4-b1b2-c1c2-d1d2-d3d4d5d6d7d8}`. - * - * The default representation when formatting a UUID with `Display` is - * hyphenated: - * - * ``` - * # use uuid::Uuid; - * # fn main() -> Result<(), uuid::Error> { - * let my_uuid = Uuid::parse_str("a1a2a3a4b1b2c1c2d1d2d3d4d5d6d7d8")?; - * - * assert_eq!( - * "a1a2a3a4-b1b2-c1c2-d1d2-d3d4d5d6d7d8", - * my_uuid.to_string(), - * ); - * # Ok(()) - * # } - * ``` - * - * Other formats can be specified using adapter methods on the UUID: - * - * ``` - * # use uuid::Uuid; - * # fn main() -> Result<(), uuid::Error> { - * let my_uuid = Uuid::parse_str("a1a2a3a4b1b2c1c2d1d2d3d4d5d6d7d8")?; - * - * assert_eq!( - * "urn:uuid:a1a2a3a4-b1b2-c1c2-d1d2-d3d4d5d6d7d8", - * my_uuid.urn().to_string(), - * ); - * # Ok(()) - * # } - * ``` - * - * # Endianness - * - * The specification for UUIDs encodes the integer fields that make up the - * value in big-endian order. This crate assumes integer inputs are already in - * the correct order by default, regardless of the endianness of the - * environment. Most methods that accept integers have a `_le` variant (such as - * `from_fields_le`) that assumes any integer values will need to have their - * bytes flipped, regardless of the endianness of the environment. - * - * Most users won't need to worry about endianness unless they need to operate - * on individual fields (such as when converting between Microsoft GUIDs). The - * important things to remember are: - * - * - The endianness is in terms of the fields of the UUID, not the environment. - * - The endianness is assumed to be big-endian when there's no `_le` suffix - * somewhere. - * - Byte-flipping in `_le` methods applies to each integer. - * - Endianness roundtrips, so if you create a UUID with `from_fields_le` - * you'll get the same values back out with `to_fields_le`. - * - * # ABI - * - * The `Uuid` type is always guaranteed to be have the same ABI as [`Bytes`]. - */ -typedef ddog_Bytes ddog_Uuid; - /** * Holds the raw parts of a Rust Vec; it should only be created from Rust, * never from C. @@ -1006,13 +866,25 @@ typedef struct ddog_SpanEventBytes ddog_SpanEventBytes; typedef struct ddog_AttributeAnyValueBytes ddog_AttributeAnyValueBytes; typedef struct ddog_AttributeArrayValueBytes ddog_AttributeArrayValueBytes; - typedef enum ddog_DynamicInstrumentationConfigState { DDOG_DYNAMIC_INSTRUMENTATION_CONFIG_STATE_ENABLED, DDOG_DYNAMIC_INSTRUMENTATION_CONFIG_STATE_DISABLED, DDOG_DYNAMIC_INSTRUMENTATION_CONFIG_STATE_NOT_SET, } ddog_DynamicInstrumentationConfigState; +typedef enum ddog_Method { + DDOG_METHOD_GET = 0, + DDOG_METHOD_POST = 1, + DDOG_METHOD_PUT = 2, + DDOG_METHOD_DELETE = 3, + DDOG_METHOD_PATCH = 4, + DDOG_METHOD_HEAD = 5, + DDOG_METHOD_OPTIONS = 6, + DDOG_METHOD_TRACE = 7, + DDOG_METHOD_CONNECT = 8, + DDOG_METHOD_OTHER = 9, +} ddog_Method; + typedef struct ddog_AgentInfoReader ddog_AgentInfoReader; typedef struct ddog_AgentRemoteConfigReader ddog_AgentRemoteConfigReader; @@ -1047,6 +919,16 @@ typedef struct ddog_NativeFile { struct ddog_PlatformHandle_File *handle; } ddog_NativeFile; +/** + * Holds the raw parts of a Rust Vec; it should only be created from Rust, + * never from C. + */ +typedef struct ddog_Vec_CharSlice { + const ddog_CharSlice *ptr; + uintptr_t len; + uintptr_t capacity; +} ddog_Vec_CharSlice; + typedef struct ddog_TracerHeaderTags { ddog_CharSlice lang; ddog_CharSlice lang_version; @@ -1421,23 +1303,6 @@ typedef struct ddog_crasht_Handle_CrashInfoBuilder { struct ddog_crasht_CrashInfoBuilder *inner; } ddog_crasht_Handle_CrashInfoBuilder; -typedef enum ddog_crasht_CrashInfoBuilder_NewResult_Tag { - DDOG_CRASHT_CRASH_INFO_BUILDER_NEW_RESULT_OK, - DDOG_CRASHT_CRASH_INFO_BUILDER_NEW_RESULT_ERR, -} ddog_crasht_CrashInfoBuilder_NewResult_Tag; - -typedef struct ddog_crasht_CrashInfoBuilder_NewResult { - ddog_crasht_CrashInfoBuilder_NewResult_Tag tag; - union { - struct { - struct ddog_crasht_Handle_CrashInfoBuilder ok; - }; - struct { - struct ddog_Error err; - }; - }; -} ddog_crasht_CrashInfoBuilder_NewResult; - typedef enum ddog_crasht_CrashInfo_NewResult_Tag { DDOG_CRASHT_CRASH_INFO_NEW_RESULT_OK, DDOG_CRASHT_CRASH_INFO_NEW_RESULT_ERR, @@ -1527,23 +1392,6 @@ typedef struct ddog_crasht_StackFrame_NewResult { }; } ddog_crasht_StackFrame_NewResult; -typedef enum ddog_crasht_StackTrace_NewResult_Tag { - DDOG_CRASHT_STACK_TRACE_NEW_RESULT_OK, - DDOG_CRASHT_STACK_TRACE_NEW_RESULT_ERR, -} ddog_crasht_StackTrace_NewResult_Tag; - -typedef struct ddog_crasht_StackTrace_NewResult { - ddog_crasht_StackTrace_NewResult_Tag tag; - union { - struct { - struct ddog_crasht_Handle_StackTrace ok; - }; - struct { - struct ddog_Error err; - }; - }; -} ddog_crasht_StackTrace_NewResult; - typedef enum ddog_StringWrapperResult_Tag { DDOG_STRING_WRAPPER_RESULT_OK, DDOG_STRING_WRAPPER_RESULT_ERR, diff --git a/components-rs/crashtracker.h b/components-rs/crashtracker.h index 42209ff18c..6df6ab8df9 100644 --- a/components-rs/crashtracker.h +++ b/components-rs/crashtracker.h @@ -19,6 +19,40 @@ +typedef enum ddog_crasht_CrashInfoBuilder_NewResult_Tag { + DDOG_CRASHT_CRASH_INFO_BUILDER_NEW_RESULT_OK, + DDOG_CRASHT_CRASH_INFO_BUILDER_NEW_RESULT_ERR, +} ddog_crasht_CrashInfoBuilder_NewResult_Tag; + +typedef struct ddog_crasht_CrashInfoBuilder_NewResult { + ddog_crasht_CrashInfoBuilder_NewResult_Tag tag; + union { + struct { + struct ddog_crasht_Handle_CrashInfoBuilder ok; + }; + struct { + struct ddog_Error err; + }; + }; +} ddog_crasht_CrashInfoBuilder_NewResult; + +typedef enum ddog_crasht_StackTrace_NewResult_Tag { + DDOG_CRASHT_STACK_TRACE_NEW_RESULT_OK, + DDOG_CRASHT_STACK_TRACE_NEW_RESULT_ERR, +} ddog_crasht_StackTrace_NewResult_Tag; + +typedef struct ddog_crasht_StackTrace_NewResult { + ddog_crasht_StackTrace_NewResult_Tag tag; + union { + struct { + struct ddog_crasht_Handle_StackTrace ok; + }; + struct { + struct ddog_Error err; + }; + }; +} ddog_crasht_StackTrace_NewResult; + #ifdef __cplusplus extern "C" { #endif // __cplusplus diff --git a/components-rs/ddtrace.h b/components-rs/ddtrace.h index 844041ebd8..0c2f322a2a 100644 --- a/components-rs/ddtrace.h +++ b/components-rs/ddtrace.h @@ -11,6 +11,123 @@ struct _zend_string; #include "telemetry.h" #include "sidecar.h" +typedef struct ddog_Vec_CChar *(*ddog_DynamicConfigUpdate)(ddog_CharSlice config, + ddog_CharSlice value, + bool return_old); + +/** + * `QueueId` is a struct that represents a unique identifier for a queue. + * It contains a single field, `inner`, which is a 64-bit unsigned integer. + */ +typedef uint64_t ddog_QueueId; + +/** + * A 128-bit (16 byte) buffer containing the UUID. + * + * # ABI + * + * The `Bytes` type is always guaranteed to be have the same ABI as [`Uuid`]. + */ +typedef uint8_t ddog_Bytes[16]; + +/** + * A Universally Unique Identifier (UUID). + * + * # Examples + * + * Parse a UUID given in the simple format and print it as a urn: + * + * ``` + * # use uuid::Uuid; + * # fn main() -> Result<(), uuid::Error> { + * let my_uuid = Uuid::parse_str("a1a2a3a4b1b2c1c2d1d2d3d4d5d6d7d8")?; + * + * println!("{}", my_uuid.urn()); + * # Ok(()) + * # } + * ``` + * + * Create a new random (V4) UUID and print it out in hexadecimal form: + * + * ``` + * // Note that this requires the `v4` feature enabled in the uuid crate. + * # use uuid::Uuid; + * # fn main() { + * # #[cfg(feature = "v4")] { + * let my_uuid = Uuid::new_v4(); + * + * println!("{}", my_uuid); + * # } + * # } + * ``` + * + * # Formatting + * + * A UUID can be formatted in one of a few ways: + * + * * [`simple`](#method.simple): `a1a2a3a4b1b2c1c2d1d2d3d4d5d6d7d8`. + * * [`hyphenated`](#method.hyphenated): + * `a1a2a3a4-b1b2-c1c2-d1d2-d3d4d5d6d7d8`. + * * [`urn`](#method.urn): `urn:uuid:A1A2A3A4-B1B2-C1C2-D1D2-D3D4D5D6D7D8`. + * * [`braced`](#method.braced): `{a1a2a3a4-b1b2-c1c2-d1d2-d3d4d5d6d7d8}`. + * + * The default representation when formatting a UUID with `Display` is + * hyphenated: + * + * ``` + * # use uuid::Uuid; + * # fn main() -> Result<(), uuid::Error> { + * let my_uuid = Uuid::parse_str("a1a2a3a4b1b2c1c2d1d2d3d4d5d6d7d8")?; + * + * assert_eq!( + * "a1a2a3a4-b1b2-c1c2-d1d2-d3d4d5d6d7d8", + * my_uuid.to_string(), + * ); + * # Ok(()) + * # } + * ``` + * + * Other formats can be specified using adapter methods on the UUID: + * + * ``` + * # use uuid::Uuid; + * # fn main() -> Result<(), uuid::Error> { + * let my_uuid = Uuid::parse_str("a1a2a3a4b1b2c1c2d1d2d3d4d5d6d7d8")?; + * + * assert_eq!( + * "urn:uuid:a1a2a3a4-b1b2-c1c2-d1d2-d3d4d5d6d7d8", + * my_uuid.urn().to_string(), + * ); + * # Ok(()) + * # } + * ``` + * + * # Endianness + * + * The specification for UUIDs encodes the integer fields that make up the + * value in big-endian order. This crate assumes integer inputs are already in + * the correct order by default, regardless of the endianness of the + * environment. Most methods that accept integers have a `_le` variant (such as + * `from_fields_le`) that assumes any integer values will need to have their + * bytes flipped, regardless of the endianness of the environment. + * + * Most users won't need to worry about endianness unless they need to operate + * on individual fields (such as when converting between Microsoft GUIDs). The + * important things to remember are: + * + * - The endianness is in terms of the fields of the UUID, not the environment. + * - The endianness is assumed to be big-endian when there's no `_le` suffix + * somewhere. + * - Byte-flipping in `_le` methods applies to each integer. + * - Endianness roundtrips, so if you create a UUID with `from_fields_le` + * you'll get the same values back out with `to_fields_le`. + * + * # ABI + * + * The `Uuid` type is always guaranteed to be have the same ABI as [`Bytes`]. + */ +typedef ddog_Bytes ddog_Uuid; + extern ddog_Uuid ddtrace_runtime_id; extern void (*ddog_log_callback)(ddog_CharSlice); @@ -74,6 +191,8 @@ bool ddog_global_log_probe_limiter_inc(const struct ddog_RemoteConfigState *remo struct ddog_Vec_CChar *ddog_CharSlice_to_owned(ddog_CharSlice str); +void ddog_Vec_CChar_drop(struct ddog_Vec_CChar *ptr); + bool ddog_remote_configs_service_env_change(struct ddog_RemoteConfigState *remote_config, ddog_CharSlice service, ddog_CharSlice env, @@ -182,7 +301,7 @@ ddog_MaybeError ddog_sidecar_telemetry_filter_flush(struct ddog_SidecarTransport ddog_CharSlice service, ddog_CharSlice env); -bool ddog_sidecar_telemetry_are_endpoints_collected(const ddog_ShmCacheMap *cache, +bool ddog_sidecar_telemetry_are_endpoints_collected(ddog_ShmCacheMap *cache, ddog_CharSlice service, ddog_CharSlice env); diff --git a/components-rs/sidecar.h b/components-rs/sidecar.h index f9146df7c2..35c624dd50 100644 --- a/components-rs/sidecar.h +++ b/components-rs/sidecar.h @@ -10,6 +10,12 @@ #include #include "common.h" +/** + * `QueueId` is a struct that represents a unique identifier for a queue. + * It contains a single field, `inner`, which is a 64-bit unsigned integer. + */ +typedef uint64_t ddog_QueueId; + #if defined(_WIN32) bool ddog_setup_crashtracking(const struct ddog_Endpoint *endpoint, ddog_crasht_Metadata metadata); #endif @@ -120,6 +126,20 @@ ddog_MaybeError ddog_sidecar_telemetry_enqueueConfig(struct ddog_SidecarTranspor enum ddog_ConfigurationOrigin origin, ddog_CharSlice config_id); +/** + * Reports an endpoint to the telemetry. + */ +ddog_MaybeError ddog_sidecar_telemetry_addEndpoint(struct ddog_SidecarTransport **transport, + const struct ddog_InstanceId *instance_id, + const ddog_QueueId *queue_id, + ddog_CharSlice type, + enum ddog_Method method, + ddog_CharSlice path, + ddog_CharSlice operation_name, + ddog_CharSlice resource_name, + struct ddog_Vec_CharSlice request_body_type, + struct ddog_Vec_CharSlice response_body_type); + /** * Reports a dependency to the telemetry. */ @@ -129,26 +149,15 @@ ddog_MaybeError ddog_sidecar_telemetry_addDependency(struct ddog_SidecarTranspor ddog_CharSlice dependency_name, ddog_CharSlice dependency_version); -ddog_MaybeError ddog_sidecar_telemetry_addEndpoint(struct ddog_SidecarTransport **transport, - const struct ddog_InstanceId *instance_id, - const ddog_QueueId *queue_id, - ddog_CharSlice type, - enum ddog_EndpointMethod method, - ddog_CharSlice path, - ddog_CharSlice operation_name, - ddog_CharSlice resource_name); - /** * Reports an integration to the telemetry. */ - ddog_MaybeError ddog_sidecar_telemetry_addIntegration(struct ddog_SidecarTransport **transport, - const struct ddog_InstanceId *instance_id, - const ddog_QueueId *queue_id, - ddog_CharSlice type, - enum ddog_EndpointMethod method, - ddog_CharSlice path, - ddog_CharSlice operation_name, - ddog_CharSlice resource_name); +ddog_MaybeError ddog_sidecar_telemetry_addIntegration(struct ddog_SidecarTransport **transport, + const struct ddog_InstanceId *instance_id, + const ddog_QueueId *queue_id, + ddog_CharSlice integration_name, + ddog_CharSlice integration_version, + bool integration_enabled); /** * Enqueues a list of actions to be performed. From 396d1a670f724fbfc619f0da425463fb33368023 Mon Sep 17 00:00:00 2001 From: Alejandro Estringana Ruiz Date: Thu, 25 Sep 2025 12:47:48 +0200 Subject: [PATCH 10/53] Make string vectors work --- components-rs/common.h | 10 ---------- components-rs/sidecar.h | 4 ++-- ext/ddtrace.c | 6 ------ 3 files changed, 2 insertions(+), 18 deletions(-) diff --git a/components-rs/common.h b/components-rs/common.h index 393752b612..156e024a7b 100644 --- a/components-rs/common.h +++ b/components-rs/common.h @@ -919,16 +919,6 @@ typedef struct ddog_NativeFile { struct ddog_PlatformHandle_File *handle; } ddog_NativeFile; -/** - * Holds the raw parts of a Rust Vec; it should only be created from Rust, - * never from C. - */ -typedef struct ddog_Vec_CharSlice { - const ddog_CharSlice *ptr; - uintptr_t len; - uintptr_t capacity; -} ddog_Vec_CharSlice; - typedef struct ddog_TracerHeaderTags { ddog_CharSlice lang; ddog_CharSlice lang_version; diff --git a/components-rs/sidecar.h b/components-rs/sidecar.h index 35c624dd50..1d816729e6 100644 --- a/components-rs/sidecar.h +++ b/components-rs/sidecar.h @@ -137,8 +137,8 @@ ddog_MaybeError ddog_sidecar_telemetry_addEndpoint(struct ddog_SidecarTransport ddog_CharSlice path, ddog_CharSlice operation_name, ddog_CharSlice resource_name, - struct ddog_Vec_CharSlice request_body_type, - struct ddog_Vec_CharSlice response_body_type); + struct ddog_Vec_CChar *request_body_type, + struct ddog_Vec_CChar *response_body_type); /** * Reports a dependency to the telemetry. diff --git a/ext/ddtrace.c b/ext/ddtrace.c index f133952306..a492804350 100644 --- a/ext/ddtrace.c +++ b/ext/ddtrace.c @@ -2795,10 +2795,8 @@ PHP_FUNCTION(DDTrace_add_endpoint) { zend_string *response_body_type = NULL; zend_long response_code = 0; int32_t authentication = 0; - php_printf("Here Alex 0\n"); if (zend_parse_parameters(ZEND_NUM_ARGS(), "SSSSSSll", &type, &path, &operation_name, &resource_name, &request_body_type, &response_body_type, &response_code, &authentication) == FAILURE) { - php_printf("Here Alex 1\n"); RETURN_FALSE; } @@ -2816,16 +2814,12 @@ PHP_FUNCTION(DDTrace_add_endpoint) { if (!ddtrace_sidecar || !ddtrace_sidecar_instance_id || !DDTRACE_G(sidecar_queue_id)) { - php_printf("Here Alex 2\n"); RETURN_FALSE; } - php_printf("Here Alex \n"); ddog_sidecar_telemetry_addEndpoint( &ddtrace_sidecar, ddtrace_sidecar_instance_id, &DDTRACE_G(sidecar_queue_id), type_slice, method_enum, path_slice, operation_name_slice, resource_name_slice, request_body_type_vec, response_body_type_vec); - php_printf("Here Alex 3\n"); - RETURN_TRUE; } From 068b2a958c3272f223cca17545131d37d86b2aa6 Mon Sep 17 00:00:00 2001 From: Alejandro Estringana Ruiz Date: Fri, 26 Sep 2025 13:06:12 +0200 Subject: [PATCH 11/53] wip --- ext/ddtrace.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/ddtrace.c b/ext/ddtrace.c index a492804350..c23427cbf8 100644 --- a/ext/ddtrace.c +++ b/ext/ddtrace.c @@ -2794,7 +2794,7 @@ PHP_FUNCTION(DDTrace_add_endpoint) { zend_string *request_body_type = NULL; zend_string *response_body_type = NULL; zend_long response_code = 0; - int32_t authentication = 0; + zend_long authentication = 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "SSSSSSll", &type, &path, &operation_name, &resource_name, &request_body_type, &response_body_type, &response_code, &authentication) == FAILURE) { RETURN_FALSE; From 8f1ac344b48a7a40ec38268f129ec78723432f57 Mon Sep 17 00:00:00 2001 From: Alejandro Estringana Ruiz Date: Mon, 29 Sep 2025 10:22:10 +0200 Subject: [PATCH 12/53] Add i32 vector --- components-rs/common.h | 10 ++++++++++ components-rs/ddtrace.h | 2 ++ components-rs/remote_config.rs | 6 ++++++ components-rs/sidecar.h | 3 ++- ext/ddtrace.c | 6 +++--- 5 files changed, 23 insertions(+), 4 deletions(-) diff --git a/components-rs/common.h b/components-rs/common.h index 156e024a7b..94b46534a5 100644 --- a/components-rs/common.h +++ b/components-rs/common.h @@ -446,6 +446,16 @@ typedef struct ddog_Vec_CChar { uintptr_t capacity; } ddog_Vec_CChar; +/** + * Holds the raw parts of a Rust Vec; it should only be created from Rust, + * never from C. + */ +typedef struct ddog_Vec_I32 { + const int32_t *ptr; + uintptr_t len; + uintptr_t capacity; +} ddog_Vec_I32; + typedef struct ddog_Tag { ddog_CharSlice name; const struct ddog_DslString *value; diff --git a/components-rs/ddtrace.h b/components-rs/ddtrace.h index 0c2f322a2a..356442f720 100644 --- a/components-rs/ddtrace.h +++ b/components-rs/ddtrace.h @@ -191,6 +191,8 @@ bool ddog_global_log_probe_limiter_inc(const struct ddog_RemoteConfigState *remo struct ddog_Vec_CChar *ddog_CharSlice_to_owned(ddog_CharSlice str); +struct ddog_Vec_I32 *ddog_number_to_owned_i32(int32_t number); + void ddog_Vec_CChar_drop(struct ddog_Vec_CChar *ptr); bool ddog_remote_configs_service_env_change(struct ddog_RemoteConfigState *remote_config, diff --git a/components-rs/remote_config.rs b/components-rs/remote_config.rs index 0332fb7650..1b4de312fd 100644 --- a/components-rs/remote_config.rs +++ b/components-rs/remote_config.rs @@ -488,6 +488,12 @@ pub unsafe extern "C" fn ddog_CharSlice_to_owned(str: CharSlice) -> *mut ddcommo Box::into_raw(Box::new(std_vec.into())) } +#[no_mangle] +pub unsafe extern "C" fn ddog_number_to_owned_i32(number: i32) -> *mut ddcommon_ffi::Vec { + let std_vec: Vec = vec![number]; + Box::into_raw(Box::new(std_vec.into())) +} + #[no_mangle] pub unsafe extern "C" fn ddog_Vec_CChar_drop(ptr: *mut ddcommon_ffi::Vec) { Box::from_raw(ptr); diff --git a/components-rs/sidecar.h b/components-rs/sidecar.h index 1d816729e6..036cf1db10 100644 --- a/components-rs/sidecar.h +++ b/components-rs/sidecar.h @@ -138,7 +138,8 @@ ddog_MaybeError ddog_sidecar_telemetry_addEndpoint(struct ddog_SidecarTransport ddog_CharSlice operation_name, ddog_CharSlice resource_name, struct ddog_Vec_CChar *request_body_type, - struct ddog_Vec_CChar *response_body_type); + struct ddog_Vec_CChar *response_body_type, + struct ddog_Vec_I32 *response_code); /** * Reports a dependency to the telemetry. diff --git a/ext/ddtrace.c b/ext/ddtrace.c index c23427cbf8..83e902d0ab 100644 --- a/ext/ddtrace.c +++ b/ext/ddtrace.c @@ -2809,8 +2809,8 @@ PHP_FUNCTION(DDTrace_add_endpoint) { zend_string *response_body_type_copy = zend_string_copy(response_body_type); struct ddog_Vec_CChar *request_body_type_vec = ddog_CharSlice_to_owned(dd_zend_string_to_CharSlice(request_body_type_copy)); struct ddog_Vec_CChar *response_body_type_vec = ddog_CharSlice_to_owned(dd_zend_string_to_CharSlice(response_body_type_copy)); - // struct ddog_Vec_i32 *response_code_vec = ddog_number_to_owned_i32(response_code); - // // struct ddog_Vec_EndpointAuthentication authentication_vec = *ddog_number_to_owned_i32(authentication); + struct ddog_Vec_I32 *response_code_vec = ddog_number_to_owned_i32(response_code); + // struct ddog_Vec_EndpointAuthentication authentication_vec = ddog_number_to_owned_i32(authentication); if (!ddtrace_sidecar || !ddtrace_sidecar_instance_id || !DDTRACE_G(sidecar_queue_id)) { @@ -2818,7 +2818,7 @@ PHP_FUNCTION(DDTrace_add_endpoint) { } ddog_sidecar_telemetry_addEndpoint( - &ddtrace_sidecar, ddtrace_sidecar_instance_id, &DDTRACE_G(sidecar_queue_id), type_slice, method_enum, path_slice, operation_name_slice, resource_name_slice, request_body_type_vec, response_body_type_vec); + &ddtrace_sidecar, ddtrace_sidecar_instance_id, &DDTRACE_G(sidecar_queue_id), type_slice, method_enum, path_slice, operation_name_slice, resource_name_slice, request_body_type_vec, response_body_type_vec, response_code_vec); RETURN_TRUE; } From 2ad2b85b3ee52c34fa8d927d7fc9d35b7ec919e5 Mon Sep 17 00:00:00 2001 From: Alejandro Estringana Ruiz Date: Mon, 29 Sep 2025 10:43:28 +0200 Subject: [PATCH 13/53] Add authentication vector --- components-rs/common.h | 24 ++++++++++++++++++++++++ components-rs/ddtrace.h | 2 ++ components-rs/remote_config.rs | 6 ++++++ components-rs/sidecar.h | 3 ++- ext/ddtrace.c | 11 ++++++----- 5 files changed, 40 insertions(+), 6 deletions(-) diff --git a/components-rs/common.h b/components-rs/common.h index 94b46534a5..bc243c98fd 100644 --- a/components-rs/common.h +++ b/components-rs/common.h @@ -882,6 +882,20 @@ typedef enum ddog_DynamicInstrumentationConfigState { DDOG_DYNAMIC_INSTRUMENTATION_CONFIG_STATE_NOT_SET, } ddog_DynamicInstrumentationConfigState; +typedef enum ddog_Authentication { + DDOG_AUTHENTICATION_JWT = 0, + DDOG_AUTHENTICATION_BASIC = 1, + DDOG_AUTHENTICATION_OAUTH = 2, + DDOG_AUTHENTICATION_OIDC = 3, + DDOG_AUTHENTICATION_API_KEY = 4, + DDOG_AUTHENTICATION_SESSION = 5, + DDOG_AUTHENTICATION_MTLS = 6, + DDOG_AUTHENTICATION_SAML = 7, + DDOG_AUTHENTICATION_LDAP = 8, + DDOG_AUTHENTICATION_FORM = 9, + DDOG_AUTHENTICATION_OTHER = 10, +} ddog_Authentication; + typedef enum ddog_Method { DDOG_METHOD_GET = 0, DDOG_METHOD_POST = 1, @@ -929,6 +943,16 @@ typedef struct ddog_NativeFile { struct ddog_PlatformHandle_File *handle; } ddog_NativeFile; +/** + * Holds the raw parts of a Rust Vec; it should only be created from Rust, + * never from C. + */ +typedef struct ddog_Vec_Authentication { + const enum ddog_Authentication *ptr; + uintptr_t len; + uintptr_t capacity; +} ddog_Vec_Authentication; + typedef struct ddog_TracerHeaderTags { ddog_CharSlice lang; ddog_CharSlice lang_version; diff --git a/components-rs/ddtrace.h b/components-rs/ddtrace.h index 356442f720..6312d64f4a 100644 --- a/components-rs/ddtrace.h +++ b/components-rs/ddtrace.h @@ -193,6 +193,8 @@ struct ddog_Vec_CChar *ddog_CharSlice_to_owned(ddog_CharSlice str); struct ddog_Vec_I32 *ddog_number_to_owned_i32(int32_t number); +struct ddog_Vec_Authentication *ddog_number_to_owned_Authentication(ddog_Authentication auth); + void ddog_Vec_CChar_drop(struct ddog_Vec_CChar *ptr); bool ddog_remote_configs_service_env_change(struct ddog_RemoteConfigState *remote_config, diff --git a/components-rs/remote_config.rs b/components-rs/remote_config.rs index 1b4de312fd..12731beb19 100644 --- a/components-rs/remote_config.rs +++ b/components-rs/remote_config.rs @@ -494,6 +494,12 @@ pub unsafe extern "C" fn ddog_number_to_owned_i32(number: i32) -> *mut ddcommon_ Box::into_raw(Box::new(std_vec.into())) } +#[no_mangle] +pub unsafe extern "C" fn ddog_number_to_owned_Authentication(auth: ddtelemetry::data::Authentication) -> *mut ddcommon_ffi::Vec { + let std_vec: Vec = vec![auth]; + Box::into_raw(Box::new(std_vec.into())) +} + #[no_mangle] pub unsafe extern "C" fn ddog_Vec_CChar_drop(ptr: *mut ddcommon_ffi::Vec) { Box::from_raw(ptr); diff --git a/components-rs/sidecar.h b/components-rs/sidecar.h index 036cf1db10..42f4ff5ad0 100644 --- a/components-rs/sidecar.h +++ b/components-rs/sidecar.h @@ -139,7 +139,8 @@ ddog_MaybeError ddog_sidecar_telemetry_addEndpoint(struct ddog_SidecarTransport ddog_CharSlice resource_name, struct ddog_Vec_CChar *request_body_type, struct ddog_Vec_CChar *response_body_type, - struct ddog_Vec_I32 *response_code); + struct ddog_Vec_I32 *response_code, + struct ddog_Vec_Authentication *authentication); /** * Reports a dependency to the telemetry. diff --git a/ext/ddtrace.c b/ext/ddtrace.c index 83e902d0ab..429bab8d43 100644 --- a/ext/ddtrace.c +++ b/ext/ddtrace.c @@ -2796,7 +2796,8 @@ PHP_FUNCTION(DDTrace_add_endpoint) { zend_long response_code = 0; zend_long authentication = 0; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "SSSSSSll", &type, &path, &operation_name, &resource_name, &request_body_type, &response_body_type, &response_code, &authentication) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "SSSSSSll", &type, &path, &operation_name, &resource_name, &request_body_type, &response_body_type, + &response_code, &authentication) == FAILURE) { RETURN_FALSE; } @@ -2810,15 +2811,15 @@ PHP_FUNCTION(DDTrace_add_endpoint) { struct ddog_Vec_CChar *request_body_type_vec = ddog_CharSlice_to_owned(dd_zend_string_to_CharSlice(request_body_type_copy)); struct ddog_Vec_CChar *response_body_type_vec = ddog_CharSlice_to_owned(dd_zend_string_to_CharSlice(response_body_type_copy)); struct ddog_Vec_I32 *response_code_vec = ddog_number_to_owned_i32(response_code); - // struct ddog_Vec_EndpointAuthentication authentication_vec = ddog_number_to_owned_i32(authentication); - + struct ddog_Vec_Authentication *authentication_vec = ddog_number_to_owned_Authentication(authentication); if (!ddtrace_sidecar || !ddtrace_sidecar_instance_id || !DDTRACE_G(sidecar_queue_id)) { RETURN_FALSE; } - ddog_sidecar_telemetry_addEndpoint( - &ddtrace_sidecar, ddtrace_sidecar_instance_id, &DDTRACE_G(sidecar_queue_id), type_slice, method_enum, path_slice, operation_name_slice, resource_name_slice, request_body_type_vec, response_body_type_vec, response_code_vec); + ddog_sidecar_telemetry_addEndpoint(&ddtrace_sidecar, ddtrace_sidecar_instance_id, &DDTRACE_G(sidecar_queue_id), type_slice, method_enum, + path_slice, operation_name_slice, resource_name_slice, request_body_type_vec, response_body_type_vec, + response_code_vec, authentication_vec); RETURN_TRUE; } From cf304ef74b6741589499ecbe1b229f24364115c1 Mon Sep 17 00:00:00 2001 From: Alejandro Estringana Ruiz Date: Mon, 29 Sep 2025 12:14:44 +0200 Subject: [PATCH 14/53] Add serde json --- Cargo.lock | 1 + appsec/tests/extension/add_endpoints.phpt | 2 +- components-rs/sidecar.h | 3 ++- components-rs/telemetry.rs | 2 -- ext/ddtrace.c | 8 +++++--- ext/ddtrace.stub.php | 2 +- ext/ddtrace_arginfo.h | 5 +++-- src/DDTrace/Integrations/Laravel/LaravelIntegration.php | 9 +-------- 8 files changed, 14 insertions(+), 18 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 2969057723..ec85baa3cd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1515,6 +1515,7 @@ dependencies = [ "libc 0.2.173", "paste", "rmp-serde", + "serde_json", "tempfile", "tinybytes", "tracing", diff --git a/appsec/tests/extension/add_endpoints.phpt b/appsec/tests/extension/add_endpoints.phpt index bda4df0b4b..5edb1e484c 100644 --- a/appsec/tests/extension/add_endpoints.phpt +++ b/appsec/tests/extension/add_endpoints.phpt @@ -7,7 +7,7 @@ datadog.appsec.enabled=1 DD_INSTRUMENTATION_TELEMETRY_ENABLED=1 --FILE-- Date: Mon, 29 Sep 2025 14:48:28 +0200 Subject: [PATCH 15/53] Remove debugging lines --- components-rs/telemetry.rs | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/components-rs/telemetry.rs b/components-rs/telemetry.rs index 8e2c09b84a..1db42eb86d 100644 --- a/components-rs/telemetry.rs +++ b/components-rs/telemetry.rs @@ -371,9 +371,5 @@ pub unsafe extern "C" fn ddog_sidecar_telemetry_are_endpoints_collected( env: CharSlice, ) -> bool { let cache_entry = ddog_sidecar_telemetry_cache_get_or_update(cache, service, env); - let result = cache_entry.last_endpoints_push.elapsed().map_or(false, |d| d < Duration::from_secs(1800)); // 30 minutes - if let Ok(mut file) = OpenOptions::new().create(true).append(true).open("/tmp/rust.log") { - let _ = writeln!(file, "are_endpoints_collected?: {} - {} - {}", result, cache_entry.last_endpoints_push.elapsed().unwrap().as_secs(), SystemTime::UNIX_EPOCH.elapsed().unwrap().as_secs()); - } - result + cache_entry.last_endpoints_push.elapsed().map_or(false, |d| d < Duration::from_secs(60)); // 1 minute } From 115ee0d6cedb2fd715b2aba950ecb16120d16cd1 Mon Sep 17 00:00:00 2001 From: Alejandro Estringana Ruiz Date: Mon, 29 Sep 2025 16:04:45 +0200 Subject: [PATCH 16/53] Replace char_c for slices --- Cargo.lock | 1 + components-rs/common.h | 64 ++++++++++++++++++++-------------- components-rs/ddtrace.h | 6 ++-- components-rs/remote_config.rs | 6 ++-- components-rs/sidecar.h | 4 +-- components-rs/telemetry.rs | 3 +- 6 files changed, 48 insertions(+), 36 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ec85baa3cd..851a2637e0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1692,6 +1692,7 @@ dependencies = [ "base64 0.22.1", "datadog-ddsketch", "ddcommon 0.0.1", + "ddcommon-ffi 0.0.1", "futures", "hashbrown 0.15.2", "http", diff --git a/components-rs/common.h b/components-rs/common.h index bc243c98fd..23cca1cb23 100644 --- a/components-rs/common.h +++ b/components-rs/common.h @@ -264,6 +264,20 @@ typedef struct _zend_string _zend_string; #define ddog_MultiTargetFetcher_DEFAULT_CLIENTS_LIMIT 100 +typedef enum ddog_Authentication { + DDOG_AUTHENTICATION_JWT = 0, + DDOG_AUTHENTICATION_BASIC = 1, + DDOG_AUTHENTICATION_OAUTH = 2, + DDOG_AUTHENTICATION_OIDC = 3, + DDOG_AUTHENTICATION_API_KEY = 4, + DDOG_AUTHENTICATION_SESSION = 5, + DDOG_AUTHENTICATION_MTLS = 6, + DDOG_AUTHENTICATION_SAML = 7, + DDOG_AUTHENTICATION_LDAP = 8, + DDOG_AUTHENTICATION_FORM = 9, + DDOG_AUTHENTICATION_OTHER = 10, +} ddog_Authentication; + typedef enum ddog_ConfigurationOrigin { DDOG_CONFIGURATION_ORIGIN_ENV_VAR, DDOG_CONFIGURATION_ORIGIN_CODE, @@ -440,11 +454,11 @@ typedef struct ddog_SidecarTransport ddog_SidecarTransport; * Holds the raw parts of a Rust Vec; it should only be created from Rust, * never from C. */ -typedef struct ddog_Vec_CChar { - const char *ptr; +typedef struct ddog_Vec_CharSlice { + const ddog_CharSlice *ptr; uintptr_t len; uintptr_t capacity; -} ddog_Vec_CChar; +} ddog_Vec_CharSlice; /** * Holds the raw parts of a Rust Vec; it should only be created from Rust, @@ -456,6 +470,16 @@ typedef struct ddog_Vec_I32 { uintptr_t capacity; } ddog_Vec_I32; +/** + * Holds the raw parts of a Rust Vec; it should only be created from Rust, + * never from C. + */ +typedef struct ddog_Vec_Authentication { + const enum ddog_Authentication *ptr; + uintptr_t len; + uintptr_t capacity; +} ddog_Vec_Authentication; + typedef struct ddog_Tag { ddog_CharSlice name; const struct ddog_DslString *value; @@ -467,6 +491,16 @@ typedef struct _zend_string *(*ddog_DynamicConfigUpdate)(ddog_CharSlice config, ddog_OwnedZendString value, enum ddog_DynamicConfigUpdateMode mode); +/** + * Holds the raw parts of a Rust Vec; it should only be created from Rust, + * never from C. + */ +typedef struct ddog_Vec_CChar { + const char *ptr; + uintptr_t len; + uintptr_t capacity; +} ddog_Vec_CChar; + typedef enum ddog_IntermediateValue_Tag { DDOG_INTERMEDIATE_VALUE_STRING, DDOG_INTERMEDIATE_VALUE_NUMBER, @@ -882,20 +916,6 @@ typedef enum ddog_DynamicInstrumentationConfigState { DDOG_DYNAMIC_INSTRUMENTATION_CONFIG_STATE_NOT_SET, } ddog_DynamicInstrumentationConfigState; -typedef enum ddog_Authentication { - DDOG_AUTHENTICATION_JWT = 0, - DDOG_AUTHENTICATION_BASIC = 1, - DDOG_AUTHENTICATION_OAUTH = 2, - DDOG_AUTHENTICATION_OIDC = 3, - DDOG_AUTHENTICATION_API_KEY = 4, - DDOG_AUTHENTICATION_SESSION = 5, - DDOG_AUTHENTICATION_MTLS = 6, - DDOG_AUTHENTICATION_SAML = 7, - DDOG_AUTHENTICATION_LDAP = 8, - DDOG_AUTHENTICATION_FORM = 9, - DDOG_AUTHENTICATION_OTHER = 10, -} ddog_Authentication; - typedef enum ddog_Method { DDOG_METHOD_GET = 0, DDOG_METHOD_POST = 1, @@ -943,16 +963,6 @@ typedef struct ddog_NativeFile { struct ddog_PlatformHandle_File *handle; } ddog_NativeFile; -/** - * Holds the raw parts of a Rust Vec; it should only be created from Rust, - * never from C. - */ -typedef struct ddog_Vec_Authentication { - const enum ddog_Authentication *ptr; - uintptr_t len; - uintptr_t capacity; -} ddog_Vec_Authentication; - typedef struct ddog_TracerHeaderTags { ddog_CharSlice lang; ddog_CharSlice lang_version; diff --git a/components-rs/ddtrace.h b/components-rs/ddtrace.h index 6312d64f4a..d2669378cf 100644 --- a/components-rs/ddtrace.h +++ b/components-rs/ddtrace.h @@ -189,13 +189,13 @@ bool ddog_type_can_be_instrumented(const struct ddog_RemoteConfigState *remote_c bool ddog_global_log_probe_limiter_inc(const struct ddog_RemoteConfigState *remote_config); -struct ddog_Vec_CChar *ddog_CharSlice_to_owned(ddog_CharSlice str); +struct ddog_Vec_CharSlice *ddog_CharSlice_to_owned(ddog_CharSlice str); struct ddog_Vec_I32 *ddog_number_to_owned_i32(int32_t number); -struct ddog_Vec_Authentication *ddog_number_to_owned_Authentication(ddog_Authentication auth); +struct ddog_Vec_Authentication *ddog_number_to_owned_Authentication(enum ddog_Authentication auth); -void ddog_Vec_CChar_drop(struct ddog_Vec_CChar *ptr); +void ddog_Vec_CChar_drop(struct ddog_Vec_CharSlice *ptr); bool ddog_remote_configs_service_env_change(struct ddog_RemoteConfigState *remote_config, ddog_CharSlice service, diff --git a/components-rs/remote_config.rs b/components-rs/remote_config.rs index 12731beb19..e1759a8157 100644 --- a/components-rs/remote_config.rs +++ b/components-rs/remote_config.rs @@ -483,8 +483,8 @@ pub extern "C" fn ddog_global_log_probe_limiter_inc(remote_config: &RemoteConfig } #[no_mangle] -pub unsafe extern "C" fn ddog_CharSlice_to_owned(str: CharSlice) -> *mut ddcommon_ffi::Vec { - let std_vec: Vec = str.as_slice().into(); +pub unsafe extern "C" fn ddog_CharSlice_to_owned(str: CharSlice) -> *mut ddcommon_ffi::Vec { + let std_vec: Vec = vec![str]; Box::into_raw(Box::new(std_vec.into())) } @@ -501,7 +501,7 @@ pub unsafe extern "C" fn ddog_number_to_owned_Authentication(auth: ddtelemetry:: } #[no_mangle] -pub unsafe extern "C" fn ddog_Vec_CChar_drop(ptr: *mut ddcommon_ffi::Vec) { +pub unsafe extern "C" fn ddog_Vec_CChar_drop(ptr: *mut ddcommon_ffi::Vec) { Box::from_raw(ptr); } diff --git a/components-rs/sidecar.h b/components-rs/sidecar.h index 8683f08691..fbcab3c99d 100644 --- a/components-rs/sidecar.h +++ b/components-rs/sidecar.h @@ -137,8 +137,8 @@ ddog_MaybeError ddog_sidecar_telemetry_addEndpoint(struct ddog_SidecarTransport ddog_CharSlice path, ddog_CharSlice operation_name, ddog_CharSlice resource_name, - struct ddog_Vec_CChar *request_body_type, - struct ddog_Vec_CChar *response_body_type, + struct ddog_Vec_CharSlice *request_body_type, + struct ddog_Vec_CharSlice *response_body_type, struct ddog_Vec_I32 *response_code, struct ddog_Vec_Authentication *authentication, ddog_CharSlice metadata); diff --git a/components-rs/telemetry.rs b/components-rs/telemetry.rs index 1db42eb86d..3ec61e180b 100644 --- a/components-rs/telemetry.rs +++ b/components-rs/telemetry.rs @@ -371,5 +371,6 @@ pub unsafe extern "C" fn ddog_sidecar_telemetry_are_endpoints_collected( env: CharSlice, ) -> bool { let cache_entry = ddog_sidecar_telemetry_cache_get_or_update(cache, service, env); - cache_entry.last_endpoints_push.elapsed().map_or(false, |d| d < Duration::from_secs(60)); // 1 minute + let result = cache_entry.last_endpoints_push.elapsed().map_or(false, |d| d < Duration::from_secs(60)); // 1 minute + result } From c81be783e96ed9cdbe3d1700c5743801342c9175 Mon Sep 17 00:00:00 2001 From: Alejandro Estringana Ruiz Date: Mon, 29 Sep 2025 17:14:58 +0200 Subject: [PATCH 17/53] Amend PR comments --- components-rs/sidecar.h | 2 +- ext/ddtrace.c | 9 +++------ 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/components-rs/sidecar.h b/components-rs/sidecar.h index fbcab3c99d..7cbdadc0f5 100644 --- a/components-rs/sidecar.h +++ b/components-rs/sidecar.h @@ -139,7 +139,7 @@ ddog_MaybeError ddog_sidecar_telemetry_addEndpoint(struct ddog_SidecarTransport ddog_CharSlice resource_name, struct ddog_Vec_CharSlice *request_body_type, struct ddog_Vec_CharSlice *response_body_type, - struct ddog_Vec_I32 *response_code, + int32_t response_code, struct ddog_Vec_Authentication *authentication, ddog_CharSlice metadata); diff --git a/ext/ddtrace.c b/ext/ddtrace.c index 759eb0589d..7aed00360d 100644 --- a/ext/ddtrace.c +++ b/ext/ddtrace.c @@ -2807,11 +2807,8 @@ PHP_FUNCTION(DDTrace_add_endpoint) { ddog_CharSlice path_slice = dd_zend_string_to_CharSlice(path); ddog_CharSlice operation_name_slice = dd_zend_string_to_CharSlice(operation_name); ddog_CharSlice resource_name_slice = dd_zend_string_to_CharSlice(resource_name); - zend_string *request_body_type_copy = zend_string_copy(request_body_type); - zend_string *response_body_type_copy = zend_string_copy(response_body_type); - struct ddog_Vec_CChar *request_body_type_vec = ddog_CharSlice_to_owned(dd_zend_string_to_CharSlice(request_body_type_copy)); - struct ddog_Vec_CChar *response_body_type_vec = ddog_CharSlice_to_owned(dd_zend_string_to_CharSlice(response_body_type_copy)); - struct ddog_Vec_I32 *response_code_vec = ddog_number_to_owned_i32(response_code); + struct ddog_Vec_CharSlice *request_body_type_vec = ddog_CharSlice_to_owned(dd_zend_string_to_CharSlice(request_body_type)); + struct ddog_Vec_CharSlice *response_body_type_vec = ddog_CharSlice_to_owned(dd_zend_string_to_CharSlice(response_body_type)); struct ddog_Vec_Authentication *authentication_vec = ddog_number_to_owned_Authentication(authentication); ddog_CharSlice metadata_slice = dd_zend_string_to_CharSlice(metadata); @@ -2821,7 +2818,7 @@ PHP_FUNCTION(DDTrace_add_endpoint) { ddog_sidecar_telemetry_addEndpoint(&ddtrace_sidecar, ddtrace_sidecar_instance_id, &DDTRACE_G(sidecar_queue_id), type_slice, method_enum, path_slice, operation_name_slice, resource_name_slice, request_body_type_vec, response_body_type_vec, - response_code_vec, authentication_vec, metadata_slice); + response_code, authentication_vec, metadata_slice); RETURN_TRUE; } From 6998cb1388bb13711c929c8ba2d89499cc2b7350 Mon Sep 17 00:00:00 2001 From: Alejandro Estringana Ruiz Date: Tue, 30 Sep 2025 13:27:21 +0200 Subject: [PATCH 18/53] Strip invalid utf8 chars --- ext/ddtrace.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/ext/ddtrace.c b/ext/ddtrace.c index 7aed00360d..f45eff345d 100644 --- a/ext/ddtrace.c +++ b/ext/ddtrace.c @@ -2810,7 +2810,15 @@ PHP_FUNCTION(DDTrace_add_endpoint) { struct ddog_Vec_CharSlice *request_body_type_vec = ddog_CharSlice_to_owned(dd_zend_string_to_CharSlice(request_body_type)); struct ddog_Vec_CharSlice *response_body_type_vec = ddog_CharSlice_to_owned(dd_zend_string_to_CharSlice(response_body_type)); struct ddog_Vec_Authentication *authentication_vec = ddog_number_to_owned_Authentication(authentication); - ddog_CharSlice metadata_slice = dd_zend_string_to_CharSlice(metadata); + + size_t len = ZSTR_LEN(metadata); + zend_string *metadata_utf8 = NULL; + ddog_CharSlice metadata_slice = {0}; + char *stripped_utf8 = ddtrace_strip_invalid_utf8(ZSTR_VAL(metadata), &len); + if (stripped_utf8 != NULL && len > 0) { + metadata_utf8 = zend_string_init(stripped_utf8, len, 0); + metadata_slice = dd_zend_string_to_CharSlice(metadata_utf8); + } if (!ddtrace_sidecar || !ddtrace_sidecar_instance_id || !DDTRACE_G(sidecar_queue_id)) { RETURN_FALSE; From 1ffaffdfc94c097eade06198ccca088664435748 Mon Sep 17 00:00:00 2001 From: Alejandro Estringana Ruiz Date: Mon, 6 Oct 2025 10:22:13 +0200 Subject: [PATCH 19/53] Send Laravel endpoints --- ext/ddtrace.c | 87 +++++++++++++++---- ext/ddtrace.stub.php | 15 +++- ext/ddtrace_arginfo.h | 17 ++-- ext/sidecar.h | 3 + .../Laravel/LaravelIntegration.php | 14 ++- 5 files changed, 106 insertions(+), 30 deletions(-) diff --git a/ext/ddtrace.c b/ext/ddtrace.c index f45eff345d..6189a66b69 100644 --- a/ext/ddtrace.c +++ b/ext/ddtrace.c @@ -2785,49 +2785,106 @@ zend_string *get_env() { return get_DD_ENV(); } +ddog_Method dd_string_to_method(zend_string *method) { + if (zend_string_equals_literal(method, "GET")) { + return DDOG_METHOD_GET; + } + if (zend_string_equals_literal(method, "POST")) { + return DDOG_METHOD_POST; + } + if (zend_string_equals_literal(method, "PUT")) { + return DDOG_METHOD_PUT; + } + if (zend_string_equals_literal(method, "DELETE")) { + return DDOG_METHOD_DELETE; + } + if (zend_string_equals_literal(method, "PATCH")) { + return DDOG_METHOD_PATCH; + } + if (zend_string_equals_literal(method, "HEAD")) { + return DDOG_METHOD_HEAD; + } + if (zend_string_equals_literal(method, "OPTIONS")) { + return DDOG_METHOD_OPTIONS; + } + if (zend_string_equals_literal(method, "TRACE")) { + return DDOG_METHOD_TRACE; + } + if (zend_string_equals_literal(method, "CONNECT")) { + return DDOG_METHOD_CONNECT; + } + return DDOG_METHOD_OTHER; +} + PHP_FUNCTION(DDTrace_add_endpoint) { UNUSED(execute_data); - zend_string *type = NULL; zend_string *path = NULL; zend_string *operation_name = NULL; zend_string *resource_name = NULL; + zend_string *method = NULL; + zend_string *type = NULL; zend_string *request_body_type = NULL; zend_string *response_body_type = NULL; zend_long response_code = 0; zend_long authentication = 0; - zend_string *metadata = NULL; + zend_string *metadata_input = NULL; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "SSSSSSllS", &type, &path, &operation_name, &resource_name, &request_body_type, &response_body_type, - &response_code, &authentication, &metadata) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "SSSS|SSllS", &path, &operation_name, &resource_name, &method, &type, &request_body_type, &response_body_type, + &response_code, &authentication, &metadata_input) == FAILURE) { RETURN_FALSE; } + zend_string *default_metadata = NULL; + zend_string *metadata = metadata_input; + if (metadata == NULL) { + default_metadata = zend_string_init(ZEND_STRL("{}"), 0); + metadata = default_metadata; + } + ddog_CharSlice type_slice = dd_zend_string_to_CharSlice(type); - ddog_Method method_enum = DDOG_METHOD_GET; + ddog_Method method_enum = dd_string_to_method(method); ddog_CharSlice path_slice = dd_zend_string_to_CharSlice(path); ddog_CharSlice operation_name_slice = dd_zend_string_to_CharSlice(operation_name); ddog_CharSlice resource_name_slice = dd_zend_string_to_CharSlice(resource_name); - struct ddog_Vec_CharSlice *request_body_type_vec = ddog_CharSlice_to_owned(dd_zend_string_to_CharSlice(request_body_type)); - struct ddog_Vec_CharSlice *response_body_type_vec = ddog_CharSlice_to_owned(dd_zend_string_to_CharSlice(response_body_type)); - struct ddog_Vec_Authentication *authentication_vec = ddog_number_to_owned_Authentication(authentication); + struct ddog_Vec_CharSlice *request_body_type_vec = NULL; + if (request_body_type) { + request_body_type_vec = ddog_CharSlice_to_owned(dd_zend_string_to_CharSlice(request_body_type)); + } + struct ddog_Vec_CharSlice *response_body_type_vec = NULL; + if (response_body_type) { + response_body_type_vec = ddog_CharSlice_to_owned(dd_zend_string_to_CharSlice(response_body_type)); + } + struct ddog_Vec_Authentication *authentication_vec = NULL; + if (authentication) { + authentication_vec = ddog_number_to_owned_Authentication(authentication); + } - size_t len = ZSTR_LEN(metadata); - zend_string *metadata_utf8 = NULL; ddog_CharSlice metadata_slice = {0}; - char *stripped_utf8 = ddtrace_strip_invalid_utf8(ZSTR_VAL(metadata), &len); - if (stripped_utf8 != NULL && len > 0) { - metadata_utf8 = zend_string_init(stripped_utf8, len, 0); - metadata_slice = dd_zend_string_to_CharSlice(metadata_utf8); + if (metadata && ZSTR_LEN(metadata) > 0) { + size_t len = ZSTR_LEN(metadata); + char *stripped_utf8 = ddtrace_strip_invalid_utf8(ZSTR_VAL(metadata), &len); + if (stripped_utf8 != NULL && len > 0) { + zend_string *metadata_utf8 = zend_string_init(stripped_utf8, len, 0); + metadata_slice = dd_zend_string_to_CharSlice(metadata_utf8); + ddtrace_drop_rust_string(stripped_utf8, len); + // metadata_utf8 will be released by Zend after function returns or at cleanup + } else { + metadata_slice = dd_zend_string_to_CharSlice(metadata); + } } if (!ddtrace_sidecar || !ddtrace_sidecar_instance_id || !DDTRACE_G(sidecar_queue_id)) { RETURN_FALSE; } - ddog_sidecar_telemetry_addEndpoint(&ddtrace_sidecar, ddtrace_sidecar_instance_id, &DDTRACE_G(sidecar_queue_id), type_slice, method_enum, + ddog_sidecar_telemetry_addEndpoint_buffer(&ddtrace_sidecar, ddtrace_sidecar_instance_id, &DDTRACE_G(sidecar_queue_id), type_slice, method_enum, path_slice, operation_name_slice, resource_name_slice, request_body_type_vec, response_body_type_vec, response_code, authentication_vec, metadata_slice); + if (!metadata_input) { + zend_string_release(default_metadata); + } + RETURN_TRUE; } diff --git a/ext/ddtrace.stub.php b/ext/ddtrace.stub.php index 71c9941431..e65255bbdd 100644 --- a/ext/ddtrace.stub.php +++ b/ext/ddtrace.stub.php @@ -833,9 +833,18 @@ function are_endpoints_collected(): bool {} /** * Add an endpoint * - * @param string $endpoint The endpoint to add - */ - function add_endpoint(string $type, string $path, string $operation_name, string $resource_name, string $body_type, string $response_type, int $response_code, int $authentication, string $metadata): bool {} + * @param string $path The path of the endpoint + * @param string $operation_name The operation name of the endpoint + * @param string $resource_name The resource name of the endpoint + * @param string $method The method of the endpoint + * @param string $type The type of the endpoint + * @param string $body_type The body type of the endpoint + * @param string $response_type The response type of the endpoint + * @param int $response_code The response code of the endpoint + * @param int $authentication The authentication of the endpoint + * @param string $metadata The metadata of the endpoint + */ + function add_endpoint(string $path, string $operation_name, string $resource_name, string $method, ?string $type = NULL, ?string $body_type = NULL, ?string $response_type = NULL, ?int $response_code = NULL, ?int $authentication = NULL, ?string $metadata = NULL): bool {} } namespace DDTrace\System { diff --git a/ext/ddtrace_arginfo.h b/ext/ddtrace_arginfo.h index 2fa722da3d..d361056690 100644 --- a/ext/ddtrace_arginfo.h +++ b/ext/ddtrace_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: 53e83c8bd04860fc3bc95d5a66b2af4cd63b5a3d */ + * Stub hash: 67e1cc5d41d7a0bd13f946b9c4ecd169f5414f78 */ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_DDTrace_trace_method, 0, 3, _IS_BOOL, 0) ZEND_ARG_TYPE_INFO(0, className, IS_STRING, 0) @@ -168,16 +168,17 @@ ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_DDTrace_are_endpoints_collected, 0, 0, _IS_BOOL, 0) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_DDTrace_add_endpoint, 0, 9, _IS_BOOL, 0) - ZEND_ARG_TYPE_INFO(0, type, IS_STRING, 0) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_DDTrace_add_endpoint, 0, 4, _IS_BOOL, 0) ZEND_ARG_TYPE_INFO(0, path, IS_STRING, 0) ZEND_ARG_TYPE_INFO(0, operation_name, IS_STRING, 0) ZEND_ARG_TYPE_INFO(0, resource_name, IS_STRING, 0) - ZEND_ARG_TYPE_INFO(0, body_type, IS_STRING, 0) - ZEND_ARG_TYPE_INFO(0, response_type, IS_STRING, 0) - ZEND_ARG_TYPE_INFO(0, response_code, IS_LONG, 0) - ZEND_ARG_TYPE_INFO(0, authentication, IS_LONG, 0) - ZEND_ARG_TYPE_INFO(0, metadata, IS_STRING, 0) + ZEND_ARG_TYPE_INFO(0, method, IS_STRING, 0) + ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, type, IS_STRING, 1, "NULL") + ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, body_type, IS_STRING, 1, "NULL") + ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, response_type, IS_STRING, 1, "NULL") + ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, response_code, IS_LONG, 1, "NULL") + ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, authentication, IS_LONG, 1, "NULL") + ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, metadata, IS_STRING, 1, "\'{}\'") ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_DDTrace_System_container_id, 0, 0, IS_STRING, 1) diff --git a/ext/sidecar.h b/ext/sidecar.h index b3593ceaf1..f5a8ed163a 100644 --- a/ext/sidecar.h +++ b/ext/sidecar.h @@ -50,6 +50,9 @@ void ddtrace_sidecar_dogstatsd_set(zend_string *metric, zend_long value, zval *t bool ddtrace_alter_test_session_token(zval *old_value, zval *new_value, zend_string *new_str); static inline ddog_CharSlice dd_zend_string_to_CharSlice(zend_string *str) { + if (str == NULL) { + return (ddog_CharSlice){ .len = 0, .ptr = NULL }; + } return (ddog_CharSlice){ .len = str->len, .ptr = str->val }; } diff --git a/src/DDTrace/Integrations/Laravel/LaravelIntegration.php b/src/DDTrace/Integrations/Laravel/LaravelIntegration.php index 2a442784a3..a5b95b4426 100644 --- a/src/DDTrace/Integrations/Laravel/LaravelIntegration.php +++ b/src/DDTrace/Integrations/Laravel/LaravelIntegration.php @@ -142,6 +142,16 @@ static function ($This, $scope, $args, $route) { } $rootSpan->meta[Tag::HTTP_METHOD] = $request->method(); $rootSpan->meta[Tag::SPAN_KIND] = 'server'; + + if (!\DDTrace\are_endpoints_collected()) { + $routeCollection = $This->getRoutes(); + foreach ($routeCollection as $value) { + $path = $value->uri; + $method = $value->methods[0] ?? ''; + $resourceName = $method . ' ' . $path; + \DDTrace\add_endpoint($path, 'http.request', $resourceName, $method); + } + } } ); @@ -577,10 +587,6 @@ static function (HookData $hook) { } ); - if (!\DDTrace\are_endpoints_collected()) { - \DDTrace\add_endpoint("type", "/api/v1/traces", "operation_name", "resource_name", "body_type", "response_type", 1, 2, '{"some":"json"}'); - } - return Integration::LOADED; } From 0943210621d3aa971400f870ddc08f9b2a4b32f6 Mon Sep 17 00:00:00 2001 From: Alejandro Estringana Ruiz Date: Mon, 6 Oct 2025 10:24:28 +0200 Subject: [PATCH 20/53] Point to latest --- ext/ddtrace.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/ddtrace.c b/ext/ddtrace.c index 6189a66b69..96c4d146b4 100644 --- a/ext/ddtrace.c +++ b/ext/ddtrace.c @@ -2877,7 +2877,7 @@ PHP_FUNCTION(DDTrace_add_endpoint) { RETURN_FALSE; } - ddog_sidecar_telemetry_addEndpoint_buffer(&ddtrace_sidecar, ddtrace_sidecar_instance_id, &DDTRACE_G(sidecar_queue_id), type_slice, method_enum, + ddog_sidecar_telemetry_addEndpoint(&ddtrace_sidecar, ddtrace_sidecar_instance_id, &DDTRACE_G(sidecar_queue_id), type_slice, method_enum, path_slice, operation_name_slice, resource_name_slice, request_body_type_vec, response_body_type_vec, response_code, authentication_vec, metadata_slice); From f89220df2fbc94497755b5ba2795229f5c5ecaf8 Mon Sep 17 00:00:00 2001 From: Alejandro Estringana Ruiz Date: Wed, 15 Oct 2025 11:55:10 +0200 Subject: [PATCH 21/53] Fix add-routes-collection (#3446) Co-authored-by: Gustavo Lopes --- appsec/tests/integration/build.gradle | 7 ++-- ext/ddtrace.c | 50 ++++++++++++++------------- 2 files changed, 30 insertions(+), 27 deletions(-) diff --git a/appsec/tests/integration/build.gradle b/appsec/tests/integration/build.gradle index 0547b8e6a8..b07b93bb72 100644 --- a/appsec/tests/integration/build.gradle +++ b/appsec/tests/integration/build.gradle @@ -312,6 +312,7 @@ def buildTracerTask = { String version, String variant -> } def buildAppSecTask = { String version, String variant -> + def buildType = variant.contains('debug') ? 'Debug' : 'RelWithDebInfo' buildRunInDockerTask( baseName: 'buildAppsec', baseTag: 'php', @@ -334,17 +335,17 @@ def buildAppSecTask = { String version, String variant -> ], command: [ '-e', '-c', - ''' + """ git config --global --add safe.directory '*' cd /appsec test -f CMakeCache.txt || \\ - cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo \\ + cmake -DCMAKE_BUILD_TYPE=$buildType \\ -DCMAKE_INSTALL_PREFIX=/appsec \\ -DDD_APPSEC_ENABLE_PATCHELF_LIBC=ON \\ -DDD_APPSEC_TESTING=ON /project/appsec make -j extension ddappsec-helper && \\ touch ddappsec.so libddappsec-helper.so - ''' + """ ] ) } diff --git a/ext/ddtrace.c b/ext/ddtrace.c index 96c4d146b4..3d672a58b6 100644 --- a/ext/ddtrace.c +++ b/ext/ddtrace.c @@ -2834,11 +2834,8 @@ PHP_FUNCTION(DDTrace_add_endpoint) { RETURN_FALSE; } - zend_string *default_metadata = NULL; - zend_string *metadata = metadata_input; - if (metadata == NULL) { - default_metadata = zend_string_init(ZEND_STRL("{}"), 0); - metadata = default_metadata; + if (!ddtrace_sidecar || !ddtrace_sidecar_instance_id || !DDTRACE_G(sidecar_queue_id)) { + RETURN_FALSE; } ddog_CharSlice type_slice = dd_zend_string_to_CharSlice(type); @@ -2860,32 +2857,37 @@ PHP_FUNCTION(DDTrace_add_endpoint) { } ddog_CharSlice metadata_slice = {0}; - if (metadata && ZSTR_LEN(metadata) > 0) { - size_t len = ZSTR_LEN(metadata); - char *stripped_utf8 = ddtrace_strip_invalid_utf8(ZSTR_VAL(metadata), &len); - if (stripped_utf8 != NULL && len > 0) { - zend_string *metadata_utf8 = zend_string_init(stripped_utf8, len, 0); - metadata_slice = dd_zend_string_to_CharSlice(metadata_utf8); - ddtrace_drop_rust_string(stripped_utf8, len); - // metadata_utf8 will be released by Zend after function returns or at cleanup + char *stripped_utf8 = NULL; + size_t stripped_utf8_len = 0; + if (metadata_input && ZSTR_LEN(metadata_input) > 0) { + stripped_utf8_len = ZSTR_LEN(metadata_input); + stripped_utf8 = ddtrace_strip_invalid_utf8(ZSTR_VAL(metadata_input), &stripped_utf8_len); + if (stripped_utf8 != NULL) { + metadata_slice = (ddog_CharSlice){.ptr = stripped_utf8, .len = stripped_utf8_len}; } else { - metadata_slice = dd_zend_string_to_CharSlice(metadata); + // nothing invalid + metadata_slice = dd_zend_string_to_CharSlice(metadata_input); } + } else { + metadata_slice = (ddog_CharSlice){ZEND_STRL("{}")}; } - if (!ddtrace_sidecar || !ddtrace_sidecar_instance_id || !DDTRACE_G(sidecar_queue_id)) { - RETURN_FALSE; - } - - ddog_sidecar_telemetry_addEndpoint(&ddtrace_sidecar, ddtrace_sidecar_instance_id, &DDTRACE_G(sidecar_queue_id), type_slice, method_enum, - path_slice, operation_name_slice, resource_name_slice, request_body_type_vec, response_body_type_vec, - response_code, authentication_vec, metadata_slice); + ddog_MaybeError result = ddog_sidecar_telemetry_addEndpoint( + &ddtrace_sidecar, ddtrace_sidecar_instance_id, &DDTRACE_G(sidecar_queue_id), type_slice, method_enum, path_slice, operation_name_slice, + resource_name_slice, request_body_type_vec, response_body_type_vec, response_code, authentication_vec, metadata_slice); - if (!metadata_input) { - zend_string_release(default_metadata); + if (stripped_utf8) { + ddtrace_drop_rust_string(stripped_utf8, stripped_utf8_len); } - RETURN_TRUE; + if (result.tag == DDOG_OPTION_ERROR_SOME_ERROR) { + ddog_CharSlice message = ddog_Error_message(&result.some); + LOG_LINE(ERROR, "Error submitting endpoint to sidecar: %.*s", (int)message.len, (char *)message.ptr); + ZVAL_FALSE(return_value); + } else { + ZVAL_TRUE(return_value); + } + ddog_MaybeError_drop(result); } PHP_FUNCTION(dd_trace_send_traces_via_thread) { From e9e6ed09e87606c6bd4bf4ce863c6740d805bf18 Mon Sep 17 00:00:00 2001 From: Alejandro Estringana Ruiz Date: Thu, 16 Oct 2025 17:20:50 +0200 Subject: [PATCH 22/53] Point to latest libdatadog --- ext/ddtrace.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/ddtrace.c b/ext/ddtrace.c index 3d672a58b6..842a221a71 100644 --- a/ext/ddtrace.c +++ b/ext/ddtrace.c @@ -2825,7 +2825,7 @@ PHP_FUNCTION(DDTrace_add_endpoint) { zend_string *type = NULL; zend_string *request_body_type = NULL; zend_string *response_body_type = NULL; - zend_long response_code = 0; + zend_long response_code = -1; zend_long authentication = 0; zend_string *metadata_input = NULL; From b2f641e970968b0e05743dfbe017790fc4aba2c0 Mon Sep 17 00:00:00 2001 From: Alejandro Estringana Ruiz Date: Fri, 17 Oct 2025 12:13:21 +0200 Subject: [PATCH 23/53] Remove response_code --- appsec/tests/extension/add_endpoints.phpt | 2 +- components-rs/sidecar.h | 1 - ext/ddtrace.c | 7 +++---- ext/ddtrace.stub.php | 3 +-- ext/ddtrace_arginfo.h | 5 ++--- 5 files changed, 7 insertions(+), 11 deletions(-) diff --git a/appsec/tests/extension/add_endpoints.phpt b/appsec/tests/extension/add_endpoints.phpt index 5edb1e484c..b683f9e9a0 100644 --- a/appsec/tests/extension/add_endpoints.phpt +++ b/appsec/tests/extension/add_endpoints.phpt @@ -7,7 +7,7 @@ datadog.appsec.enabled=1 DD_INSTRUMENTATION_TELEMETRY_ENABLED=1 --FILE-- Date: Fri, 17 Oct 2025 13:09:49 +0200 Subject: [PATCH 24/53] Remove non used fields --- appsec/tests/extension/add_endpoints.phpt | 2 +- components-rs/common.h | 24 ------------ components-rs/ddtrace.h | 2 - components-rs/remote_config.rs | 6 --- components-rs/sidecar.h | 7 +--- ext/ddtrace.c | 47 ++--------------------- ext/ddtrace.stub.php | 7 +--- ext/ddtrace_arginfo.h | 7 +--- 8 files changed, 8 insertions(+), 94 deletions(-) diff --git a/appsec/tests/extension/add_endpoints.phpt b/appsec/tests/extension/add_endpoints.phpt index b683f9e9a0..dd9e754310 100644 --- a/appsec/tests/extension/add_endpoints.phpt +++ b/appsec/tests/extension/add_endpoints.phpt @@ -7,7 +7,7 @@ datadog.appsec.enabled=1 DD_INSTRUMENTATION_TELEMETRY_ENABLED=1 --FILE-- *mut ddcommon_ Box::into_raw(Box::new(std_vec.into())) } -#[no_mangle] -pub unsafe extern "C" fn ddog_number_to_owned_Authentication(auth: ddtelemetry::data::Authentication) -> *mut ddcommon_ffi::Vec { - let std_vec: Vec = vec![auth]; - Box::into_raw(Box::new(std_vec.into())) -} - #[no_mangle] pub unsafe extern "C" fn ddog_Vec_CChar_drop(ptr: *mut ddcommon_ffi::Vec) { Box::from_raw(ptr); diff --git a/components-rs/sidecar.h b/components-rs/sidecar.h index 1f59681354..991cfb2538 100644 --- a/components-rs/sidecar.h +++ b/components-rs/sidecar.h @@ -132,15 +132,10 @@ ddog_MaybeError ddog_sidecar_telemetry_enqueueConfig(struct ddog_SidecarTranspor ddog_MaybeError ddog_sidecar_telemetry_addEndpoint(struct ddog_SidecarTransport **transport, const struct ddog_InstanceId *instance_id, const ddog_QueueId *queue_id, - ddog_CharSlice type, enum ddog_Method method, ddog_CharSlice path, ddog_CharSlice operation_name, - ddog_CharSlice resource_name, - struct ddog_Vec_CharSlice *request_body_type, - struct ddog_Vec_CharSlice *response_body_type, - struct ddog_Vec_Authentication *authentication, - ddog_CharSlice metadata); + ddog_CharSlice resource_name); /** * Reports a dependency to the telemetry. diff --git a/ext/ddtrace.c b/ext/ddtrace.c index 17c71e6de0..0e7573f97f 100644 --- a/ext/ddtrace.c +++ b/ext/ddtrace.c @@ -2822,14 +2822,8 @@ PHP_FUNCTION(DDTrace_add_endpoint) { zend_string *operation_name = NULL; zend_string *resource_name = NULL; zend_string *method = NULL; - zend_string *type = NULL; - zend_string *request_body_type = NULL; - zend_string *response_body_type = NULL; - zend_long authentication = 0; - zend_string *metadata_input = NULL; - - if (zend_parse_parameters(ZEND_NUM_ARGS(), "SSSS|SSSlS", &path, &operation_name, &resource_name, &method, &type, &request_body_type, &response_body_type, - &authentication, &metadata_input) == FAILURE) { + + if (zend_parse_parameters(ZEND_NUM_ARGS(), "SSSS", &path, &operation_name, &resource_name, &method) == FAILURE) { RETURN_FALSE; } @@ -2837,47 +2831,14 @@ PHP_FUNCTION(DDTrace_add_endpoint) { RETURN_FALSE; } - ddog_CharSlice type_slice = dd_zend_string_to_CharSlice(type); ddog_Method method_enum = dd_string_to_method(method); ddog_CharSlice path_slice = dd_zend_string_to_CharSlice(path); ddog_CharSlice operation_name_slice = dd_zend_string_to_CharSlice(operation_name); ddog_CharSlice resource_name_slice = dd_zend_string_to_CharSlice(resource_name); - struct ddog_Vec_CharSlice *request_body_type_vec = NULL; - if (request_body_type) { - request_body_type_vec = ddog_CharSlice_to_owned(dd_zend_string_to_CharSlice(request_body_type)); - } - struct ddog_Vec_CharSlice *response_body_type_vec = NULL; - if (response_body_type) { - response_body_type_vec = ddog_CharSlice_to_owned(dd_zend_string_to_CharSlice(response_body_type)); - } - struct ddog_Vec_Authentication *authentication_vec = NULL; - if (authentication) { - authentication_vec = ddog_number_to_owned_Authentication(authentication); - } - - ddog_CharSlice metadata_slice = {0}; - char *stripped_utf8 = NULL; - size_t stripped_utf8_len = 0; - if (metadata_input && ZSTR_LEN(metadata_input) > 0) { - stripped_utf8_len = ZSTR_LEN(metadata_input); - stripped_utf8 = ddtrace_strip_invalid_utf8(ZSTR_VAL(metadata_input), &stripped_utf8_len); - if (stripped_utf8 != NULL) { - metadata_slice = (ddog_CharSlice){.ptr = stripped_utf8, .len = stripped_utf8_len}; - } else { - // nothing invalid - metadata_slice = dd_zend_string_to_CharSlice(metadata_input); - } - } else { - metadata_slice = (ddog_CharSlice){ZEND_STRL("{}")}; - } ddog_MaybeError result = ddog_sidecar_telemetry_addEndpoint( - &ddtrace_sidecar, ddtrace_sidecar_instance_id, &DDTRACE_G(sidecar_queue_id), type_slice, method_enum, path_slice, operation_name_slice, - resource_name_slice, request_body_type_vec, response_body_type_vec, authentication_vec, metadata_slice); - - if (stripped_utf8) { - ddtrace_drop_rust_string(stripped_utf8, stripped_utf8_len); - } + &ddtrace_sidecar, ddtrace_sidecar_instance_id, &DDTRACE_G(sidecar_queue_id), method_enum, path_slice, operation_name_slice, + resource_name_slice); if (result.tag == DDOG_OPTION_ERROR_SOME_ERROR) { ddog_CharSlice message = ddog_Error_message(&result.some); diff --git a/ext/ddtrace.stub.php b/ext/ddtrace.stub.php index d9e3dd0bdc..135b8511eb 100644 --- a/ext/ddtrace.stub.php +++ b/ext/ddtrace.stub.php @@ -837,13 +837,8 @@ function are_endpoints_collected(): bool {} * @param string $operation_name The operation name of the endpoint * @param string $resource_name The resource name of the endpoint * @param string $method The method of the endpoint - * @param string $type The type of the endpoint - * @param string $body_type The body type of the endpoint - * @param string $response_type The response type of the endpoint - * @param int $authentication The authentication of the endpoint - * @param string $metadata The metadata of the endpoint */ - function add_endpoint(string $path, string $operation_name, string $resource_name, string $method, ?string $type = NULL, ?string $body_type = NULL, ?string $response_type = NULL, ?int $authentication = NULL, ?string $metadata = NULL): bool {} + function add_endpoint(string $path, string $operation_name, string $resource_name, string $method): bool {} } namespace DDTrace\System { diff --git a/ext/ddtrace_arginfo.h b/ext/ddtrace_arginfo.h index cff865e46f..5d377ef881 100644 --- a/ext/ddtrace_arginfo.h +++ b/ext/ddtrace_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: 2171d4533fc0c86c617ba09955e9a51f7b8751d4 */ + * Stub hash: 139f8e60f945750fd3f81c339dc5318c0b155fbd */ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_DDTrace_trace_method, 0, 3, _IS_BOOL, 0) ZEND_ARG_TYPE_INFO(0, className, IS_STRING, 0) @@ -173,11 +173,6 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_DDTrace_add_endpoint, 0, 4, _IS_ ZEND_ARG_TYPE_INFO(0, operation_name, IS_STRING, 0) ZEND_ARG_TYPE_INFO(0, resource_name, IS_STRING, 0) ZEND_ARG_TYPE_INFO(0, method, IS_STRING, 0) - ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, type, IS_STRING, 1, "NULL") - ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, body_type, IS_STRING, 1, "NULL") - ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, response_type, IS_STRING, 1, "NULL") - ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, authentication, IS_LONG, 1, "NULL") - ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, metadata, IS_STRING, 1, "NULL") ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_DDTrace_System_container_id, 0, 0, IS_STRING, 1) From 12933133d5b7c2dd4b9d021b144d703229b153cc Mon Sep 17 00:00:00 2001 From: Alejandro Estringana Ruiz Date: Fri, 17 Oct 2025 15:10:35 +0200 Subject: [PATCH 25/53] Point to latest --- libdatadog | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libdatadog b/libdatadog index 629bce0954..436bbdf55e 160000 --- a/libdatadog +++ b/libdatadog @@ -1 +1 @@ -Subproject commit 629bce09547abc77d7bbda623921f97eb5611949 +Subproject commit 436bbdf55e8f3de2b657eacde57252dede508d32 From 2b745c76602468e88de6d398d4caf127106c7823 Mon Sep 17 00:00:00 2001 From: Alejandro Estringana Ruiz Date: Fri, 17 Oct 2025 15:17:10 +0200 Subject: [PATCH 26/53] Generate cbindgen --- Cargo.lock | 174 +++++++++++++++++++++++---------- components-rs/common.h | 161 ++++++++++++++++++++++++++++-- components-rs/crashtracker.h | 34 ------- components-rs/ddtrace.h | 121 ----------------------- components-rs/remote_config.rs | 11 --- components-rs/sidecar.h | 6 -- 6 files changed, 274 insertions(+), 233 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 851a2637e0..666f097ac1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -57,7 +57,7 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" dependencies = [ - "libc 0.2.173", + "libc 0.2.177", ] [[package]] @@ -317,7 +317,7 @@ checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" dependencies = [ "addr2line", "cfg-if", - "libc 0.2.173", + "libc 0.2.177", "miniz_oxide", "object 0.36.7", "rustc-demangle", @@ -400,7 +400,7 @@ checksum = "95824d1dd4f20b4a4dfa63b72954e81914a718357231468180b30314e85057fa" dependencies = [ "cpp_demangle", "gimli 0.32.0", - "libc 0.2.173", + "libc 0.2.177", "memmap2", "miniz_oxide", "rustc-demangle", @@ -641,7 +641,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fcb57c740ae1daf453ae85f16e37396f672b039e00d9d866e07ddb24e328e3a" dependencies = [ "jobserver", - "libc 0.2.173", + "libc 0.2.177", "shlex", ] @@ -723,7 +723,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" dependencies = [ "glob", - "libc 0.2.173", + "libc 0.2.177", "libloading", ] @@ -885,7 +885,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b55271e5c8c478ad3f38ad24ef34923091e0548492a266d19b3c0b4d82574c63" dependencies = [ "core-foundation-sys", - "libc 0.2.173", + "libc 0.2.177", ] [[package]] @@ -909,7 +909,7 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e9e393a7668fe1fad3075085b86c781883000b4ede868f43627b34a87c8b7ded" dependencies = [ - "libc 0.2.173", + "libc 0.2.177", "winapi 0.3.9", ] @@ -919,7 +919,7 @@ version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "16b80225097f2e5ae4e7179dd2266824648f3e2f49d9134d584b76389d31c4c3" dependencies = [ - "libc 0.2.173", + "libc 0.2.177", ] [[package]] @@ -1108,13 +1108,14 @@ dependencies = [ "clap", "criterion", "datadog-ddsketch", + "datadog-log", "datadog-trace-protobuf", + "datadog-trace-stats", "datadog-trace-utils", "ddcommon 0.0.1", "ddtelemetry", "dogstatsd-client", "either", - "hashbrown 0.15.2", "http", "http-body-util", "httpmock", @@ -1140,7 +1141,7 @@ version = "21.0.0" source = "git+https://github.com/DataDog/libdatadog?rev=0b59f64c4fc08105e5b73c5a0752ced3cf8f653e#0b59f64c4fc08105e5b73c5a0752ced3cf8f653e" dependencies = [ "allocator-api2", - "libc 0.2.173", + "libc 0.2.177", "windows-sys 0.52.0", ] @@ -1152,13 +1153,14 @@ dependencies = [ "backtrace", "blazesym", "cc", + "cc_utils", "chrono", "criterion", "ddcommon 0.0.1", "ddtelemetry", "goblin", "http", - "libc 0.2.173", + "libc 0.2.177", "nix", "num-derive", "num-traits", @@ -1188,7 +1190,7 @@ dependencies = [ "ddcommon 0.0.1", "ddcommon-ffi 0.0.1", "function_name", - "libc 0.2.173", + "libc 0.2.177", "serde", "serde_json", "symbolic-common", @@ -1218,7 +1220,7 @@ dependencies = [ "futures", "glibc_version", "io-lifetimes", - "libc 0.2.173", + "libc 0.2.177", "memfd", "nix", "page_size", @@ -1337,6 +1339,18 @@ dependencies = [ "uuid", ] +[[package]] +name = "datadog-log" +version = "0.0.1" +dependencies = [ + "chrono", + "ddcommon-ffi 0.0.1", + "tempfile", + "tracing", + "tracing-appender", + "tracing-subscriber", +] + [[package]] name = "datadog-php-profiling" version = "0.0.0" @@ -1359,7 +1373,7 @@ dependencies = [ "ddcommon 21.0.0", "env_logger 0.11.6", "lazy_static", - "libc 0.2.173", + "libc 0.2.177", "log", "once_cell", "perfcnt", @@ -1468,7 +1482,7 @@ dependencies = [ "http-body-util", "httpmock", "hyper", - "libc 0.2.173", + "libc 0.2.177", "manual_future", "memory-stats", "microseh", @@ -1512,7 +1526,7 @@ dependencies = [ "ddtelemetry-ffi", "dogstatsd-client", "http", - "libc 0.2.173", + "libc 0.2.177", "paste", "rmp-serde", "serde_json", @@ -1553,6 +1567,18 @@ dependencies = [ "tokio", ] +[[package]] +name = "datadog-trace-stats" +version = "0.0.1" +dependencies = [ + "criterion", + "datadog-ddsketch", + "datadog-trace-protobuf", + "datadog-trace-utils", + "hashbrown 0.15.2", + "rand 0.8.5", +] + [[package]] name = "datadog-trace-utils" version = "0.0.1" @@ -1606,7 +1632,7 @@ dependencies = [ "hyper-rustls", "hyper-util", "indexmap 2.7.1", - "libc 0.2.173", + "libc 0.2.177", "maplit", "nix", "pin-project", @@ -1641,7 +1667,7 @@ dependencies = [ "hyper", "hyper-rustls", "hyper-util", - "libc 0.2.173", + "libc 0.2.177", "nix", "pin-project", "regex", @@ -1699,6 +1725,7 @@ dependencies = [ "http-body-util", "hyper", "hyper-util", + "libc 0.2.177", "serde", "serde_json", "sys-info", @@ -1707,6 +1734,7 @@ dependencies = [ "tracing", "tracing-subscriber", "uuid", + "winver", ] [[package]] @@ -1718,7 +1746,7 @@ dependencies = [ "ddcommon-ffi 0.0.1", "ddtelemetry", "function_name", - "libc 0.2.173", + "libc 0.2.177", "paste", "tempfile", ] @@ -1749,7 +1777,7 @@ dependencies = [ "http", "itertools 0.11.0", "lazy_static", - "libc 0.2.173", + "libc 0.2.177", "log", "paste", "regex", @@ -1924,7 +1952,7 @@ version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" dependencies = [ - "libc 0.2.173", + "libc 0.2.177", "windows-sys 0.59.0", ] @@ -2163,7 +2191,7 @@ checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", "js-sys", - "libc 0.2.173", + "libc 0.2.177", "wasi 0.11.0+wasi-snapshot-preview1", "wasm-bindgen", ] @@ -2175,7 +2203,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73fea8450eea4bac3940448fb7ae50d91f034f941199fcd9d909a5a07aa455f0" dependencies = [ "cfg-if", - "libc 0.2.173", + "libc 0.2.177", "r-efi", "wasi 0.14.2+wasi-0.2.4", ] @@ -2550,7 +2578,7 @@ dependencies = [ "http", "http-body", "hyper", - "libc 0.2.173", + "libc 0.2.177", "pin-project-lite", "socket2", "tokio", @@ -2761,7 +2789,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" dependencies = [ "hermit-abi 0.3.9", - "libc 0.2.173", + "libc 0.2.177", "windows-sys 0.48.0", ] @@ -2772,7 +2800,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "261f68e344040fbd0edea105bef17c66edf46f984ddb1115b775ce31be948f4b" dependencies = [ "hermit-abi 0.4.0", - "libc 0.2.173", + "libc 0.2.177", "windows-sys 0.52.0", ] @@ -2821,7 +2849,7 @@ version = "0.1.32" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" dependencies = [ - "libc 0.2.173", + "libc 0.2.177", ] [[package]] @@ -2864,9 +2892,9 @@ checksum = "e32a70cf75e5846d53a673923498228bbec6a8624708a9ea5645f075d6276122" [[package]] name = "libc" -version = "0.2.173" +version = "0.2.177" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8cfeafaffdbc32176b64fb251369d52ea9f0a8fbc6f8759edffef7b525d64bb" +checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" [[package]] name = "libloading" @@ -2972,7 +3000,7 @@ version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fd3f7eed9d3848f8b98834af67102b720745c4ec028fcd0aa0239277e7de374f" dependencies = [ - "libc 0.2.173", + "libc 0.2.177", ] [[package]] @@ -2990,7 +3018,7 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c73f5c649995a115e1a0220b35e4df0a1294500477f97a91d0660fb5abeb574a" dependencies = [ - "libc 0.2.173", + "libc 0.2.177", "windows-sys 0.52.0", ] @@ -3001,7 +3029,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f26b2a7c5ccfb370edd57fda423f3a551516ee127e10bc22a6215e8c63b20a38" dependencies = [ "cc", - "libc 0.2.173", + "libc 0.2.177", "windows-sys 0.42.0", ] @@ -3043,7 +3071,7 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" dependencies = [ - "libc 0.2.173", + "libc 0.2.177", "wasi 0.11.0+wasi-snapshot-preview1", "windows-sys 0.52.0", ] @@ -3082,7 +3110,7 @@ dependencies = [ "bitflags 2.8.0", "cfg-if", "cfg_aliases", - "libc 0.2.173", + "libc 0.2.177", "memoffset", ] @@ -3169,7 +3197,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" dependencies = [ "hermit-abi 0.3.9", - "libc 0.2.173", + "libc 0.2.177", ] [[package]] @@ -3287,7 +3315,7 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "30d5b2194ed13191c1999ae0704b7839fb18384fa22e49b57eeaa97d79ce40da" dependencies = [ - "libc 0.2.173", + "libc 0.2.177", "winapi 0.3.9", ] @@ -3314,7 +3342,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if", - "libc 0.2.173", + "libc 0.2.177", "redox_syscall", "smallvec", "windows-targets 0.52.6", @@ -3348,7 +3376,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ba1fd955270ca6f8bd8624ec0c4ee1a251dd3cc0cc18e1e2665ca8f5acb1501" dependencies = [ "bitflags 1.3.2", - "libc 0.2.173", + "libc 0.2.177", "mmap", "nom 4.2.3", "x86", @@ -3513,7 +3541,7 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "059a34f111a9dee2ce1ac2826a68b24601c4298cfeb1a587c3cb493d5ab46f52" dependencies = [ - "libc 0.2.173", + "libc 0.1.12", "nix", ] @@ -3743,7 +3771,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "552840b97013b1a26992c11eac34bdd778e464601a4c2054b5f0bff7c6761293" dependencies = [ "fuchsia-cprng", - "libc 0.2.173", + "libc 0.2.177", "rand_core 0.3.1", "rdrand", "winapi 0.3.9", @@ -3755,7 +3783,7 @@ version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ - "libc 0.2.173", + "libc 0.2.177", "rand_chacha 0.3.1", "rand_core 0.6.4", ] @@ -3981,7 +4009,7 @@ dependencies = [ "cc", "cfg-if", "getrandom 0.2.15", - "libc 0.2.173", + "libc 0.2.177", "untrusted", "windows-sys 0.52.0", ] @@ -3992,7 +4020,7 @@ version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8a29d87a652dc4d43c586328706bb5cdff211f3f39a530f240b53f7221dab8e" dependencies = [ - "libc 0.2.173", + "libc 0.2.177", ] [[package]] @@ -4056,7 +4084,7 @@ checksum = "a78891ee6bf2340288408954ac787aa063d8e8817e9f53abb37c695c6d834ef6" dependencies = [ "bitflags 2.8.0", "errno", - "libc 0.2.173", + "libc 0.2.177", "linux-raw-sys", "windows-sys 0.59.0", ] @@ -4206,7 +4234,7 @@ dependencies = [ "bitflags 2.8.0", "core-foundation", "core-foundation-sys", - "libc 0.2.173", + "libc 0.2.177", "security-framework-sys", ] @@ -4217,7 +4245,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" dependencies = [ "core-foundation-sys", - "libc 0.2.173", + "libc 0.2.177", ] [[package]] @@ -4235,7 +4263,7 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "604b71b8fc267e13bb3023a2c901126c8f349393666a6d98ac1ae5729b701798" dependencies = [ - "libc 0.2.173", + "libc 0.2.177", "tokio", ] @@ -4403,7 +4431,7 @@ version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" dependencies = [ - "libc 0.2.173", + "libc 0.2.177", ] [[package]] @@ -4466,7 +4494,7 @@ version = "0.5.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" dependencies = [ - "libc 0.2.173", + "libc 0.2.177", "windows-sys 0.52.0", ] @@ -4479,6 +4507,7 @@ dependencies = [ "fastrand", "io-lifetimes", "kernel32-sys", + "libc 0.2.177", "memfd", "nix", "rlimit", @@ -4587,7 +4616,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b3a0d0aba8bf96a0e1ddfdc352fc53b3df7f39318c71854910c3c4b024ae52c" dependencies = [ "cc", - "libc 0.2.173", + "libc 0.2.177", ] [[package]] @@ -4850,7 +4879,7 @@ checksum = "3d61fa4ffa3de412bfea335c6ecff681de2b609ba3c77ef3e00e521813a9ed9e" dependencies = [ "backtrace", "bytes", - "libc 0.2.173", + "libc 0.2.177", "mio", "parking_lot", "pin-project-lite", @@ -5058,6 +5087,18 @@ dependencies = [ "tracing-core", ] +[[package]] +name = "tracing-appender" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3566e8ce28cc0a3fe42519fc80e6b4c943cc4c8cef275620eb8dac2d3d4e06cf" +dependencies = [ + "crossbeam-channel", + "thiserror 1.0.69", + "time", + "tracing-subscriber", +] + [[package]] name = "tracing-attributes" version = "0.1.28" @@ -5103,6 +5144,16 @@ dependencies = [ "tracing-subscriber", ] +[[package]] +name = "tracing-serde" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "704b1aeb7be0d0a84fc9828cae51dab5970fee5088f83d1dd7ee6f6246fc6ff1" +dependencies = [ + "serde", + "tracing-core", +] + [[package]] name = "tracing-subscriber" version = "0.3.19" @@ -5113,12 +5164,15 @@ dependencies = [ "nu-ansi-term", "once_cell", "regex", + "serde", + "serde_json", "sharded-slab", "smallvec", "thread_local", "tracing", "tracing-core", "tracing-log", + "tracing-serde", ] [[package]] @@ -5441,6 +5495,15 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" +dependencies = [ + "windows-targets 0.48.5", +] + [[package]] name = "windows" version = "0.51.1" @@ -5825,6 +5888,15 @@ dependencies = [ "memchr", ] +[[package]] +name = "winver" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e0e7162b9e282fd75a0a832cce93994bdb21208d848a418cd05a5fdd9b9ab33" +dependencies = [ + "windows 0.48.0", +] + [[package]] name = "wit-bindgen-rt" version = "0.39.0" diff --git a/components-rs/common.h b/components-rs/common.h index 8fa75281f6..41851fe4ee 100644 --- a/components-rs/common.h +++ b/components-rs/common.h @@ -446,16 +446,6 @@ typedef struct ddog_Vec_CharSlice { uintptr_t capacity; } ddog_Vec_CharSlice; -/** - * Holds the raw parts of a Rust Vec; it should only be created from Rust, - * never from C. - */ -typedef struct ddog_Vec_I32 { - const int32_t *ptr; - uintptr_t len; - uintptr_t capacity; -} ddog_Vec_I32; - typedef struct ddog_Tag { ddog_CharSlice name; const struct ddog_DslString *value; @@ -477,6 +467,10 @@ typedef struct ddog_Vec_CChar { uintptr_t capacity; } ddog_Vec_CChar; +typedef struct ddog_Vec_CChar *(*ddog_DynamicConfigUpdate)(ddog_CharSlice config, + ddog_CharSlice value, + bool return_old); + typedef enum ddog_IntermediateValue_Tag { DDOG_INTERMEDIATE_VALUE_STRING, DDOG_INTERMEDIATE_VALUE_NUMBER, @@ -643,8 +637,121 @@ typedef struct ddog_Vec_DebuggerPayload { uintptr_t capacity; } ddog_Vec_DebuggerPayload; +/** + * `QueueId` is a struct that represents a unique identifier for a queue. + * It contains a single field, `inner`, which is a 64-bit unsigned integer. + */ +typedef uint64_t ddog_QueueId; + typedef struct ddog_HashMap_ShmCacheKey__ShmCache ddog_ShmCacheMap; +/** + * A 128-bit (16 byte) buffer containing the UUID. + * + * # ABI + * + * The `Bytes` type is always guaranteed to be have the same ABI as [`Uuid`]. + */ +typedef uint8_t ddog_Bytes[16]; + +/** + * A Universally Unique Identifier (UUID). + * + * # Examples + * + * Parse a UUID given in the simple format and print it as a urn: + * + * ``` + * # use uuid::Uuid; + * # fn main() -> Result<(), uuid::Error> { + * let my_uuid = Uuid::parse_str("a1a2a3a4b1b2c1c2d1d2d3d4d5d6d7d8")?; + * + * println!("{}", my_uuid.urn()); + * # Ok(()) + * # } + * ``` + * + * Create a new random (V4) UUID and print it out in hexadecimal form: + * + * ``` + * // Note that this requires the `v4` feature enabled in the uuid crate. + * # use uuid::Uuid; + * # fn main() { + * # #[cfg(feature = "v4")] { + * let my_uuid = Uuid::new_v4(); + * + * println!("{}", my_uuid); + * # } + * # } + * ``` + * + * # Formatting + * + * A UUID can be formatted in one of a few ways: + * + * * [`simple`](#method.simple): `a1a2a3a4b1b2c1c2d1d2d3d4d5d6d7d8`. + * * [`hyphenated`](#method.hyphenated): + * `a1a2a3a4-b1b2-c1c2-d1d2-d3d4d5d6d7d8`. + * * [`urn`](#method.urn): `urn:uuid:A1A2A3A4-B1B2-C1C2-D1D2-D3D4D5D6D7D8`. + * * [`braced`](#method.braced): `{a1a2a3a4-b1b2-c1c2-d1d2-d3d4d5d6d7d8}`. + * + * The default representation when formatting a UUID with `Display` is + * hyphenated: + * + * ``` + * # use uuid::Uuid; + * # fn main() -> Result<(), uuid::Error> { + * let my_uuid = Uuid::parse_str("a1a2a3a4b1b2c1c2d1d2d3d4d5d6d7d8")?; + * + * assert_eq!( + * "a1a2a3a4-b1b2-c1c2-d1d2-d3d4d5d6d7d8", + * my_uuid.to_string(), + * ); + * # Ok(()) + * # } + * ``` + * + * Other formats can be specified using adapter methods on the UUID: + * + * ``` + * # use uuid::Uuid; + * # fn main() -> Result<(), uuid::Error> { + * let my_uuid = Uuid::parse_str("a1a2a3a4b1b2c1c2d1d2d3d4d5d6d7d8")?; + * + * assert_eq!( + * "urn:uuid:a1a2a3a4-b1b2-c1c2-d1d2-d3d4d5d6d7d8", + * my_uuid.urn().to_string(), + * ); + * # Ok(()) + * # } + * ``` + * + * # Endianness + * + * The specification for UUIDs encodes the integer fields that make up the + * value in big-endian order. This crate assumes integer inputs are already in + * the correct order by default, regardless of the endianness of the + * environment. Most methods that accept integers have a `_le` variant (such as + * `from_fields_le`) that assumes any integer values will need to have their + * bytes flipped, regardless of the endianness of the environment. + * + * Most users won't need to worry about endianness unless they need to operate + * on individual fields (such as when converting between Microsoft GUIDs). The + * important things to remember are: + * + * - The endianness is in terms of the fields of the UUID, not the environment. + * - The endianness is assumed to be big-endian when there's no `_le` suffix + * somewhere. + * - Byte-flipping in `_le` methods applies to each integer. + * - Endianness roundtrips, so if you create a UUID with `from_fields_le` + * you'll get the same values back out with `to_fields_le`. + * + * # ABI + * + * The `Uuid` type is always guaranteed to be have the same ABI as [`Bytes`]. + */ +typedef ddog_Bytes ddog_Uuid; + /** * Holds the raw parts of a Rust Vec; it should only be created from Rust, * never from C. @@ -1313,6 +1420,23 @@ typedef struct ddog_crasht_Handle_CrashInfoBuilder { struct ddog_crasht_CrashInfoBuilder *inner; } ddog_crasht_Handle_CrashInfoBuilder; +typedef enum ddog_crasht_CrashInfoBuilder_NewResult_Tag { + DDOG_CRASHT_CRASH_INFO_BUILDER_NEW_RESULT_OK, + DDOG_CRASHT_CRASH_INFO_BUILDER_NEW_RESULT_ERR, +} ddog_crasht_CrashInfoBuilder_NewResult_Tag; + +typedef struct ddog_crasht_CrashInfoBuilder_NewResult { + ddog_crasht_CrashInfoBuilder_NewResult_Tag tag; + union { + struct { + struct ddog_crasht_Handle_CrashInfoBuilder ok; + }; + struct { + struct ddog_Error err; + }; + }; +} ddog_crasht_CrashInfoBuilder_NewResult; + typedef enum ddog_crasht_CrashInfo_NewResult_Tag { DDOG_CRASHT_CRASH_INFO_NEW_RESULT_OK, DDOG_CRASHT_CRASH_INFO_NEW_RESULT_ERR, @@ -1402,6 +1526,23 @@ typedef struct ddog_crasht_StackFrame_NewResult { }; } ddog_crasht_StackFrame_NewResult; +typedef enum ddog_crasht_StackTrace_NewResult_Tag { + DDOG_CRASHT_STACK_TRACE_NEW_RESULT_OK, + DDOG_CRASHT_STACK_TRACE_NEW_RESULT_ERR, +} ddog_crasht_StackTrace_NewResult_Tag; + +typedef struct ddog_crasht_StackTrace_NewResult { + ddog_crasht_StackTrace_NewResult_Tag tag; + union { + struct { + struct ddog_crasht_Handle_StackTrace ok; + }; + struct { + struct ddog_Error err; + }; + }; +} ddog_crasht_StackTrace_NewResult; + typedef enum ddog_StringWrapperResult_Tag { DDOG_STRING_WRAPPER_RESULT_OK, DDOG_STRING_WRAPPER_RESULT_ERR, diff --git a/components-rs/crashtracker.h b/components-rs/crashtracker.h index 6df6ab8df9..42209ff18c 100644 --- a/components-rs/crashtracker.h +++ b/components-rs/crashtracker.h @@ -19,40 +19,6 @@ -typedef enum ddog_crasht_CrashInfoBuilder_NewResult_Tag { - DDOG_CRASHT_CRASH_INFO_BUILDER_NEW_RESULT_OK, - DDOG_CRASHT_CRASH_INFO_BUILDER_NEW_RESULT_ERR, -} ddog_crasht_CrashInfoBuilder_NewResult_Tag; - -typedef struct ddog_crasht_CrashInfoBuilder_NewResult { - ddog_crasht_CrashInfoBuilder_NewResult_Tag tag; - union { - struct { - struct ddog_crasht_Handle_CrashInfoBuilder ok; - }; - struct { - struct ddog_Error err; - }; - }; -} ddog_crasht_CrashInfoBuilder_NewResult; - -typedef enum ddog_crasht_StackTrace_NewResult_Tag { - DDOG_CRASHT_STACK_TRACE_NEW_RESULT_OK, - DDOG_CRASHT_STACK_TRACE_NEW_RESULT_ERR, -} ddog_crasht_StackTrace_NewResult_Tag; - -typedef struct ddog_crasht_StackTrace_NewResult { - ddog_crasht_StackTrace_NewResult_Tag tag; - union { - struct { - struct ddog_crasht_Handle_StackTrace ok; - }; - struct { - struct ddog_Error err; - }; - }; -} ddog_crasht_StackTrace_NewResult; - #ifdef __cplusplus extern "C" { #endif // __cplusplus diff --git a/components-rs/ddtrace.h b/components-rs/ddtrace.h index f0c0ca578d..b6c283a280 100644 --- a/components-rs/ddtrace.h +++ b/components-rs/ddtrace.h @@ -11,123 +11,6 @@ struct _zend_string; #include "telemetry.h" #include "sidecar.h" -typedef struct ddog_Vec_CChar *(*ddog_DynamicConfigUpdate)(ddog_CharSlice config, - ddog_CharSlice value, - bool return_old); - -/** - * `QueueId` is a struct that represents a unique identifier for a queue. - * It contains a single field, `inner`, which is a 64-bit unsigned integer. - */ -typedef uint64_t ddog_QueueId; - -/** - * A 128-bit (16 byte) buffer containing the UUID. - * - * # ABI - * - * The `Bytes` type is always guaranteed to be have the same ABI as [`Uuid`]. - */ -typedef uint8_t ddog_Bytes[16]; - -/** - * A Universally Unique Identifier (UUID). - * - * # Examples - * - * Parse a UUID given in the simple format and print it as a urn: - * - * ``` - * # use uuid::Uuid; - * # fn main() -> Result<(), uuid::Error> { - * let my_uuid = Uuid::parse_str("a1a2a3a4b1b2c1c2d1d2d3d4d5d6d7d8")?; - * - * println!("{}", my_uuid.urn()); - * # Ok(()) - * # } - * ``` - * - * Create a new random (V4) UUID and print it out in hexadecimal form: - * - * ``` - * // Note that this requires the `v4` feature enabled in the uuid crate. - * # use uuid::Uuid; - * # fn main() { - * # #[cfg(feature = "v4")] { - * let my_uuid = Uuid::new_v4(); - * - * println!("{}", my_uuid); - * # } - * # } - * ``` - * - * # Formatting - * - * A UUID can be formatted in one of a few ways: - * - * * [`simple`](#method.simple): `a1a2a3a4b1b2c1c2d1d2d3d4d5d6d7d8`. - * * [`hyphenated`](#method.hyphenated): - * `a1a2a3a4-b1b2-c1c2-d1d2-d3d4d5d6d7d8`. - * * [`urn`](#method.urn): `urn:uuid:A1A2A3A4-B1B2-C1C2-D1D2-D3D4D5D6D7D8`. - * * [`braced`](#method.braced): `{a1a2a3a4-b1b2-c1c2-d1d2-d3d4d5d6d7d8}`. - * - * The default representation when formatting a UUID with `Display` is - * hyphenated: - * - * ``` - * # use uuid::Uuid; - * # fn main() -> Result<(), uuid::Error> { - * let my_uuid = Uuid::parse_str("a1a2a3a4b1b2c1c2d1d2d3d4d5d6d7d8")?; - * - * assert_eq!( - * "a1a2a3a4-b1b2-c1c2-d1d2-d3d4d5d6d7d8", - * my_uuid.to_string(), - * ); - * # Ok(()) - * # } - * ``` - * - * Other formats can be specified using adapter methods on the UUID: - * - * ``` - * # use uuid::Uuid; - * # fn main() -> Result<(), uuid::Error> { - * let my_uuid = Uuid::parse_str("a1a2a3a4b1b2c1c2d1d2d3d4d5d6d7d8")?; - * - * assert_eq!( - * "urn:uuid:a1a2a3a4-b1b2-c1c2-d1d2-d3d4d5d6d7d8", - * my_uuid.urn().to_string(), - * ); - * # Ok(()) - * # } - * ``` - * - * # Endianness - * - * The specification for UUIDs encodes the integer fields that make up the - * value in big-endian order. This crate assumes integer inputs are already in - * the correct order by default, regardless of the endianness of the - * environment. Most methods that accept integers have a `_le` variant (such as - * `from_fields_le`) that assumes any integer values will need to have their - * bytes flipped, regardless of the endianness of the environment. - * - * Most users won't need to worry about endianness unless they need to operate - * on individual fields (such as when converting between Microsoft GUIDs). The - * important things to remember are: - * - * - The endianness is in terms of the fields of the UUID, not the environment. - * - The endianness is assumed to be big-endian when there's no `_le` suffix - * somewhere. - * - Byte-flipping in `_le` methods applies to each integer. - * - Endianness roundtrips, so if you create a UUID with `from_fields_le` - * you'll get the same values back out with `to_fields_le`. - * - * # ABI - * - * The `Uuid` type is always guaranteed to be have the same ABI as [`Bytes`]. - */ -typedef ddog_Bytes ddog_Uuid; - extern ddog_Uuid ddtrace_runtime_id; extern void (*ddog_log_callback)(ddog_CharSlice); @@ -191,10 +74,6 @@ bool ddog_global_log_probe_limiter_inc(const struct ddog_RemoteConfigState *remo struct ddog_Vec_CharSlice *ddog_CharSlice_to_owned(ddog_CharSlice str); -struct ddog_Vec_I32 *ddog_number_to_owned_i32(int32_t number); - -void ddog_Vec_CChar_drop(struct ddog_Vec_CharSlice *ptr); - bool ddog_remote_configs_service_env_change(struct ddog_RemoteConfigState *remote_config, ddog_CharSlice service, ddog_CharSlice env, diff --git a/components-rs/remote_config.rs b/components-rs/remote_config.rs index 6b371c2bcb..44753082d1 100644 --- a/components-rs/remote_config.rs +++ b/components-rs/remote_config.rs @@ -488,17 +488,6 @@ pub unsafe extern "C" fn ddog_CharSlice_to_owned(str: CharSlice) -> *mut ddcommo Box::into_raw(Box::new(std_vec.into())) } -#[no_mangle] -pub unsafe extern "C" fn ddog_number_to_owned_i32(number: i32) -> *mut ddcommon_ffi::Vec { - let std_vec: Vec = vec![number]; - Box::into_raw(Box::new(std_vec.into())) -} - -#[no_mangle] -pub unsafe extern "C" fn ddog_Vec_CChar_drop(ptr: *mut ddcommon_ffi::Vec) { - Box::from_raw(ptr); -} - #[no_mangle] pub extern "C" fn ddog_remote_configs_service_env_change( remote_config: &mut RemoteConfigState, diff --git a/components-rs/sidecar.h b/components-rs/sidecar.h index 991cfb2538..defa992dec 100644 --- a/components-rs/sidecar.h +++ b/components-rs/sidecar.h @@ -10,12 +10,6 @@ #include #include "common.h" -/** - * `QueueId` is a struct that represents a unique identifier for a queue. - * It contains a single field, `inner`, which is a 64-bit unsigned integer. - */ -typedef uint64_t ddog_QueueId; - #if defined(_WIN32) bool ddog_setup_crashtracking(const struct ddog_Endpoint *endpoint, ddog_crasht_Metadata metadata); #endif From b30a38367be8a1233a69e02bdd42604dafed2bd0 Mon Sep 17 00:00:00 2001 From: Alejandro Estringana Ruiz Date: Tue, 21 Oct 2025 13:00:04 +0200 Subject: [PATCH 27/53] Test Laravel integration --- .../appsec/php/TelemetryHelpers.groovy | 23 ++++++++ .../php/integration/Laravel8xTests.groovy | 52 +++++++++++++++++++ 2 files changed, 75 insertions(+) diff --git a/appsec/tests/integration/src/main/groovy/com/datadog/appsec/php/TelemetryHelpers.groovy b/appsec/tests/integration/src/main/groovy/com/datadog/appsec/php/TelemetryHelpers.groovy index 24208464b7..fcff36ae05 100644 --- a/appsec/tests/integration/src/main/groovy/com/datadog/appsec/php/TelemetryHelpers.groovy +++ b/appsec/tests/integration/src/main/groovy/com/datadog/appsec/php/TelemetryHelpers.groovy @@ -22,6 +22,29 @@ class TelemetryHelpers { } } + static class AppEndpoints { + static names = ['app-endpoints'] + List endpoints + + AppEndpoints(Map m) { + endpoints = m.endpoints.collect { new Endpoint(it as Map) } + } + } + + static class Endpoint { + String method + String operationName + String path + String resourceName + + Endpoint(Map m) { + method = m.method + operationName = m.operation_name + path = m.path + resourceName = m.resource_name + } + } + static class Metric { String namespace String name diff --git a/appsec/tests/integration/src/test/groovy/com/datadog/appsec/php/integration/Laravel8xTests.groovy b/appsec/tests/integration/src/test/groovy/com/datadog/appsec/php/integration/Laravel8xTests.groovy index 2a14aefc98..982fd40a01 100644 --- a/appsec/tests/integration/src/test/groovy/com/datadog/appsec/php/integration/Laravel8xTests.groovy +++ b/appsec/tests/integration/src/test/groovy/com/datadog/appsec/php/integration/Laravel8xTests.groovy @@ -15,6 +15,7 @@ import java.net.http.HttpResponse import static com.datadog.appsec.php.integration.TestParams.getPhpVersion import static com.datadog.appsec.php.integration.TestParams.getVariant +import com.datadog.appsec.php.TelemetryHelpers import static java.net.http.HttpResponse.BodyHandlers.ofString @Testcontainers @@ -103,4 +104,55 @@ class Laravel8xTests { assert span.meta."_dd.appsec.event_rules.version" != '' assert span.meta."appsec.blocked" == "true" } + + private static List waitForTelemetryData(int timeoutSec, Closure cl, Class cls) { + List messages = [] + def deadline = System.currentTimeSeconds() + timeoutSec + def lastHttpReq = System.currentTimeSeconds() - 6 + while (System.currentTimeSeconds() < deadline) { + if (System.currentTimeSeconds() - lastHttpReq > 5) { + lastHttpReq = System.currentTimeSeconds() + // used to flush global (not request-bound) telemetry metrics + def request = CONTAINER.buildReq('/').GET().build() + def trace = CONTAINER.traceFromRequest(request, ofString()) { HttpResponse resp -> + assert resp.body().size() > 0 + } + } + def telData = CONTAINER.drainTelemetry(500) + messages.addAll( + TelemetryHelpers.filterMessages(telData, cls)) + if (cl.call(messages)) { + break + } + } + messages + } + + private static List waitForMetrics(int timeoutSec, Closure cl) { + waitForTelemetryData(timeoutSec, cl, TelemetryHelpers.AppEndpoints) + } + + @Test + void 'Endpoints are sended'() { + def trace = container.traceFromRequest('/') { HttpResponse resp -> + assert resp.statusCode() == 200 + } + + assert trace.traceId != null + + List endpoints + + waitForMetrics(30) { List messages -> + endpoints = messages.collectMany { it.endpoints } + endpoints.size() > 0 + } + + assert endpoints.size() == 6 + assert endpoints.find { it.path == '/' && it.method == 'GET' && it.operationName == 'http.request' && it.resourceName == 'GET /' } != null + assert endpoints.find { it.path == 'authenticate' && it.method == 'GET' && it.operationName == 'http.request' && it.resourceName == 'GET authenticate' } != null + assert endpoints.find { it.path == 'register' && it.method == 'GET' && it.operationName == 'http.request' && it.resourceName == 'GET register' } != null + assert endpoints.find { it.path == 'dynamic-path/{param01}' && it.method == 'GET' && it.operationName == 'http.request' && it.resourceName == 'GET dynamic-path/{param01}' } != null + assert endpoints.find { it.path == 'sanctum/csrf-cookie' && it.method == 'GET' && it.operationName == 'http.request' && it.resourceName == 'GET sanctum/csrf-cookie' } != null + assert endpoints.find { it.path == 'api/user' && it.method == 'GET' && it.operationName == 'http.request' && it.resourceName == 'GET api/user' } != null + } } From cb4fe227b7b37c5d2d4fc8248c36cddf2088fc37 Mon Sep 17 00:00:00 2001 From: Alejandro Estringana Ruiz Date: Tue, 21 Oct 2025 16:00:24 +0200 Subject: [PATCH 28/53] Refactor telemetry collection on appsec integration tests --- .../appsec/php/TelemetryHelpers.groovy | 43 ++++++++++++++++ .../php/integration/Laravel8xTests.groovy | 31 +----------- .../php/integration/TelemetryTests.groovy | 49 +++---------------- 3 files changed, 52 insertions(+), 71 deletions(-) diff --git a/appsec/tests/integration/src/main/groovy/com/datadog/appsec/php/TelemetryHelpers.groovy b/appsec/tests/integration/src/main/groovy/com/datadog/appsec/php/TelemetryHelpers.groovy index fcff36ae05..5d06967004 100644 --- a/appsec/tests/integration/src/main/groovy/com/datadog/appsec/php/TelemetryHelpers.groovy +++ b/appsec/tests/integration/src/main/groovy/com/datadog/appsec/php/TelemetryHelpers.groovy @@ -1,6 +1,10 @@ package com.datadog.appsec.php import groovy.transform.Canonical +import java.net.http.HttpRequest +import java.net.http.HttpResponse +import com.datadog.appsec.php.docker.AppSecContainer +import static java.net.http.HttpResponse.BodyHandlers.ofString /** * @link https://github.com/DataDog/instrumentation-telemetry-api-docs/blob/main/GeneratedDocumentation/ApiDocs/v2/producing-telemetry.md @@ -160,4 +164,43 @@ class TelemetryHelpers { autoEnabled = m.autoEnabled } } + + public static List waitForTelemetryData(AppSecContainer container, int timeoutSec, Closure cl, Class cls) { + List messages = [] + def deadline = System.currentTimeSeconds() + timeoutSec + def lastHttpReq = System.currentTimeSeconds() - 6 + while (System.currentTimeSeconds() < deadline) { + if (System.currentTimeSeconds() - lastHttpReq > 5) { + lastHttpReq = System.currentTimeSeconds() + // used to flush global (not request-bound) telemetry metrics + def request = container.buildReq('/hello.php').GET().build() + def trace = container.traceFromRequest(request, ofString()) { HttpResponse resp -> + assert resp.body().size() > 0 + } + } + def telData = container.drainTelemetry(500) + messages.addAll( + TelemetryHelpers.filterMessages(telData, cls)) + if (cl.call(messages)) { + break + } + } + messages + } + + public static List waitForAppEndpoints(AppSecContainer container, int timeoutSec, Closure cl) { + waitForTelemetryData(container, timeoutSec, cl, AppEndpoints) + } + + public static List waitForMetrics(AppSecContainer container, int timeoutSec, Closure cl) { + waitForTelemetryData(container, timeoutSec, cl, GenerateMetrics) + } + + public static List waitForIntegrations(AppSecContainer container, int timeoutSec, Closure cl) { + waitForTelemetryData(container, timeoutSec, cl, WithIntegrations) + } + + public static List waitForLogs(AppSecContainer container, int timeoutSec, Closure cl) { + waitForTelemetryData(container, timeoutSec, cl, Logs) + } } diff --git a/appsec/tests/integration/src/test/groovy/com/datadog/appsec/php/integration/Laravel8xTests.groovy b/appsec/tests/integration/src/test/groovy/com/datadog/appsec/php/integration/Laravel8xTests.groovy index 982fd40a01..c8d1922843 100644 --- a/appsec/tests/integration/src/test/groovy/com/datadog/appsec/php/integration/Laravel8xTests.groovy +++ b/appsec/tests/integration/src/test/groovy/com/datadog/appsec/php/integration/Laravel8xTests.groovy @@ -105,33 +105,6 @@ class Laravel8xTests { assert span.meta."appsec.blocked" == "true" } - private static List waitForTelemetryData(int timeoutSec, Closure cl, Class cls) { - List messages = [] - def deadline = System.currentTimeSeconds() + timeoutSec - def lastHttpReq = System.currentTimeSeconds() - 6 - while (System.currentTimeSeconds() < deadline) { - if (System.currentTimeSeconds() - lastHttpReq > 5) { - lastHttpReq = System.currentTimeSeconds() - // used to flush global (not request-bound) telemetry metrics - def request = CONTAINER.buildReq('/').GET().build() - def trace = CONTAINER.traceFromRequest(request, ofString()) { HttpResponse resp -> - assert resp.body().size() > 0 - } - } - def telData = CONTAINER.drainTelemetry(500) - messages.addAll( - TelemetryHelpers.filterMessages(telData, cls)) - if (cl.call(messages)) { - break - } - } - messages - } - - private static List waitForMetrics(int timeoutSec, Closure cl) { - waitForTelemetryData(timeoutSec, cl, TelemetryHelpers.AppEndpoints) - } - @Test void 'Endpoints are sended'() { def trace = container.traceFromRequest('/') { HttpResponse resp -> @@ -142,10 +115,10 @@ class Laravel8xTests { List endpoints - waitForMetrics(30) { List messages -> + TelemetryHelpers.waitForAppEndpoints(container, 30, { List messages -> endpoints = messages.collectMany { it.endpoints } endpoints.size() > 0 - } + }) assert endpoints.size() == 6 assert endpoints.find { it.path == '/' && it.method == 'GET' && it.operationName == 'http.request' && it.resourceName == 'GET /' } != null diff --git a/appsec/tests/integration/src/test/groovy/com/datadog/appsec/php/integration/TelemetryTests.groovy b/appsec/tests/integration/src/test/groovy/com/datadog/appsec/php/integration/TelemetryTests.groovy index 67da553a11..502cff21f0 100644 --- a/appsec/tests/integration/src/test/groovy/com/datadog/appsec/php/integration/TelemetryTests.groovy +++ b/appsec/tests/integration/src/test/groovy/com/datadog/appsec/php/integration/TelemetryTests.groovy @@ -96,7 +96,7 @@ class TelemetryTests { TelemetryHelpers.Metric wafReq1 TelemetryHelpers.Metric wafReq2 - waitForMetrics(30) { List messages -> + TelemetryHelpers.waitForMetrics(CONTAINER, 30) { List messages -> def allSeries = messages.collectMany { it.series } wafInit = allSeries.find { it.name == 'waf.init' } wafReq1 = allSeries.find { it.name == 'waf.requests' && it.tags.size() == 2 } @@ -195,7 +195,7 @@ class TelemetryTests { ] ]) - def messages = waitForMetrics(30) { List messages -> + def messages = TelemetryHelpers.waitForMetrics(CONTAINER, 30) { List messages -> def allSeries = messages .collectMany { it.series } .findAll { @@ -281,7 +281,7 @@ class TelemetryTests { ] ]) - def messages = waitForTelemetryLogs(30) { List logs -> + def messages = TelemetryHelpers.waitForLogs(CONTAINER, 30) { List logs -> def relevantLogs = logs.collectMany { it.logs.findAll { it.tags.contains('log_type:rc::') } } relevantLogs.size() >= 3 }.collectMany { it.logs } @@ -327,7 +327,7 @@ class TelemetryTests { List allIntegrations = [] boolean foundRedis = false - waitForIntegrations(30) { List messages -> + TelemetryHelpers.waitForIntegrations(CONTAINER, 30) { List messages -> allIntegrations.addAll(messages.collectMany { it.integrations }) foundRedis = allIntegrations.find { it.name == 'phpredis' && it.enabled == Boolean.TRUE } != null } @@ -339,7 +339,7 @@ class TelemetryTests { allIntegrations = [] foundRedis = false boolean foundExec = false - waitForIntegrations(15) { List messages -> + TelemetryHelpers.waitForIntegrations(CONTAINER, 15) { List messages -> allIntegrations.addAll(messages.collectMany { it.integrations }) foundRedis = allIntegrations.find { it.name == 'phpredis' && it.enabled == Boolean.TRUE } != null foundExec = allIntegrations.find { it.name == 'exec' && it.enabled == Boolean.TRUE } != null @@ -349,41 +349,6 @@ class TelemetryTests { assert foundExec } - private static List waitForMetrics(int timeoutSec, Closure cl) { - waitForTelemetryData(timeoutSec, cl, TelemetryHelpers.GenerateMetrics) - } - - private static List waitForIntegrations(int timeoutSec, Closure cl) { - waitForTelemetryData(timeoutSec, cl, TelemetryHelpers.WithIntegrations) - } - - private static List waitForTelemetryLogs(int timeoutSec, Closure cl) { - waitForTelemetryData(timeoutSec, cl, TelemetryHelpers.Logs) - } - - private static List waitForTelemetryData(int timeoutSec, Closure cl, Class cls) { - List messages = [] - def deadline = System.currentTimeSeconds() + timeoutSec - def lastHttpReq = System.currentTimeSeconds() - 6 - while (System.currentTimeSeconds() < deadline) { - if (System.currentTimeSeconds() - lastHttpReq > 5) { - lastHttpReq = System.currentTimeSeconds() - // used to flush global (not request-bound) telemetry metrics - def request = CONTAINER.buildReq('/hello.php').GET().build() - def trace = CONTAINER.traceFromRequest(request, ofString()) { HttpResponse resp -> - assert resp.body().size() > 0 - } - } - def telData = CONTAINER.drainTelemetry(500) - messages.addAll( - TelemetryHelpers.filterMessages(telData, cls)) - if (cl.call(messages)) { - break - } - } - messages - } - /** * This test takes a long time (around 10-12 seconds) because the metric * interval is hardcoded to 10 seconds in the metrics.rs. @@ -423,7 +388,7 @@ class TelemetryTests { TelemetryHelpers.Metric lfiTimeout TelemetryHelpers.Metric ssrfTimeout - waitForMetrics(30) { List messages -> + TelemetryHelpers.waitForMetrics(CONTAINER, 30) { List messages -> def allSeries = messages.collectMany { it.series } wafReq1 = allSeries.find { it.name == 'waf.requests' && it.tags.size() == 2 } lfiEval = allSeries.find{ it.name == 'rasp.rule.eval' && 'rule_type:lfi' in it.tags} @@ -514,7 +479,7 @@ class TelemetryTests { TelemetryHelpers.Metric loginSuccess TelemetryHelpers.Metric loginFailure - waitForMetrics(30) { List messages -> + TelemetryHelpers.waitForMetrics(CONTAINER, 30) { List messages -> def allSeries = messages.collectMany { it.series } println allSeries loginSuccess = allSeries.find{ it.name == 'sdk.event' && 'event_type:login_success' in it.tags} From 2d37978e11acd2894d7186577f5887459abf00d9 Mon Sep 17 00:00:00 2001 From: Alejandro Estringana Ruiz Date: Tue, 21 Oct 2025 17:26:02 +0200 Subject: [PATCH 29/53] Remove non necessary file --- appsec/tests/extension/add_endpoints.phpt | 13 ------------- 1 file changed, 13 deletions(-) delete mode 100644 appsec/tests/extension/add_endpoints.phpt diff --git a/appsec/tests/extension/add_endpoints.phpt b/appsec/tests/extension/add_endpoints.phpt deleted file mode 100644 index dd9e754310..0000000000 --- a/appsec/tests/extension/add_endpoints.phpt +++ /dev/null @@ -1,13 +0,0 @@ ---TEST-- -Add endpoints ---INI-- -extension=ddtrace.so -datadog.appsec.enabled=1 ---ENV-- -DD_INSTRUMENTATION_TELEMETRY_ENABLED=1 ---FILE-- - Date: Tue, 21 Oct 2025 17:42:36 +0200 Subject: [PATCH 30/53] Update php stub --- ext/ddtrace_arginfo.h | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/ext/ddtrace_arginfo.h b/ext/ddtrace_arginfo.h index 5d377ef881..c5e0cefcc1 100644 --- a/ext/ddtrace_arginfo.h +++ b/ext/ddtrace_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: 139f8e60f945750fd3f81c339dc5318c0b155fbd */ + * Stub hash: 9539356c50d39ee983e578d17d1796e50b761f86 */ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_DDTrace_trace_method, 0, 3, _IS_BOOL, 0) ZEND_ARG_TYPE_INFO(0, className, IS_STRING, 0) @@ -132,8 +132,7 @@ ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_DDTrace_flush, 0, 0, IS_VOID, 0) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_DDTrace_curl_multi_exec_get_request_spans, 0, 1, IS_VOID, 0) - ZEND_ARG_INFO(1, array) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_DDTrace_curl_multi_exec_get_request_spans, 1, 0, IS_ARRAY, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_DDTrace_dogstatsd_count, 0, 2, IS_VOID, 0) @@ -546,7 +545,7 @@ static const zend_function_entry class_DDTrace_SpanData_methods[] = { }; static const zend_function_entry class_DDTrace_Integration_methods[] = { - ZEND_RAW_FENTRY("init", NULL, arginfo_class_DDTrace_Integration_init, ZEND_ACC_PUBLIC|ZEND_ACC_ABSTRACT, NULL, NULL) + ZEND_RAW_FENTRY("init", NULL, arginfo_class_DDTrace_Integration_init, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC|ZEND_ACC_ABSTRACT, NULL, NULL) ZEND_FE_END }; From 0c98943776cbc6a24d17429f697997402dc633b4 Mon Sep 17 00:00:00 2001 From: Alejandro Estringana Ruiz Date: Wed, 22 Oct 2025 11:15:16 +0200 Subject: [PATCH 31/53] Generate common --- components-rs/common.h | 156 +++++++++++++++++++++++------------------ 1 file changed, 89 insertions(+), 67 deletions(-) diff --git a/components-rs/common.h b/components-rs/common.h index 41851fe4ee..f74f8461d0 100644 --- a/components-rs/common.h +++ b/components-rs/common.h @@ -306,6 +306,17 @@ typedef enum ddog_Log { DDOG_LOG_HOOK_TRACE = (5 | (4 << 4)), } ddog_Log; +typedef enum ddog_InBodyLocation { + DDOG_IN_BODY_LOCATION_NONE, + DDOG_IN_BODY_LOCATION_START, + DDOG_IN_BODY_LOCATION_END, +} ddog_InBodyLocation; + +typedef enum ddog_EvaluateAt { + DDOG_EVALUATE_AT_ENTRY, + DDOG_EVALUATE_AT_EXIT, +} ddog_EvaluateAt; + typedef enum ddog_MetricKind { DDOG_METRIC_KIND_COUNT, DDOG_METRIC_KIND_GAUGE, @@ -313,6 +324,36 @@ typedef enum ddog_MetricKind { DDOG_METRIC_KIND_DISTRIBUTION, } ddog_MetricKind; +typedef enum ddog_SpanProbeTarget { + DDOG_SPAN_PROBE_TARGET_ACTIVE, + DDOG_SPAN_PROBE_TARGET_ROOT, +} ddog_SpanProbeTarget; + +typedef enum ddog_ProbeStatus { + DDOG_PROBE_STATUS_RECEIVED, + DDOG_PROBE_STATUS_INSTALLED, + DDOG_PROBE_STATUS_EMITTING, + DDOG_PROBE_STATUS_ERROR, + DDOG_PROBE_STATUS_BLOCKED, + DDOG_PROBE_STATUS_WARNING, +} ddog_ProbeStatus; + +typedef enum ddog_ConfigurationOrigin { + DDOG_CONFIGURATION_ORIGIN_ENV_VAR, + DDOG_CONFIGURATION_ORIGIN_CODE, + DDOG_CONFIGURATION_ORIGIN_DD_CONFIG, + DDOG_CONFIGURATION_ORIGIN_REMOTE_CONFIG, + DDOG_CONFIGURATION_ORIGIN_DEFAULT, + DDOG_CONFIGURATION_ORIGIN_LOCAL_STABLE_CONFIG, + DDOG_CONFIGURATION_ORIGIN_FLEET_STABLE_CONFIG, +} ddog_ConfigurationOrigin; + +typedef enum ddog_MetricType { + DDOG_METRIC_TYPE_GAUGE, + DDOG_METRIC_TYPE_COUNT, + DDOG_METRIC_TYPE_DISTRIBUTION, +} ddog_MetricType; + typedef enum ddog_MetricNamespace { DDOG_METRIC_NAMESPACE_TRACERS, DDOG_METRIC_NAMESPACE_PROFILERS, @@ -327,20 +368,16 @@ typedef enum ddog_MetricNamespace { DDOG_METRIC_NAMESPACE_SIDECAR, } ddog_MetricNamespace; -typedef enum ddog_MetricType { - DDOG_METRIC_TYPE_GAUGE, - DDOG_METRIC_TYPE_COUNT, - DDOG_METRIC_TYPE_DISTRIBUTION, -} ddog_MetricType; - -typedef enum ddog_ProbeStatus { - DDOG_PROBE_STATUS_RECEIVED, - DDOG_PROBE_STATUS_INSTALLED, - DDOG_PROBE_STATUS_EMITTING, - DDOG_PROBE_STATUS_ERROR, - DDOG_PROBE_STATUS_BLOCKED, - DDOG_PROBE_STATUS_WARNING, -} ddog_ProbeStatus; +typedef enum ddog_RemoteConfigProduct { + DDOG_REMOTE_CONFIG_PRODUCT_AGENT_CONFIG, + DDOG_REMOTE_CONFIG_PRODUCT_AGENT_TASK, + DDOG_REMOTE_CONFIG_PRODUCT_APM_TRACING, + DDOG_REMOTE_CONFIG_PRODUCT_ASM, + DDOG_REMOTE_CONFIG_PRODUCT_ASM_DATA, + DDOG_REMOTE_CONFIG_PRODUCT_ASM_DD, + DDOG_REMOTE_CONFIG_PRODUCT_ASM_FEATURES, + DDOG_REMOTE_CONFIG_PRODUCT_LIVE_DEBUGGER, +} ddog_RemoteConfigProduct; typedef enum ddog_RemoteConfigCapabilities { DDOG_REMOTE_CONFIG_CAPABILITIES_ASM_ACTIVATION = 1, @@ -388,22 +425,6 @@ typedef enum ddog_RemoteConfigCapabilities { DDOG_REMOTE_CONFIG_CAPABILITIES_ASM_TRACE_TAGGING_RULES = 43, } ddog_RemoteConfigCapabilities; -typedef enum ddog_RemoteConfigProduct { - DDOG_REMOTE_CONFIG_PRODUCT_AGENT_CONFIG, - DDOG_REMOTE_CONFIG_PRODUCT_AGENT_TASK, - DDOG_REMOTE_CONFIG_PRODUCT_APM_TRACING, - DDOG_REMOTE_CONFIG_PRODUCT_ASM, - DDOG_REMOTE_CONFIG_PRODUCT_ASM_DATA, - DDOG_REMOTE_CONFIG_PRODUCT_ASM_DD, - DDOG_REMOTE_CONFIG_PRODUCT_ASM_FEATURES, - DDOG_REMOTE_CONFIG_PRODUCT_LIVE_DEBUGGER, -} ddog_RemoteConfigProduct; - -typedef enum ddog_SpanProbeTarget { - DDOG_SPAN_PROBE_TARGET_ACTIVE, - DDOG_SPAN_PROBE_TARGET_ROOT, -} ddog_SpanProbeTarget; - typedef struct ddog_DebuggerPayload ddog_DebuggerPayload; typedef struct ddog_DslString ddog_DslString; @@ -788,17 +809,17 @@ typedef struct ddog_DebuggerValue ddog_DebuggerValue; #define ddog_EVALUATOR_RESULT_REDACTED (const void*)-2 -typedef enum ddog_DebuggerType { - DDOG_DEBUGGER_TYPE_DIAGNOSTICS, - DDOG_DEBUGGER_TYPE_LOGS, -} ddog_DebuggerType; - typedef enum ddog_FieldType { DDOG_FIELD_TYPE_STATIC, DDOG_FIELD_TYPE_ARG, DDOG_FIELD_TYPE_LOCAL, } ddog_FieldType; +typedef enum ddog_DebuggerType { + DDOG_DEBUGGER_TYPE_DIAGNOSTICS, + DDOG_DEBUGGER_TYPE_LOGS, +} ddog_DebuggerType; + typedef struct ddog_Entry ddog_Entry; typedef struct ddog_HashMap_CowStr__Value ddog_HashMap_CowStr__Value; @@ -927,16 +948,6 @@ typedef struct ddog_OwnedCharSlice { void (*free)(ddog_CharSlice); } ddog_OwnedCharSlice; -typedef enum ddog_LogLevel { - DDOG_LOG_LEVEL_ERROR, - DDOG_LOG_LEVEL_WARN, - DDOG_LOG_LEVEL_DEBUG, -} ddog_LogLevel; - -typedef enum ddog_TelemetryWorkerBuilderBoolProperty { - DDOG_TELEMETRY_WORKER_BUILDER_BOOL_PROPERTY_CONFIG_TELEMETRY_DEBUG_LOGGING_ENABLED, -} ddog_TelemetryWorkerBuilderBoolProperty; - typedef enum ddog_TelemetryWorkerBuilderEndpointProperty { DDOG_TELEMETRY_WORKER_BUILDER_ENDPOINT_PROPERTY_CONFIG_ENDPOINT, } ddog_TelemetryWorkerBuilderEndpointProperty; @@ -955,6 +966,16 @@ typedef enum ddog_TelemetryWorkerBuilderStrProperty { DDOG_TELEMETRY_WORKER_BUILDER_STR_PROPERTY_RUNTIME_ID, } ddog_TelemetryWorkerBuilderStrProperty; +typedef enum ddog_TelemetryWorkerBuilderBoolProperty { + DDOG_TELEMETRY_WORKER_BUILDER_BOOL_PROPERTY_CONFIG_TELEMETRY_DEBUG_LOGGING_ENABLED, +} ddog_TelemetryWorkerBuilderBoolProperty; + +typedef enum ddog_LogLevel { + DDOG_LOG_LEVEL_ERROR, + DDOG_LOG_LEVEL_WARN, + DDOG_LOG_LEVEL_DEBUG, +} ddog_LogLevel; + typedef struct ddog_TelemetryWorkerBuilder ddog_TelemetryWorkerBuilder; /** @@ -1146,6 +1167,12 @@ typedef enum ddog_crasht_OpTypes { DDOG_CRASHT_OP_TYPES_SIZE, } ddog_crasht_OpTypes; +typedef enum ddog_crasht_ErrorKind { + DDOG_CRASHT_ERROR_KIND_PANIC, + DDOG_CRASHT_ERROR_KIND_UNHANDLED_EXCEPTION, + DDOG_CRASHT_ERROR_KIND_UNIX_SIGNAL, +} ddog_crasht_ErrorKind; + /** * See https://man7.org/linux/man-pages/man2/sigaction.2.html * MUST REMAIN IN SYNC WITH THE ENUM IN emit_sigcodes.c @@ -1218,28 +1245,23 @@ typedef enum ddog_crasht_SignalNames { DDOG_CRASHT_SIGNAL_NAMES_UNKNOWN, } ddog_crasht_SignalNames; -/** - * Stacktrace collection occurs in the context of a crashing process. - * If the stack is sufficiently corruputed, it is possible (but unlikely), - * for stack trace collection itself to crash. - * We recommend fully enabling stacktrace collection, but having an environment - * variable to allow downgrading the collector. - */ -typedef enum ddog_crasht_StacktraceCollection { - /** - * Stacktrace collection occurs in the - */ - DDOG_CRASHT_STACKTRACE_COLLECTION_DISABLED, - DDOG_CRASHT_STACKTRACE_COLLECTION_WITHOUT_SYMBOLS, - /** - * This option uses `backtrace::resolve_frame_unsynchronized()` to gather symbol information - * and also unwind inlined functions. Enabling this feature will not only provide symbolic - * details, but may also yield additional or less stack frames compared to other - * configurations. - */ - DDOG_CRASHT_STACKTRACE_COLLECTION_ENABLED_WITH_INPROCESS_SYMBOLS, - DDOG_CRASHT_STACKTRACE_COLLECTION_ENABLED_WITH_SYMBOLS_IN_RECEIVER, -} ddog_crasht_StacktraceCollection; +typedef enum ddog_crasht_BuildIdType { + DDOG_CRASHT_BUILD_ID_TYPE_GNU, + DDOG_CRASHT_BUILD_ID_TYPE_GO, + DDOG_CRASHT_BUILD_ID_TYPE_PDB, + DDOG_CRASHT_BUILD_ID_TYPE_SHA1, +} ddog_crasht_BuildIdType; + +typedef enum ddog_crasht_FileType { + DDOG_CRASHT_FILE_TYPE_APK, + DDOG_CRASHT_FILE_TYPE_ELF, + DDOG_CRASHT_FILE_TYPE_PE, +} ddog_crasht_FileType; + +typedef enum ddog_crasht_DemangleOptions { + DDOG_CRASHT_DEMANGLE_OPTIONS_COMPLETE, + DDOG_CRASHT_DEMANGLE_OPTIONS_NAME_ONLY, +} ddog_crasht_DemangleOptions; typedef struct ddog_crasht_CrashInfo ddog_crasht_CrashInfo; From a58eb8c718a0b0cc4d005a8e33996ad1a3c30014 Mon Sep 17 00:00:00 2001 From: Alejandro Estringana Ruiz Date: Wed, 22 Oct 2025 11:54:21 +0200 Subject: [PATCH 32/53] Amend laravel compatibility --- src/DDTrace/Integrations/Laravel/LaravelIntegration.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/DDTrace/Integrations/Laravel/LaravelIntegration.php b/src/DDTrace/Integrations/Laravel/LaravelIntegration.php index a5b95b4426..11ef20ac30 100644 --- a/src/DDTrace/Integrations/Laravel/LaravelIntegration.php +++ b/src/DDTrace/Integrations/Laravel/LaravelIntegration.php @@ -146,10 +146,10 @@ static function ($This, $scope, $args, $route) { if (!\DDTrace\are_endpoints_collected()) { $routeCollection = $This->getRoutes(); foreach ($routeCollection as $value) { - $path = $value->uri; - $method = $value->methods[0] ?? ''; - $resourceName = $method . ' ' . $path; - \DDTrace\add_endpoint($path, 'http.request', $resourceName, $method); + $path = $value->uri(); + $methods = $value->methods(); + $resourceName = $methods[0] . ' ' . $path; + \DDTrace\add_endpoint($path, 'http.request', $resourceName, $methods[0]); } } } From d22f700c23b165e55dd01ddae77ad1699fea3a1c Mon Sep 17 00:00:00 2001 From: Alejandro Estringana Ruiz Date: Wed, 22 Oct 2025 12:07:23 +0200 Subject: [PATCH 33/53] Revert non required changes --- components-rs/crashtracker.h | 10 ---------- components-rs/ddtrace.h | 2 +- components-rs/remote_config.rs | 5 ++--- 3 files changed, 3 insertions(+), 14 deletions(-) diff --git a/components-rs/crashtracker.h b/components-rs/crashtracker.h index 42209ff18c..58a93c1df5 100644 --- a/components-rs/crashtracker.h +++ b/components-rs/crashtracker.h @@ -410,16 +410,6 @@ DDOG_CHECK_RETURN struct ddog_VoidResult ddog_crasht_CrashInfo_resolve_names(struct ddog_crasht_Handle_CrashInfo *crash_info, uint32_t pid); -/** - * # Safety - * The `crash_info` can be null, but if non-null it must point to a Builder made by this module, - * which has not previously been dropped. - * This function will: - */ -DDOG_CHECK_RETURN -struct ddog_VoidResult ddog_crasht_CrashInfo_enrich_callstacks(struct ddog_crasht_Handle_CrashInfo *crash_info, - uint32_t pid); - /** * # Safety * The `crash_info` can be null, but if non-null it must point to a Builder made by this module, diff --git a/components-rs/ddtrace.h b/components-rs/ddtrace.h index b6c283a280..e9f786a721 100644 --- a/components-rs/ddtrace.h +++ b/components-rs/ddtrace.h @@ -72,7 +72,7 @@ bool ddog_type_can_be_instrumented(const struct ddog_RemoteConfigState *remote_c bool ddog_global_log_probe_limiter_inc(const struct ddog_RemoteConfigState *remote_config); -struct ddog_Vec_CharSlice *ddog_CharSlice_to_owned(ddog_CharSlice str); +struct ddog_Vec_CChar *ddog_CharSlice_to_owned(ddog_CharSlice str); bool ddog_remote_configs_service_env_change(struct ddog_RemoteConfigState *remote_config, ddog_CharSlice service, diff --git a/components-rs/remote_config.rs b/components-rs/remote_config.rs index 44753082d1..75e97b019d 100644 --- a/components-rs/remote_config.rs +++ b/components-rs/remote_config.rs @@ -483,9 +483,8 @@ pub extern "C" fn ddog_global_log_probe_limiter_inc(remote_config: &RemoteConfig } #[no_mangle] -pub unsafe extern "C" fn ddog_CharSlice_to_owned(str: CharSlice) -> *mut ddcommon_ffi::Vec { - let std_vec: Vec = vec![str]; - Box::into_raw(Box::new(std_vec.into())) +pub unsafe extern "C" fn ddog_CharSlice_to_owned(str: CharSlice) -> *mut Vec { + Box::into_raw(Box::new(str.as_slice().into())) } #[no_mangle] From 3a39d8ea808064157f324a42739c0989b0784aac Mon Sep 17 00:00:00 2001 From: Alejandro Estringana Ruiz Date: Wed, 22 Oct 2025 12:47:25 +0200 Subject: [PATCH 34/53] Play defensive on Laravel Integration --- src/DDTrace/Integrations/Laravel/LaravelIntegration.php | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/DDTrace/Integrations/Laravel/LaravelIntegration.php b/src/DDTrace/Integrations/Laravel/LaravelIntegration.php index 11ef20ac30..9496a30d0f 100644 --- a/src/DDTrace/Integrations/Laravel/LaravelIntegration.php +++ b/src/DDTrace/Integrations/Laravel/LaravelIntegration.php @@ -146,10 +146,11 @@ static function ($This, $scope, $args, $route) { if (!\DDTrace\are_endpoints_collected()) { $routeCollection = $This->getRoutes(); foreach ($routeCollection as $value) { - $path = $value->uri(); - $methods = $value->methods(); - $resourceName = $methods[0] . ' ' . $path; - \DDTrace\add_endpoint($path, 'http.request', $resourceName, $methods[0]); + $path = method_exists($value, 'uri') ? $value->uri() : ''; + $methods = method_exists($value, 'methods') ? $value->methods() : []; + $method = isset($methods[0]) ? $methods[0] : ''; + $resourceName = $method . ' ' . $path; + \DDTrace\add_endpoint($path, 'http.request', $resourceName, $method); } } } From cd4f74b3de5c1b9c3a763de2bd4d8056cdd7d4b0 Mon Sep 17 00:00:00 2001 From: Alejandro Estringana Ruiz Date: Wed, 22 Oct 2025 13:29:51 +0200 Subject: [PATCH 35/53] Get routes from Symfony --- .../appsec/php/TelemetryHelpers.groovy | 8 +++--- .../php/integration/Symfony62Tests.groovy | 25 +++++++++++++++++++ .../Laravel/LaravelIntegration.php | 2 +- .../Symfony/SymfonyIntegration.php | 16 ++++++++++++ 4 files changed, 46 insertions(+), 5 deletions(-) diff --git a/appsec/tests/integration/src/main/groovy/com/datadog/appsec/php/TelemetryHelpers.groovy b/appsec/tests/integration/src/main/groovy/com/datadog/appsec/php/TelemetryHelpers.groovy index 5d06967004..85f768bab0 100644 --- a/appsec/tests/integration/src/main/groovy/com/datadog/appsec/php/TelemetryHelpers.groovy +++ b/appsec/tests/integration/src/main/groovy/com/datadog/appsec/php/TelemetryHelpers.groovy @@ -165,7 +165,7 @@ class TelemetryHelpers { } } - public static List waitForTelemetryData(AppSecContainer container, int timeoutSec, Closure cl, Class cls) { + public static List waitForTelemetryData(AppSecContainer container, int timeoutSec, Closure cl, Class cls, String path = '/hello.php') { List messages = [] def deadline = System.currentTimeSeconds() + timeoutSec def lastHttpReq = System.currentTimeSeconds() - 6 @@ -173,7 +173,7 @@ class TelemetryHelpers { if (System.currentTimeSeconds() - lastHttpReq > 5) { lastHttpReq = System.currentTimeSeconds() // used to flush global (not request-bound) telemetry metrics - def request = container.buildReq('/hello.php').GET().build() + def request = container.buildReq(path).GET().build() def trace = container.traceFromRequest(request, ofString()) { HttpResponse resp -> assert resp.body().size() > 0 } @@ -188,8 +188,8 @@ class TelemetryHelpers { messages } - public static List waitForAppEndpoints(AppSecContainer container, int timeoutSec, Closure cl) { - waitForTelemetryData(container, timeoutSec, cl, AppEndpoints) + public static List waitForAppEndpoints(AppSecContainer container, int timeoutSec, Closure cl, String path = '/') { + waitForTelemetryData(container, timeoutSec, cl, AppEndpoints, path) } public static List waitForMetrics(AppSecContainer container, int timeoutSec, Closure cl) { diff --git a/appsec/tests/integration/src/test/groovy/com/datadog/appsec/php/integration/Symfony62Tests.groovy b/appsec/tests/integration/src/test/groovy/com/datadog/appsec/php/integration/Symfony62Tests.groovy index 98b6cae496..cf895ab656 100644 --- a/appsec/tests/integration/src/test/groovy/com/datadog/appsec/php/integration/Symfony62Tests.groovy +++ b/appsec/tests/integration/src/test/groovy/com/datadog/appsec/php/integration/Symfony62Tests.groovy @@ -17,6 +17,7 @@ import java.net.http.HttpResponse import static com.datadog.appsec.php.integration.TestParams.getPhpVersion import static com.datadog.appsec.php.integration.TestParams.getVariant +import com.datadog.appsec.php.TelemetryHelpers import static java.net.http.HttpResponse.BodyHandlers.ofString @Testcontainers @@ -134,4 +135,28 @@ class Symfony62Tests { assert res.exitCode == 0 } } + + @Test + void 'Endpoints are sended'() { + def trace = container.traceFromRequest('/') { HttpResponse resp -> + assert resp.statusCode() == 200 + } + + assert trace.traceId != null + + List endpoints + + TelemetryHelpers.waitForAppEndpoints(container, 30, { List messages -> + endpoints = messages.collectMany { it.endpoints } + endpoints.size() > 0 + }) + + assert endpoints.size() == 6 + assert endpoints.find { it.path == '/' && it.method == 'GET' && it.operationName == 'http.request' && it.resourceName == 'GET /' } != null + assert endpoints.find { it.path == '/dynamic-path/{param01}' && it.method == 'GET' && it.operationName == 'http.request' && it.resourceName == 'GET /dynamic-path/{param01}' } != null + assert endpoints.find { it.path == '/login' && it.method == 'GET' && it.operationName == 'http.request' && it.resourceName == 'GET /login' } != null + assert endpoints.find { it.path == '/_error/{code}.{_format}' && it.method == 'GET' && it.operationName == 'http.request' && it.resourceName == 'GET /_error/{code}.{_format}' } != null + assert endpoints.find { it.path == '/register' && it.method == 'GET' && it.operationName == 'http.request' && it.resourceName == 'GET /register' } != null + assert endpoints.find { it.path == '/caminho-dinamico/{param01}' && it.method == 'GET' && it.operationName == 'http.request' && it.resourceName == 'GET /caminho-dinamico/{param01}' } != null + } } diff --git a/src/DDTrace/Integrations/Laravel/LaravelIntegration.php b/src/DDTrace/Integrations/Laravel/LaravelIntegration.php index 9496a30d0f..3319bcb33f 100644 --- a/src/DDTrace/Integrations/Laravel/LaravelIntegration.php +++ b/src/DDTrace/Integrations/Laravel/LaravelIntegration.php @@ -148,7 +148,7 @@ static function ($This, $scope, $args, $route) { foreach ($routeCollection as $value) { $path = method_exists($value, 'uri') ? $value->uri() : ''; $methods = method_exists($value, 'methods') ? $value->methods() : []; - $method = isset($methods[0]) ? $methods[0] : ''; + $method = isset($methods[0]) ? $methods[0] : 'GET'; $resourceName = $method . ' ' . $path; \DDTrace\add_endpoint($path, 'http.request', $resourceName, $method); } diff --git a/src/DDTrace/Integrations/Symfony/SymfonyIntegration.php b/src/DDTrace/Integrations/Symfony/SymfonyIntegration.php index 0d2221f4bd..8a47ca2f0e 100644 --- a/src/DDTrace/Integrations/Symfony/SymfonyIntegration.php +++ b/src/DDTrace/Integrations/Symfony/SymfonyIntegration.php @@ -502,6 +502,22 @@ static function(SpanData $span, $args, $response) use ($handle_http_route) { function_exists('datadog\appsec\push_addresses')) { \datadog\appsec\push_addresses(["server.request.path_params" => $parameters]); } + + if (!\DDTrace\are_endpoints_collected() && self::$kernel !== null) { + /** @var ContainerInterface $container */ + $container = self::$kernel->getContainer(); + /** @var \Symfony\Bundle\FrameworkBundle\Routing\Router $router */ + $router = $container->get('router'); + $routes = $router && $router->getRouteCollection() ? $router->getRouteCollection()->all() : []; + /** @var \Symfony\Component\Routing\Route $route */ + foreach ($routes as $route) { + $path = method_exists($route, 'getPath') ? $route->getPath() : ''; + $methods = method_exists($route, 'getMethods') ? $route->getMethods() : []; + $method = isset($methods[0]) ? $methods[0] : 'GET'; + $resourceName = $method . ' ' . $path; + \DDTrace\add_endpoint($path, 'http.request', $resourceName, $method); + } + } } ); } From 44fb838f9750cca0b0902be741b4c617039388cf Mon Sep 17 00:00:00 2001 From: Alejandro Estringana Ruiz Date: Wed, 22 Oct 2025 16:13:58 +0200 Subject: [PATCH 36/53] Amend issue with drupal --- src/DDTrace/Integrations/Symfony/SymfonyIntegration.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/DDTrace/Integrations/Symfony/SymfonyIntegration.php b/src/DDTrace/Integrations/Symfony/SymfonyIntegration.php index 8a47ca2f0e..f4b35d0178 100644 --- a/src/DDTrace/Integrations/Symfony/SymfonyIntegration.php +++ b/src/DDTrace/Integrations/Symfony/SymfonyIntegration.php @@ -503,7 +503,8 @@ function_exists('datadog\appsec\push_addresses')) { \datadog\appsec\push_addresses(["server.request.path_params" => $parameters]); } - if (!\DDTrace\are_endpoints_collected() && self::$kernel !== null) { + if (self::$frameworkPrefix === SymfonyIntegration::NAME && self::$kernel !== null && !\DDTrace\are_endpoints_collected()) + { /** @var ContainerInterface $container */ $container = self::$kernel->getContainer(); /** @var \Symfony\Bundle\FrameworkBundle\Routing\Router $router */ From 22e85764a016f1868a6d21aa9c2a1d948cdee300 Mon Sep 17 00:00:00 2001 From: Alejandro Estringana Ruiz Date: Fri, 24 Oct 2025 16:28:02 +0200 Subject: [PATCH 37/53] Add wordpress integration --- .../Integrations/WordPress/WordPressIntegration.php | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/DDTrace/Integrations/WordPress/WordPressIntegration.php b/src/DDTrace/Integrations/WordPress/WordPressIntegration.php index 73085a4754..49e1832d3c 100644 --- a/src/DDTrace/Integrations/WordPress/WordPressIntegration.php +++ b/src/DDTrace/Integrations/WordPress/WordPressIntegration.php @@ -35,6 +35,16 @@ public static function init(): int }); \DDTrace\hook_method('WP', 'main', null, function ($This, $scope, $args) { + if (class_exists('WP_Query') && !\DDTrace\are_endpoints_collected()) { + $args = array('post_type' => 'any', 'posts_per_page' => -1); + $query = new \WP_Query($args); + foreach ($query->posts as $post) { + $path = property_exists($post, 'guid') ? $post->guid : ''; + $method = 'GET'; + $resourceName = $method . ' ' . $path; + \DDTrace\add_endpoint($path, 'http.request', $resourceName, $method); + } + } if (\property_exists($This, 'did_permalink') && $This->did_permalink === true) { if ( function_exists('\datadog\appsec\push_addresses') && From bc496cbb99d34ddf1e1b783829fc0c88a46c6c6b Mon Sep 17 00:00:00 2001 From: Alejandro Estringana Ruiz Date: Fri, 24 Oct 2025 16:28:55 +0200 Subject: [PATCH 38/53] wip --- .../WordPress/V4_8/CommonScenariosTest.php | 68 ++++++++++++++++--- 1 file changed, 58 insertions(+), 10 deletions(-) diff --git a/tests/Integrations/WordPress/V4_8/CommonScenariosTest.php b/tests/Integrations/WordPress/V4_8/CommonScenariosTest.php index d91f47d2dd..d00f16ee30 100644 --- a/tests/Integrations/WordPress/V4_8/CommonScenariosTest.php +++ b/tests/Integrations/WordPress/V4_8/CommonScenariosTest.php @@ -30,9 +30,30 @@ protected static function getEnvs() 'DD_SERVICE' => 'wordpress_test_app', 'DD_TRACE_WORDPRESS_CALLBACKS' => '0', 'DD_TRACE_MYSQLI_ENABLED' => '0', + 'DD_TRACE_AGENT_PORT' => 80, + 'DD_AGENT_HOST' => 'request-replayer', + 'DD_INSTRUMENTATION_TELEMETRY_ENABLED' => 1, + 'DD_LOGS_INJECTION' => 'false', ]); } + private function readEndpointsTelemetry($response) + { + $telemetryPayloads = []; + foreach ($response as $request) { + if (strpos($request["uri"], "/telemetry/") === 0) { + $json = json_decode($request["body"], true); + $batch = $json["request_type"] == "message-batch" ? $json["payload"] : [$json]; + foreach ($batch as $innerJson) { + if (isset($innerJson["request_type"]) && $innerJson["request_type"] == "app-endpoints") { + $telemetryPayloads[] = $innerJson["payload"]["endpoints"]; + } + } + } + } + return $telemetryPayloads; + } + public static function getTestedLibrary() { return 'wordpress'; @@ -45,18 +66,45 @@ protected static function getTestedVersion($testedLibrary) public function testScenarioGetReturnString() { - if (\getenv('PHPUNIT_COVERAGE')) { - $this->markTestSkipped('Test is too flaky under coverage mode'); + var_dump("Alex 1"); + $this->call( + GetSpec::create( + 'A simple GET request returning a string', + '/simple?key=value&pwd=should_redact' + ) + ); + + usleep(600000); + $found_app_endpoints = false; + $until = function ($request) use (&$found_app_endpoints) { + if (strpos($request["body"] ?? "", "app-endpoints") !== false) { + $found_app_endpoints = true; + } + return $found_app_endpoints; + }; + $response = $this->retrieveDumpedData($until); + + var_dump("Alex 2"); + + $endpoints = $this->readEndpointsTelemetry($response); + $endpoints = isset($endpoints[0]) ? $endpoints[0] : []; + $this->assertCount(2, $endpoints); + + $first_endpoint = $endpoints[0]; + $second_endpoint = $endpoints[1]; + if ($first_endpoint['path'] !== 'http://localhost/?p=1') { + $first_endpoint = $endpoints[1]; + $second_endpoint = $endpoints[0]; } - $this->tracesFromWebRequestSnapshot(function () { - $this->call( - GetSpec::create( - 'A simple GET request returning a string', - '/simple?key=value&pwd=should_redact' - ) - ); - }); + $this->assertSame('http://localhost/?p=1', $first_endpoint['path']); + $this->assertSame('GET', $first_endpoint['method']); + $this->assertSame('http.request', $first_endpoint['operation_name']); + $this->assertSame('GET http://localhost/?p=1', $first_endpoint['resource_name']); + $this->assertSame('http://localhost/?page_id=2', $second_endpoint['path']); + $this->assertSame('GET', $second_endpoint['method']); + $this->assertSame('http.request', $second_endpoint['operation_name']); + $this->assertSame('GET http://localhost/?page_id=2', $second_endpoint['resource_name']); } public function testScenarioGetWithView() From e843dd3cdc5a079d7d9c3d8ea08cf123078e7823 Mon Sep 17 00:00:00 2001 From: Alejandro Estringana Ruiz Date: Tue, 28 Oct 2025 15:37:03 +0100 Subject: [PATCH 39/53] Test laravel --- .../WordPress/WordPressIntegration.php | 7 ++ .../Laravel/Version_10_x/routes/web.php | 4 + .../Laravel/Version_11_x/routes/web.php | 4 + .../Laravel/Version_4_2/app/routes.php | 4 + .../Laravel/Version_5_7/routes/web.php | 4 + .../Laravel/Version_5_8/routes/web.php | 4 + .../Laravel/Version_8_x/routes/web.php | 5 ++ .../Laravel/Version_9_x/routes/web.php | 4 + .../Laravel/V10_x/TelemetryTest.php | 13 +++ .../Laravel/V11_x/TelemetryTest.php | 13 +++ .../Integrations/Laravel/V4/TelemetryTest.php | 79 +++++++++++++++++++ .../Laravel/V5_7/TelemetryTest.php | 79 +++++++++++++++++++ .../Laravel/V5_8/TelemetryTest.php | 13 +++ .../Laravel/V8_x/TelemetryTest.php | 13 +++ .../Laravel/V9_x/TelemetryTest.php | 13 +++ 15 files changed, 259 insertions(+) create mode 100644 tests/Integrations/Laravel/V10_x/TelemetryTest.php create mode 100644 tests/Integrations/Laravel/V11_x/TelemetryTest.php create mode 100644 tests/Integrations/Laravel/V4/TelemetryTest.php create mode 100644 tests/Integrations/Laravel/V5_7/TelemetryTest.php create mode 100644 tests/Integrations/Laravel/V5_8/TelemetryTest.php create mode 100644 tests/Integrations/Laravel/V8_x/TelemetryTest.php create mode 100644 tests/Integrations/Laravel/V9_x/TelemetryTest.php diff --git a/src/DDTrace/Integrations/WordPress/WordPressIntegration.php b/src/DDTrace/Integrations/WordPress/WordPressIntegration.php index 49e1832d3c..40d7d3cc81 100644 --- a/src/DDTrace/Integrations/WordPress/WordPressIntegration.php +++ b/src/DDTrace/Integrations/WordPress/WordPressIntegration.php @@ -40,6 +40,13 @@ public static function init(): int $query = new \WP_Query($args); foreach ($query->posts as $post) { $path = property_exists($post, 'guid') ? $post->guid : ''; + $parsed = parse_url($path); + if (isset($parsed['path'])) { + $path = $parsed['path']; + } + if (isset($parsed['query'])) { + $path .= '?' . $parsed['query']; + } $method = 'GET'; $resourceName = $method . ' ' . $path; \DDTrace\add_endpoint($path, 'http.request', $resourceName, $method); diff --git a/tests/Frameworks/Laravel/Version_10_x/routes/web.php b/tests/Frameworks/Laravel/Version_10_x/routes/web.php index 3549b31c42..596d13d049 100644 --- a/tests/Frameworks/Laravel/Version_10_x/routes/web.php +++ b/tests/Frameworks/Laravel/Version_10_x/routes/web.php @@ -24,3 +24,7 @@ Route::get('login/signup', [LoginTestController::class, 'register']); Route::get('/behind_auth', [LoginTestController::class, 'behind_auth'])->name('behind_auth')->middleware('auth'); Route::get('rasp', [RaspTestController::class, 'rasp']); +Route::get('/telemetry', function () { + dd_trace_internal_fn("finalize_telemetry"); + return response('Done'); +}); \ No newline at end of file diff --git a/tests/Frameworks/Laravel/Version_11_x/routes/web.php b/tests/Frameworks/Laravel/Version_11_x/routes/web.php index 19af850864..802b6c0003 100644 --- a/tests/Frameworks/Laravel/Version_11_x/routes/web.php +++ b/tests/Frameworks/Laravel/Version_11_x/routes/web.php @@ -8,3 +8,7 @@ Route::get('simple_view', [CommonSpecsController::class, 'simple_view']); Route::get('error', [CommonSpecsController::class, 'error']); Route::get('rasp', [RaspTestController::class, 'rasp']); +Route::get('/telemetry', function () { + dd_trace_internal_fn("finalize_telemetry"); + return response('Done'); +}); \ No newline at end of file diff --git a/tests/Frameworks/Laravel/Version_4_2/app/routes.php b/tests/Frameworks/Laravel/Version_4_2/app/routes.php index 9892d2c82d..9a2550a00a 100644 --- a/tests/Frameworks/Laravel/Version_4_2/app/routes.php +++ b/tests/Frameworks/Laravel/Version_4_2/app/routes.php @@ -28,3 +28,7 @@ Route::get('/behind_auth', 'LoginTestController@behind_auth'); }); Route::get('rasp', 'RaspTestController@rasp'); +Route::get('/telemetry', function () { + dd_trace_internal_fn("finalize_telemetry"); + return response('Done'); +}); \ No newline at end of file diff --git a/tests/Frameworks/Laravel/Version_5_7/routes/web.php b/tests/Frameworks/Laravel/Version_5_7/routes/web.php index 8a37bf8029..3cfc2c4ec9 100644 --- a/tests/Frameworks/Laravel/Version_5_7/routes/web.php +++ b/tests/Frameworks/Laravel/Version_5_7/routes/web.php @@ -32,3 +32,7 @@ Route::get('login/signup', 'LoginTestController@register'); Route::get('/behind_auth', 'LoginTestController@behind_auth')->middleware('auth'); Route::get('rasp', 'RaspTestController@rasp'); +Route::get('/telemetry', function () { + dd_trace_internal_fn("finalize_telemetry"); + return response('Done'); +}); diff --git a/tests/Frameworks/Laravel/Version_5_8/routes/web.php b/tests/Frameworks/Laravel/Version_5_8/routes/web.php index a24331bb8e..b03d393e37 100644 --- a/tests/Frameworks/Laravel/Version_5_8/routes/web.php +++ b/tests/Frameworks/Laravel/Version_5_8/routes/web.php @@ -29,3 +29,7 @@ Route::get('login/signup', 'LoginTestController@register'); Route::get('/behind_auth', 'LoginTestController@behind_auth')->middleware('auth'); Route::get('rasp', 'RaspTestController@rasp'); +Route::get('/telemetry', function () { + dd_trace_internal_fn("finalize_telemetry"); + return response('Done'); +}); diff --git a/tests/Frameworks/Laravel/Version_8_x/routes/web.php b/tests/Frameworks/Laravel/Version_8_x/routes/web.php index cec6fdcff4..b817b4f081 100644 --- a/tests/Frameworks/Laravel/Version_8_x/routes/web.php +++ b/tests/Frameworks/Laravel/Version_8_x/routes/web.php @@ -43,5 +43,10 @@ Route::get('/behind_auth', [LoginTestController::class, 'behind_auth'])->name('behind_auth')->middleware('auth'); Route::get('rasp', [RaspTestController::class, 'rasp']); +Route::get('/telemetry', function () { + dd_trace_internal_fn("finalize_telemetry"); + return response('Done'); +}); + // This route has to remain unnamed so we test both route cached and not cached. Route::get('/unnamed-route', [RouteCachingController::class, 'unnamed']); diff --git a/tests/Frameworks/Laravel/Version_9_x/routes/web.php b/tests/Frameworks/Laravel/Version_9_x/routes/web.php index 042d4d6652..46f515ae11 100644 --- a/tests/Frameworks/Laravel/Version_9_x/routes/web.php +++ b/tests/Frameworks/Laravel/Version_9_x/routes/web.php @@ -23,3 +23,7 @@ Route::get('login/signup', [LoginTestController::class, 'register']); Route::get('/behind_auth', [LoginTestController::class, 'behind_auth'])->name('behind_auth')->middleware('auth'); Route::get('rasp', [RaspTestController::class, 'rasp']); +Route::get('/telemetry', function () { + dd_trace_internal_fn("finalize_telemetry"); + return response('Done'); +}); \ No newline at end of file diff --git a/tests/Integrations/Laravel/V10_x/TelemetryTest.php b/tests/Integrations/Laravel/V10_x/TelemetryTest.php new file mode 100644 index 0000000000..89d08d24ed --- /dev/null +++ b/tests/Integrations/Laravel/V10_x/TelemetryTest.php @@ -0,0 +1,13 @@ + 'laravel_test_app', + 'DD_SERVICE' => 'laravel_test_app', + 'DD_TRACE_AGENT_PORT' => 80, + 'DD_AGENT_HOST' => 'request-replayer', + 'DD_INSTRUMENTATION_TELEMETRY_ENABLED' => 1, + ]); + } + + public static function getTestedLibrary() + { + return 'laravel/framework'; + } + + private function readTelemetryPayloads($response) + { + $telemetryPayloads = []; + foreach ($response as $request) { + if (strpos($request["uri"], "/telemetry/") === 0) { + $json = json_decode($request["body"], true); + $batch = $json["request_type"] == "message-batch" ? $json["payload"] : [$json]; + foreach ($batch as $innerJson) { + if (isset($json["application"])) { + $innerJson["application"] = $json["application"]; + } + $telemetryPayloads[] = $innerJson; + } + } + } + + // Filter the payloads from the trace background sender + return array_values($telemetryPayloads); + } + + public function testAppEndpointsAreSent() + { + if (extension_loaded('xdebug')) { + $this->markTestSkipped('Xdebug extension is loaded'); + } + + $this->resetRequestDumper(); + + $this->call(GetSpec::create("autoloaded", "/telemetry")); + usleep(500000); + $response = $this->retrieveDumpedData($this->untilTelemetryRequest("app-endpoints"), true); + $payloads = $this->readTelemetryPayloads($response); + $endpointsPayloads = array_values(array_filter($payloads, function ($p) { return $p["request_type"] == "app-endpoints"; })); + + $this->assertCount(1, $endpointsPayloads); + + $endpointsPayload = $endpointsPayloads[0]; + $endpoints = $endpointsPayload["payload"]["endpoints"]; + $this->assertGreaterThan(0, $endpoints); + foreach ($endpoints as $endpoint) { + $this->assertNotEmpty($endpoint["path"]); + $this->assertNotEmpty($endpoint["method"]); + $this->assertEquals("http.request", $endpoint["operation_name"]); + $this->assertEquals($endpoint["method"] . " " . $endpoint["path"], $endpoint["resource_name"]); + } + } +} \ No newline at end of file diff --git a/tests/Integrations/Laravel/V5_7/TelemetryTest.php b/tests/Integrations/Laravel/V5_7/TelemetryTest.php new file mode 100644 index 0000000000..afa4d978dd --- /dev/null +++ b/tests/Integrations/Laravel/V5_7/TelemetryTest.php @@ -0,0 +1,79 @@ + 'laravel_test_app', + 'DD_SERVICE' => 'laravel_test_app', + 'DD_TRACE_AGENT_PORT' => 80, + 'DD_AGENT_HOST' => 'request-replayer', + 'DD_INSTRUMENTATION_TELEMETRY_ENABLED' => 1, + ]); + } + + public static function getTestedLibrary() + { + return 'laravel/framework'; + } + + private function readTelemetryPayloads($response) + { + $telemetryPayloads = []; + foreach ($response as $request) { + if (strpos($request["uri"], "/telemetry/") === 0) { + $json = json_decode($request["body"], true); + $batch = $json["request_type"] == "message-batch" ? $json["payload"] : [$json]; + foreach ($batch as $innerJson) { + if (isset($json["application"])) { + $innerJson["application"] = $json["application"]; + } + $telemetryPayloads[] = $innerJson; + } + } + } + + // Filter the payloads from the trace background sender + return array_values($telemetryPayloads); + } + + public function testAppEndpointsAreSent() + { + if (extension_loaded('xdebug')) { + $this->markTestSkipped('Xdebug extension is loaded'); + } + + $this->resetRequestDumper(); + + $this->call(GetSpec::create("autoloaded", "/telemetry")); + usleep(500000); + $response = $this->retrieveDumpedData($this->untilTelemetryRequest("app-endpoints"), true); + $payloads = $this->readTelemetryPayloads($response); + $endpointsPayloads = array_values(array_filter($payloads, function ($p) { return $p["request_type"] == "app-endpoints"; })); + + $this->assertCount(1, $endpointsPayloads); + + $endpointsPayload = $endpointsPayloads[0]; + $endpoints = $endpointsPayload["payload"]["endpoints"]; + $this->assertGreaterThan(0, $endpoints); + foreach ($endpoints as $endpoint) { + $this->assertNotEmpty($endpoint["path"]); + $this->assertNotEmpty($endpoint["method"]); + $this->assertEquals("http.request", $endpoint["operation_name"]); + $this->assertEquals($endpoint["method"] . " " . $endpoint["path"], $endpoint["resource_name"]); + } + } +} \ No newline at end of file diff --git a/tests/Integrations/Laravel/V5_8/TelemetryTest.php b/tests/Integrations/Laravel/V5_8/TelemetryTest.php new file mode 100644 index 0000000000..402a7d41ee --- /dev/null +++ b/tests/Integrations/Laravel/V5_8/TelemetryTest.php @@ -0,0 +1,13 @@ + Date: Tue, 28 Oct 2025 17:31:34 +0100 Subject: [PATCH 40/53] Test symfony --- .../Symfony/SymfonyIntegration.php | 36 ++++----- .../Controller/CommonScenariosController.php | 9 +++ .../Controller/CommonScenariosController.php | 9 +++ .../Controller/CommonScenariosController.php | 9 +++ .../Controller/CommonScenariosController.php | 9 +++ .../Controller/CommonScenariosController.php | 9 +++ .../Controller/CommonScenariosController.php | 9 +++ .../Controller/CommonScenariosController.php | 9 +++ .../Controller/CommonScenariosController.php | 9 +++ .../Controller/CommonScenariosController.php | 9 +++ .../Controller/CommonScenariosController.php | 9 +++ .../Controller/CommonScenariosController.php | 10 +++ .../Controller/CommonScenariosController.php | 9 +++ .../Controller/CommonScenariosController.php | 9 +++ .../Symfony/Latest/TelemetryTest.php | 79 +++++++++++++++++++ .../Symfony/V2_3/TelemetryTest.php | 79 +++++++++++++++++++ .../Symfony/V2_8/TelemetryTest.php | 79 +++++++++++++++++++ .../Symfony/V3_0/TelemetryTest.php | 79 +++++++++++++++++++ .../Symfony/V3_3/TelemetryTest.php | 79 +++++++++++++++++++ .../Symfony/V3_4/TelemetryTest.php | 79 +++++++++++++++++++ .../Symfony/V4_0/TelemetryTest.php | 79 +++++++++++++++++++ .../Symfony/V4_2/TelemetryTest.php | 79 +++++++++++++++++++ .../Symfony/V4_4/TelemetryTest.php | 79 +++++++++++++++++++ .../Symfony/V5_0/TelemetryTest.php | 79 +++++++++++++++++++ .../Symfony/V5_1/TelemetryTest.php | 79 +++++++++++++++++++ .../Symfony/V5_2/TelemetryTest.php | 79 +++++++++++++++++++ .../Symfony/V6_2/TelemetryTest.php | 79 +++++++++++++++++++ 27 files changed, 1163 insertions(+), 18 deletions(-) create mode 100644 tests/Integrations/Symfony/Latest/TelemetryTest.php create mode 100644 tests/Integrations/Symfony/V2_3/TelemetryTest.php create mode 100644 tests/Integrations/Symfony/V2_8/TelemetryTest.php create mode 100644 tests/Integrations/Symfony/V3_0/TelemetryTest.php create mode 100644 tests/Integrations/Symfony/V3_3/TelemetryTest.php create mode 100644 tests/Integrations/Symfony/V3_4/TelemetryTest.php create mode 100644 tests/Integrations/Symfony/V4_0/TelemetryTest.php create mode 100644 tests/Integrations/Symfony/V4_2/TelemetryTest.php create mode 100644 tests/Integrations/Symfony/V4_4/TelemetryTest.php create mode 100644 tests/Integrations/Symfony/V5_0/TelemetryTest.php create mode 100644 tests/Integrations/Symfony/V5_1/TelemetryTest.php create mode 100644 tests/Integrations/Symfony/V5_2/TelemetryTest.php create mode 100644 tests/Integrations/Symfony/V6_2/TelemetryTest.php diff --git a/src/DDTrace/Integrations/Symfony/SymfonyIntegration.php b/src/DDTrace/Integrations/Symfony/SymfonyIntegration.php index f4b35d0178..6a972265ad 100644 --- a/src/DDTrace/Integrations/Symfony/SymfonyIntegration.php +++ b/src/DDTrace/Integrations/Symfony/SymfonyIntegration.php @@ -78,7 +78,7 @@ public static function init(): int $span->resource = \get_class($this); $span->type = Type::WEB_SERVLET; $span->service = \ddtrace_config_app_name('symfony'); - $span->meta[Tag::COMPONENT] = SymfonyIntegration::NAME; + $span->meta[Tag::COMPONENT] = SymfonyIntegration::NAME; }, ] ); @@ -502,23 +502,6 @@ static function(SpanData $span, $args, $response) use ($handle_http_route) { function_exists('datadog\appsec\push_addresses')) { \datadog\appsec\push_addresses(["server.request.path_params" => $parameters]); } - - if (self::$frameworkPrefix === SymfonyIntegration::NAME && self::$kernel !== null && !\DDTrace\are_endpoints_collected()) - { - /** @var ContainerInterface $container */ - $container = self::$kernel->getContainer(); - /** @var \Symfony\Bundle\FrameworkBundle\Routing\Router $router */ - $router = $container->get('router'); - $routes = $router && $router->getRouteCollection() ? $router->getRouteCollection()->all() : []; - /** @var \Symfony\Component\Routing\Route $route */ - foreach ($routes as $route) { - $path = method_exists($route, 'getPath') ? $route->getPath() : ''; - $methods = method_exists($route, 'getMethods') ? $route->getMethods() : []; - $method = isset($methods[0]) ? $methods[0] : 'GET'; - $resourceName = $method . ' ' . $path; - \DDTrace\add_endpoint($path, 'http.request', $resourceName, $method); - } - } } ); } @@ -605,6 +588,23 @@ static function(HookData $hook) use ($controllerName) { $injectedActionInfo = true; } } + + if (self::$frameworkPrefix === SymfonyIntegration::NAME && self::$kernel !== null && !\DDTrace\are_endpoints_collected()) + { + /** @var ContainerInterface $container */ + $container = self::$kernel->getContainer(); + /** @var \Symfony\Bundle\FrameworkBundle\Routing\Router $router */ + $router = $container->get('router'); + $routes = $router && $router->getRouteCollection() ? $router->getRouteCollection()->all() : []; + /** @var \Symfony\Component\Routing\Route $route */ + foreach ($routes as $route) { + $path = method_exists($route, 'getPath') ? $route->getPath() : ''; + $methods = method_exists($route, 'getMethods') ? $route->getMethods() : []; + $method = isset($methods[0]) ? $methods[0] : 'GET'; + $resourceName = $method . ' ' . $path; + \DDTrace\add_endpoint($path, 'http.request', $resourceName, $method); + } + } } ]; \DDTrace\trace_method( diff --git a/tests/Frameworks/Symfony/Latest/src/Controller/CommonScenariosController.php b/tests/Frameworks/Symfony/Latest/src/Controller/CommonScenariosController.php index 9e98572698..ac52790ff3 100644 --- a/tests/Frameworks/Symfony/Latest/src/Controller/CommonScenariosController.php +++ b/tests/Frameworks/Symfony/Latest/src/Controller/CommonScenariosController.php @@ -39,4 +39,13 @@ public function behindAuthAction(Request $request) // replace this example code with whatever you need return new Response('Hi!'); } + + /** + * @Route("/telemetry", name="telemetry") + */ + public function telemetryAction(Request $request) + { + dd_trace_internal_fn("finalize_telemetry"); + return new Response('Done'); + } } diff --git a/tests/Frameworks/Symfony/Version_2_3/src/AppBundle/Controller/CommonScenariosController.php b/tests/Frameworks/Symfony/Version_2_3/src/AppBundle/Controller/CommonScenariosController.php index 52cb335465..4f77d888f3 100644 --- a/tests/Frameworks/Symfony/Version_2_3/src/AppBundle/Controller/CommonScenariosController.php +++ b/tests/Frameworks/Symfony/Version_2_3/src/AppBundle/Controller/CommonScenariosController.php @@ -48,4 +48,13 @@ public function behindAuthAction(Request $request) // replace this example code with whatever you need return new Response('Hi!'); } + + /** + * @Route("/telemetry", name="telemetry") + */ + public function telemetryAction(Request $request) + { + dd_trace_internal_fn("finalize_telemetry"); + return new Response('Done'); + } } diff --git a/tests/Frameworks/Symfony/Version_2_8/src/AppBundle/Controller/CommonScenariosController.php b/tests/Frameworks/Symfony/Version_2_8/src/AppBundle/Controller/CommonScenariosController.php index 05712d989b..6d4f444c65 100644 --- a/tests/Frameworks/Symfony/Version_2_8/src/AppBundle/Controller/CommonScenariosController.php +++ b/tests/Frameworks/Symfony/Version_2_8/src/AppBundle/Controller/CommonScenariosController.php @@ -48,4 +48,13 @@ public function behindAuthAction(Request $request) // replace this example code with whatever you need return new Response('Hi!'); } + + /** + * @Route("/telemetry", name="telemetry") + */ + public function telemetryAction(Request $request) + { + dd_trace_internal_fn("finalize_telemetry"); + return new Response('Done'); + } } diff --git a/tests/Frameworks/Symfony/Version_3_0/src/AppBundle/Controller/CommonScenariosController.php b/tests/Frameworks/Symfony/Version_3_0/src/AppBundle/Controller/CommonScenariosController.php index 05712d989b..302038deb9 100644 --- a/tests/Frameworks/Symfony/Version_3_0/src/AppBundle/Controller/CommonScenariosController.php +++ b/tests/Frameworks/Symfony/Version_3_0/src/AppBundle/Controller/CommonScenariosController.php @@ -48,4 +48,13 @@ public function behindAuthAction(Request $request) // replace this example code with whatever you need return new Response('Hi!'); } + + /** + * @Route("/telemetry", name="telemetry") + */ + public function telemetryAction(Request $request) + { + dd_trace_internal_fn("finalize_telemetry"); + return new Response('Done'); + } } diff --git a/tests/Frameworks/Symfony/Version_3_3/src/AppBundle/Controller/CommonScenariosController.php b/tests/Frameworks/Symfony/Version_3_3/src/AppBundle/Controller/CommonScenariosController.php index aa28320216..e26821838b 100644 --- a/tests/Frameworks/Symfony/Version_3_3/src/AppBundle/Controller/CommonScenariosController.php +++ b/tests/Frameworks/Symfony/Version_3_3/src/AppBundle/Controller/CommonScenariosController.php @@ -58,4 +58,13 @@ public function behindAuthAction(Request $request) // replace this example code with whatever you need return new Response('Hi!'); } + + /** + * @Route("/telemetry", name="telemetry") + */ + public function telemetryAction(Request $request) + { + dd_trace_internal_fn("finalize_telemetry"); + return new Response('Done'); + } } diff --git a/tests/Frameworks/Symfony/Version_3_4/src/AppBundle/Controller/CommonScenariosController.php b/tests/Frameworks/Symfony/Version_3_4/src/AppBundle/Controller/CommonScenariosController.php index 5a2d4db316..e631d603ff 100644 --- a/tests/Frameworks/Symfony/Version_3_4/src/AppBundle/Controller/CommonScenariosController.php +++ b/tests/Frameworks/Symfony/Version_3_4/src/AppBundle/Controller/CommonScenariosController.php @@ -48,4 +48,13 @@ public function behindAuthAction(Request $request) // replace this example code with whatever you need return new Response('Hi!'); } + + /** + * @Route("/telemetry", name="telemetry") + */ + public function telemetryAction(Request $request) + { + dd_trace_internal_fn("finalize_telemetry"); + return new Response('Done'); + } } diff --git a/tests/Frameworks/Symfony/Version_4_0/src/Controller/CommonScenariosController.php b/tests/Frameworks/Symfony/Version_4_0/src/Controller/CommonScenariosController.php index b040ae56cd..bbecd43628 100644 --- a/tests/Frameworks/Symfony/Version_4_0/src/Controller/CommonScenariosController.php +++ b/tests/Frameworks/Symfony/Version_4_0/src/Controller/CommonScenariosController.php @@ -44,4 +44,13 @@ public function behindAuthAction(Request $request) // replace this example code with whatever you need return new Response('Hi!'); } + + /** + * @Route("/telemetry", name="telemetry") + */ + public function telemetryAction(Request $request) + { + dd_trace_internal_fn("finalize_telemetry"); + return new Response('Done'); + } } diff --git a/tests/Frameworks/Symfony/Version_4_2/src/Controller/CommonScenariosController.php b/tests/Frameworks/Symfony/Version_4_2/src/Controller/CommonScenariosController.php index 0068cb8a01..2c24406f45 100644 --- a/tests/Frameworks/Symfony/Version_4_2/src/Controller/CommonScenariosController.php +++ b/tests/Frameworks/Symfony/Version_4_2/src/Controller/CommonScenariosController.php @@ -48,4 +48,13 @@ public function behindAuthAction(Request $request) // replace this example code with whatever you need return new Response('Hi!'); } + + /** + * @Route("/telemetry", name="telemetry") + */ + public function telemetryAction(Request $request) + { + dd_trace_internal_fn("finalize_telemetry"); + return new Response('Done'); + } } diff --git a/tests/Frameworks/Symfony/Version_4_4/src/Controller/CommonScenariosController.php b/tests/Frameworks/Symfony/Version_4_4/src/Controller/CommonScenariosController.php index 70f0d74f8a..cfa276beec 100644 --- a/tests/Frameworks/Symfony/Version_4_4/src/Controller/CommonScenariosController.php +++ b/tests/Frameworks/Symfony/Version_4_4/src/Controller/CommonScenariosController.php @@ -58,4 +58,13 @@ public function behindAuthAction(Request $request) // replace this example code with whatever you need return new Response('Hi!'); } + + /** + * @Route("/telemetry", name="telemetry") + */ + public function telemetryAction(Request $request) + { + dd_trace_internal_fn("finalize_telemetry"); + return new Response('Done'); + } } diff --git a/tests/Frameworks/Symfony/Version_5_0/src/Controller/CommonScenariosController.php b/tests/Frameworks/Symfony/Version_5_0/src/Controller/CommonScenariosController.php index 0068cb8a01..2c24406f45 100644 --- a/tests/Frameworks/Symfony/Version_5_0/src/Controller/CommonScenariosController.php +++ b/tests/Frameworks/Symfony/Version_5_0/src/Controller/CommonScenariosController.php @@ -48,4 +48,13 @@ public function behindAuthAction(Request $request) // replace this example code with whatever you need return new Response('Hi!'); } + + /** + * @Route("/telemetry", name="telemetry") + */ + public function telemetryAction(Request $request) + { + dd_trace_internal_fn("finalize_telemetry"); + return new Response('Done'); + } } diff --git a/tests/Frameworks/Symfony/Version_5_1/src/Controller/CommonScenariosController.php b/tests/Frameworks/Symfony/Version_5_1/src/Controller/CommonScenariosController.php index 4a6cb21fa7..a919f8bb3c 100644 --- a/tests/Frameworks/Symfony/Version_5_1/src/Controller/CommonScenariosController.php +++ b/tests/Frameworks/Symfony/Version_5_1/src/Controller/CommonScenariosController.php @@ -45,4 +45,14 @@ public function behindAuthAction(Request $request) // replace this example code with whatever you need return new Response('Hi!'); } + + + /** + * @Route("/telemetry", name="telemetry") + */ + public function telemetryAction(Request $request) + { + dd_trace_internal_fn("finalize_telemetry"); + return new Response('Done'); + } } diff --git a/tests/Frameworks/Symfony/Version_5_2/src/Controller/CommonScenariosController.php b/tests/Frameworks/Symfony/Version_5_2/src/Controller/CommonScenariosController.php index 70f0d74f8a..cfa276beec 100644 --- a/tests/Frameworks/Symfony/Version_5_2/src/Controller/CommonScenariosController.php +++ b/tests/Frameworks/Symfony/Version_5_2/src/Controller/CommonScenariosController.php @@ -58,4 +58,13 @@ public function behindAuthAction(Request $request) // replace this example code with whatever you need return new Response('Hi!'); } + + /** + * @Route("/telemetry", name="telemetry") + */ + public function telemetryAction(Request $request) + { + dd_trace_internal_fn("finalize_telemetry"); + return new Response('Done'); + } } diff --git a/tests/Frameworks/Symfony/Version_6_2/src/Controller/CommonScenariosController.php b/tests/Frameworks/Symfony/Version_6_2/src/Controller/CommonScenariosController.php index 3abff31461..48ede0d491 100644 --- a/tests/Frameworks/Symfony/Version_6_2/src/Controller/CommonScenariosController.php +++ b/tests/Frameworks/Symfony/Version_6_2/src/Controller/CommonScenariosController.php @@ -54,4 +54,13 @@ public function behindAuthAction(Request $request) // replace this example code with whatever you need return new Response('Hi!'); } + + /** + * @Route("/telemetry", name="telemetry") + */ + public function telemetryAction(Request $request) + { + dd_trace_internal_fn("finalize_telemetry"); + return new Response('Done'); + } } diff --git a/tests/Integrations/Symfony/Latest/TelemetryTest.php b/tests/Integrations/Symfony/Latest/TelemetryTest.php new file mode 100644 index 0000000000..f962be19a9 --- /dev/null +++ b/tests/Integrations/Symfony/Latest/TelemetryTest.php @@ -0,0 +1,79 @@ + 'laravel_test_app', + 'DD_TRACE_DEBUG' => 'true', + 'DD_SERVICE' => 'test_symfony_latest', + 'DD_TRACE_AGENT_PORT' => 80, + 'DD_AGENT_HOST' => 'request-replayer', + 'DD_INSTRUMENTATION_TELEMETRY_ENABLED' => 1, + ]); + } + + private function readTelemetryPayloads($response) + { + $telemetryPayloads = []; + foreach ($response as $request) { + if (strpos($request["uri"], "/telemetry/") === 0) { + $json = json_decode($request["body"], true); + $batch = $json["request_type"] == "message-batch" ? $json["payload"] : [$json]; + foreach ($batch as $innerJson) { + if (isset($json["application"])) { + $innerJson["application"] = $json["application"]; + } + $telemetryPayloads[] = $innerJson; + } + } + } + + // Filter the payloads from the trace background sender + return array_values($telemetryPayloads); + } + + public function testAppEndpointsAreSent() + { + if (extension_loaded('xdebug')) { + $this->markTestSkipped('Xdebug extension is loaded'); + } + + $this->resetRequestDumper(); + + $this->call(GetSpec::create("telemetry", "/telemetry")); + usleep(500000); + $response = $this->retrieveDumpedData($this->untilTelemetryRequest("app-endpoints"), true); + $payloads = $this->readTelemetryPayloads($response); + $endpointsPayloads = array_values(array_filter($payloads, function ($p) { return $p["request_type"] == "app-endpoints"; })); + + $this->assertCount(1, $endpointsPayloads); + + $endpointsPayload = $endpointsPayloads[0]; + $endpoints = $endpointsPayload["payload"]["endpoints"]; + $this->assertGreaterThan(0, $endpoints); + foreach ($endpoints as $endpoint) { + $this->assertNotEmpty($endpoint["path"]); + $this->assertNotEmpty($endpoint["method"]); + $this->assertEquals("http.request", $endpoint["operation_name"]); + $this->assertEquals($endpoint["method"] . " " . $endpoint["path"], $endpoint["resource_name"]); + } + } +} diff --git a/tests/Integrations/Symfony/V2_3/TelemetryTest.php b/tests/Integrations/Symfony/V2_3/TelemetryTest.php new file mode 100644 index 0000000000..f216bd838a --- /dev/null +++ b/tests/Integrations/Symfony/V2_3/TelemetryTest.php @@ -0,0 +1,79 @@ + 'laravel_test_app', + 'DD_TRACE_DEBUG' => 'true', + 'DD_SERVICE' => 'test_symfony_23', + 'DD_TRACE_AGENT_PORT' => 80, + 'DD_AGENT_HOST' => 'request-replayer', + 'DD_INSTRUMENTATION_TELEMETRY_ENABLED' => 1, + ]); + } + + private function readTelemetryPayloads($response) + { + $telemetryPayloads = []; + foreach ($response as $request) { + if (strpos($request["uri"], "/telemetry/") === 0) { + $json = json_decode($request["body"], true); + $batch = $json["request_type"] == "message-batch" ? $json["payload"] : [$json]; + foreach ($batch as $innerJson) { + if (isset($json["application"])) { + $innerJson["application"] = $json["application"]; + } + $telemetryPayloads[] = $innerJson; + } + } + } + + // Filter the payloads from the trace background sender + return array_values($telemetryPayloads); + } + + public function testAppEndpointsAreSent() + { + if (extension_loaded('xdebug')) { + $this->markTestSkipped('Xdebug extension is loaded'); + } + + $this->resetRequestDumper(); + + $this->call(GetSpec::create("telemetry", "/telemetry")); + usleep(500000); + $response = $this->retrieveDumpedData($this->untilTelemetryRequest("app-endpoints"), true); + $payloads = $this->readTelemetryPayloads($response); + $endpointsPayloads = array_values(array_filter($payloads, function ($p) { return $p["request_type"] == "app-endpoints"; })); + + $this->assertCount(1, $endpointsPayloads); + + $endpointsPayload = $endpointsPayloads[0]; + $endpoints = $endpointsPayload["payload"]["endpoints"]; + $this->assertGreaterThan(0, $endpoints); + foreach ($endpoints as $endpoint) { + $this->assertNotEmpty($endpoint["path"]); + $this->assertNotEmpty($endpoint["method"]); + $this->assertEquals("http.request", $endpoint["operation_name"]); + $this->assertEquals($endpoint["method"] . " " . $endpoint["path"], $endpoint["resource_name"]); + } + } +} diff --git a/tests/Integrations/Symfony/V2_8/TelemetryTest.php b/tests/Integrations/Symfony/V2_8/TelemetryTest.php new file mode 100644 index 0000000000..aaf0416fc7 --- /dev/null +++ b/tests/Integrations/Symfony/V2_8/TelemetryTest.php @@ -0,0 +1,79 @@ + 'laravel_test_app', + 'DD_TRACE_DEBUG' => 'true', + 'DD_SERVICE' => 'test_symfony_28', + 'DD_TRACE_AGENT_PORT' => 80, + 'DD_AGENT_HOST' => 'request-replayer', + 'DD_INSTRUMENTATION_TELEMETRY_ENABLED' => 1, + ]); + } + + private function readTelemetryPayloads($response) + { + $telemetryPayloads = []; + foreach ($response as $request) { + if (strpos($request["uri"], "/telemetry/") === 0) { + $json = json_decode($request["body"], true); + $batch = $json["request_type"] == "message-batch" ? $json["payload"] : [$json]; + foreach ($batch as $innerJson) { + if (isset($json["application"])) { + $innerJson["application"] = $json["application"]; + } + $telemetryPayloads[] = $innerJson; + } + } + } + + // Filter the payloads from the trace background sender + return array_values($telemetryPayloads); + } + + public function testAppEndpointsAreSent() + { + if (extension_loaded('xdebug')) { + $this->markTestSkipped('Xdebug extension is loaded'); + } + + $this->resetRequestDumper(); + + $this->call(GetSpec::create("telemetry", "/telemetry")); + usleep(500000); + $response = $this->retrieveDumpedData($this->untilTelemetryRequest("app-endpoints"), true); + $payloads = $this->readTelemetryPayloads($response); + $endpointsPayloads = array_values(array_filter($payloads, function ($p) { return $p["request_type"] == "app-endpoints"; })); + + $this->assertCount(1, $endpointsPayloads); + + $endpointsPayload = $endpointsPayloads[0]; + $endpoints = $endpointsPayload["payload"]["endpoints"]; + $this->assertGreaterThan(0, $endpoints); + foreach ($endpoints as $endpoint) { + $this->assertNotEmpty($endpoint["path"]); + $this->assertNotEmpty($endpoint["method"]); + $this->assertEquals("http.request", $endpoint["operation_name"]); + $this->assertEquals($endpoint["method"] . " " . $endpoint["path"], $endpoint["resource_name"]); + } + } +} diff --git a/tests/Integrations/Symfony/V3_0/TelemetryTest.php b/tests/Integrations/Symfony/V3_0/TelemetryTest.php new file mode 100644 index 0000000000..bf935de9c4 --- /dev/null +++ b/tests/Integrations/Symfony/V3_0/TelemetryTest.php @@ -0,0 +1,79 @@ + 'laravel_test_app', + 'DD_TRACE_DEBUG' => 'true', + 'DD_SERVICE' => 'test_symfony_30', + 'DD_TRACE_AGENT_PORT' => 80, + 'DD_AGENT_HOST' => 'request-replayer', + 'DD_INSTRUMENTATION_TELEMETRY_ENABLED' => 1, + ]); + } + + private function readTelemetryPayloads($response) + { + $telemetryPayloads = []; + foreach ($response as $request) { + if (strpos($request["uri"], "/telemetry/") === 0) { + $json = json_decode($request["body"], true); + $batch = $json["request_type"] == "message-batch" ? $json["payload"] : [$json]; + foreach ($batch as $innerJson) { + if (isset($json["application"])) { + $innerJson["application"] = $json["application"]; + } + $telemetryPayloads[] = $innerJson; + } + } + } + + // Filter the payloads from the trace background sender + return array_values($telemetryPayloads); + } + + public function testAppEndpointsAreSent() + { + if (extension_loaded('xdebug')) { + $this->markTestSkipped('Xdebug extension is loaded'); + } + + $this->resetRequestDumper(); + + $this->call(GetSpec::create("telemetry", "/telemetry")); + usleep(500000); + $response = $this->retrieveDumpedData($this->untilTelemetryRequest("app-endpoints"), true); + $payloads = $this->readTelemetryPayloads($response); + $endpointsPayloads = array_values(array_filter($payloads, function ($p) { return $p["request_type"] == "app-endpoints"; })); + + $this->assertCount(1, $endpointsPayloads); + + $endpointsPayload = $endpointsPayloads[0]; + $endpoints = $endpointsPayload["payload"]["endpoints"]; + $this->assertGreaterThan(0, $endpoints); + foreach ($endpoints as $endpoint) { + $this->assertNotEmpty($endpoint["path"]); + $this->assertNotEmpty($endpoint["method"]); + $this->assertEquals("http.request", $endpoint["operation_name"]); + $this->assertEquals($endpoint["method"] . " " . $endpoint["path"], $endpoint["resource_name"]); + } + } +} diff --git a/tests/Integrations/Symfony/V3_3/TelemetryTest.php b/tests/Integrations/Symfony/V3_3/TelemetryTest.php new file mode 100644 index 0000000000..90907190c2 --- /dev/null +++ b/tests/Integrations/Symfony/V3_3/TelemetryTest.php @@ -0,0 +1,79 @@ + 'laravel_test_app', + 'DD_TRACE_DEBUG' => 'true', + 'DD_SERVICE' => 'test_symfony_33', + 'DD_TRACE_AGENT_PORT' => 80, + 'DD_AGENT_HOST' => 'request-replayer', + 'DD_INSTRUMENTATION_TELEMETRY_ENABLED' => 1, + ]); + } + + private function readTelemetryPayloads($response) + { + $telemetryPayloads = []; + foreach ($response as $request) { + if (strpos($request["uri"], "/telemetry/") === 0) { + $json = json_decode($request["body"], true); + $batch = $json["request_type"] == "message-batch" ? $json["payload"] : [$json]; + foreach ($batch as $innerJson) { + if (isset($json["application"])) { + $innerJson["application"] = $json["application"]; + } + $telemetryPayloads[] = $innerJson; + } + } + } + + // Filter the payloads from the trace background sender + return array_values($telemetryPayloads); + } + + public function testAppEndpointsAreSent() + { + if (extension_loaded('xdebug')) { + $this->markTestSkipped('Xdebug extension is loaded'); + } + + $this->resetRequestDumper(); + + $this->call(GetSpec::create("telemetry", "/telemetry")); + usleep(500000); + $response = $this->retrieveDumpedData($this->untilTelemetryRequest("app-endpoints"), true); + $payloads = $this->readTelemetryPayloads($response); + $endpointsPayloads = array_values(array_filter($payloads, function ($p) { return $p["request_type"] == "app-endpoints"; })); + + $this->assertCount(1, $endpointsPayloads); + + $endpointsPayload = $endpointsPayloads[0]; + $endpoints = $endpointsPayload["payload"]["endpoints"]; + $this->assertGreaterThan(0, $endpoints); + foreach ($endpoints as $endpoint) { + $this->assertNotEmpty($endpoint["path"]); + $this->assertNotEmpty($endpoint["method"]); + $this->assertEquals("http.request", $endpoint["operation_name"]); + $this->assertEquals($endpoint["method"] . " " . $endpoint["path"], $endpoint["resource_name"]); + } + } +} diff --git a/tests/Integrations/Symfony/V3_4/TelemetryTest.php b/tests/Integrations/Symfony/V3_4/TelemetryTest.php new file mode 100644 index 0000000000..8cfaccaedc --- /dev/null +++ b/tests/Integrations/Symfony/V3_4/TelemetryTest.php @@ -0,0 +1,79 @@ + 'laravel_test_app', + 'DD_TRACE_DEBUG' => 'true', + 'DD_SERVICE' => 'test_symfony_34', + 'DD_TRACE_AGENT_PORT' => 80, + 'DD_AGENT_HOST' => 'request-replayer', + 'DD_INSTRUMENTATION_TELEMETRY_ENABLED' => 1, + ]); + } + + private function readTelemetryPayloads($response) + { + $telemetryPayloads = []; + foreach ($response as $request) { + if (strpos($request["uri"], "/telemetry/") === 0) { + $json = json_decode($request["body"], true); + $batch = $json["request_type"] == "message-batch" ? $json["payload"] : [$json]; + foreach ($batch as $innerJson) { + if (isset($json["application"])) { + $innerJson["application"] = $json["application"]; + } + $telemetryPayloads[] = $innerJson; + } + } + } + + // Filter the payloads from the trace background sender + return array_values($telemetryPayloads); + } + + public function testAppEndpointsAreSent() + { + if (extension_loaded('xdebug')) { + $this->markTestSkipped('Xdebug extension is loaded'); + } + + $this->resetRequestDumper(); + + $this->call(GetSpec::create("telemetry", "/telemetry")); + usleep(500000); + $response = $this->retrieveDumpedData($this->untilTelemetryRequest("app-endpoints"), true); + $payloads = $this->readTelemetryPayloads($response); + $endpointsPayloads = array_values(array_filter($payloads, function ($p) { return $p["request_type"] == "app-endpoints"; })); + + $this->assertCount(1, $endpointsPayloads); + + $endpointsPayload = $endpointsPayloads[0]; + $endpoints = $endpointsPayload["payload"]["endpoints"]; + $this->assertGreaterThan(0, $endpoints); + foreach ($endpoints as $endpoint) { + $this->assertNotEmpty($endpoint["path"]); + $this->assertNotEmpty($endpoint["method"]); + $this->assertEquals("http.request", $endpoint["operation_name"]); + $this->assertEquals($endpoint["method"] . " " . $endpoint["path"], $endpoint["resource_name"]); + } + } +} diff --git a/tests/Integrations/Symfony/V4_0/TelemetryTest.php b/tests/Integrations/Symfony/V4_0/TelemetryTest.php new file mode 100644 index 0000000000..f105b46fe3 --- /dev/null +++ b/tests/Integrations/Symfony/V4_0/TelemetryTest.php @@ -0,0 +1,79 @@ + 'laravel_test_app', + 'DD_TRACE_DEBUG' => 'true', + 'DD_SERVICE' => 'test_symfony_40', + 'DD_TRACE_AGENT_PORT' => 80, + 'DD_AGENT_HOST' => 'request-replayer', + 'DD_INSTRUMENTATION_TELEMETRY_ENABLED' => 1, + ]); + } + + private function readTelemetryPayloads($response) + { + $telemetryPayloads = []; + foreach ($response as $request) { + if (strpos($request["uri"], "/telemetry/") === 0) { + $json = json_decode($request["body"], true); + $batch = $json["request_type"] == "message-batch" ? $json["payload"] : [$json]; + foreach ($batch as $innerJson) { + if (isset($json["application"])) { + $innerJson["application"] = $json["application"]; + } + $telemetryPayloads[] = $innerJson; + } + } + } + + // Filter the payloads from the trace background sender + return array_values($telemetryPayloads); + } + + public function testAppEndpointsAreSent() + { + if (extension_loaded('xdebug')) { + $this->markTestSkipped('Xdebug extension is loaded'); + } + + $this->resetRequestDumper(); + + $this->call(GetSpec::create("telemetry", "/telemetry")); + usleep(500000); + $response = $this->retrieveDumpedData($this->untilTelemetryRequest("app-endpoints"), true); + $payloads = $this->readTelemetryPayloads($response); + $endpointsPayloads = array_values(array_filter($payloads, function ($p) { return $p["request_type"] == "app-endpoints"; })); + + $this->assertCount(1, $endpointsPayloads); + + $endpointsPayload = $endpointsPayloads[0]; + $endpoints = $endpointsPayload["payload"]["endpoints"]; + $this->assertGreaterThan(0, $endpoints); + foreach ($endpoints as $endpoint) { + $this->assertNotEmpty($endpoint["path"]); + $this->assertNotEmpty($endpoint["method"]); + $this->assertEquals("http.request", $endpoint["operation_name"]); + $this->assertEquals($endpoint["method"] . " " . $endpoint["path"], $endpoint["resource_name"]); + } + } +} diff --git a/tests/Integrations/Symfony/V4_2/TelemetryTest.php b/tests/Integrations/Symfony/V4_2/TelemetryTest.php new file mode 100644 index 0000000000..990ec3d791 --- /dev/null +++ b/tests/Integrations/Symfony/V4_2/TelemetryTest.php @@ -0,0 +1,79 @@ + 'laravel_test_app', + 'DD_TRACE_DEBUG' => 'true', + 'DD_SERVICE' => 'test_symfony_42', + 'DD_TRACE_AGENT_PORT' => 80, + 'DD_AGENT_HOST' => 'request-replayer', + 'DD_INSTRUMENTATION_TELEMETRY_ENABLED' => 1, + ]); + } + + private function readTelemetryPayloads($response) + { + $telemetryPayloads = []; + foreach ($response as $request) { + if (strpos($request["uri"], "/telemetry/") === 0) { + $json = json_decode($request["body"], true); + $batch = $json["request_type"] == "message-batch" ? $json["payload"] : [$json]; + foreach ($batch as $innerJson) { + if (isset($json["application"])) { + $innerJson["application"] = $json["application"]; + } + $telemetryPayloads[] = $innerJson; + } + } + } + + // Filter the payloads from the trace background sender + return array_values($telemetryPayloads); + } + + public function testAppEndpointsAreSent() + { + if (extension_loaded('xdebug')) { + $this->markTestSkipped('Xdebug extension is loaded'); + } + + $this->resetRequestDumper(); + + $this->call(GetSpec::create("telemetry", "/telemetry")); + usleep(500000); + $response = $this->retrieveDumpedData($this->untilTelemetryRequest("app-endpoints"), true); + $payloads = $this->readTelemetryPayloads($response); + $endpointsPayloads = array_values(array_filter($payloads, function ($p) { return $p["request_type"] == "app-endpoints"; })); + + $this->assertCount(1, $endpointsPayloads); + + $endpointsPayload = $endpointsPayloads[0]; + $endpoints = $endpointsPayload["payload"]["endpoints"]; + $this->assertGreaterThan(0, $endpoints); + foreach ($endpoints as $endpoint) { + $this->assertNotEmpty($endpoint["path"]); + $this->assertNotEmpty($endpoint["method"]); + $this->assertEquals("http.request", $endpoint["operation_name"]); + $this->assertEquals($endpoint["method"] . " " . $endpoint["path"], $endpoint["resource_name"]); + } + } +} diff --git a/tests/Integrations/Symfony/V4_4/TelemetryTest.php b/tests/Integrations/Symfony/V4_4/TelemetryTest.php new file mode 100644 index 0000000000..44f7b19551 --- /dev/null +++ b/tests/Integrations/Symfony/V4_4/TelemetryTest.php @@ -0,0 +1,79 @@ + 'laravel_test_app', + 'DD_TRACE_DEBUG' => 'true', + 'DD_SERVICE' => 'test_symfony_44', + 'DD_TRACE_AGENT_PORT' => 80, + 'DD_AGENT_HOST' => 'request-replayer', + 'DD_INSTRUMENTATION_TELEMETRY_ENABLED' => 1, + ]); + } + + private function readTelemetryPayloads($response) + { + $telemetryPayloads = []; + foreach ($response as $request) { + if (strpos($request["uri"], "/telemetry/") === 0) { + $json = json_decode($request["body"], true); + $batch = $json["request_type"] == "message-batch" ? $json["payload"] : [$json]; + foreach ($batch as $innerJson) { + if (isset($json["application"])) { + $innerJson["application"] = $json["application"]; + } + $telemetryPayloads[] = $innerJson; + } + } + } + + // Filter the payloads from the trace background sender + return array_values($telemetryPayloads); + } + + public function testAppEndpointsAreSent() + { + if (extension_loaded('xdebug')) { + $this->markTestSkipped('Xdebug extension is loaded'); + } + + $this->resetRequestDumper(); + + $this->call(GetSpec::create("telemetry", "/telemetry")); + usleep(500000); + $response = $this->retrieveDumpedData($this->untilTelemetryRequest("app-endpoints"), true); + $payloads = $this->readTelemetryPayloads($response); + $endpointsPayloads = array_values(array_filter($payloads, function ($p) { return $p["request_type"] == "app-endpoints"; })); + + $this->assertCount(1, $endpointsPayloads); + + $endpointsPayload = $endpointsPayloads[0]; + $endpoints = $endpointsPayload["payload"]["endpoints"]; + $this->assertGreaterThan(0, $endpoints); + foreach ($endpoints as $endpoint) { + $this->assertNotEmpty($endpoint["path"]); + $this->assertNotEmpty($endpoint["method"]); + $this->assertEquals("http.request", $endpoint["operation_name"]); + $this->assertEquals($endpoint["method"] . " " . $endpoint["path"], $endpoint["resource_name"]); + } + } +} diff --git a/tests/Integrations/Symfony/V5_0/TelemetryTest.php b/tests/Integrations/Symfony/V5_0/TelemetryTest.php new file mode 100644 index 0000000000..45540fddc9 --- /dev/null +++ b/tests/Integrations/Symfony/V5_0/TelemetryTest.php @@ -0,0 +1,79 @@ + 'laravel_test_app', + 'DD_TRACE_DEBUG' => 'true', + 'DD_SERVICE' => 'test_symfony_50', + 'DD_TRACE_AGENT_PORT' => 80, + 'DD_AGENT_HOST' => 'request-replayer', + 'DD_INSTRUMENTATION_TELEMETRY_ENABLED' => 1, + ]); + } + + private function readTelemetryPayloads($response) + { + $telemetryPayloads = []; + foreach ($response as $request) { + if (strpos($request["uri"], "/telemetry/") === 0) { + $json = json_decode($request["body"], true); + $batch = $json["request_type"] == "message-batch" ? $json["payload"] : [$json]; + foreach ($batch as $innerJson) { + if (isset($json["application"])) { + $innerJson["application"] = $json["application"]; + } + $telemetryPayloads[] = $innerJson; + } + } + } + + // Filter the payloads from the trace background sender + return array_values($telemetryPayloads); + } + + public function testAppEndpointsAreSent() + { + if (extension_loaded('xdebug')) { + $this->markTestSkipped('Xdebug extension is loaded'); + } + + $this->resetRequestDumper(); + + $this->call(GetSpec::create("telemetry", "/telemetry")); + usleep(500000); + $response = $this->retrieveDumpedData($this->untilTelemetryRequest("app-endpoints"), true); + $payloads = $this->readTelemetryPayloads($response); + $endpointsPayloads = array_values(array_filter($payloads, function ($p) { return $p["request_type"] == "app-endpoints"; })); + + $this->assertCount(1, $endpointsPayloads); + + $endpointsPayload = $endpointsPayloads[0]; + $endpoints = $endpointsPayload["payload"]["endpoints"]; + $this->assertGreaterThan(0, $endpoints); + foreach ($endpoints as $endpoint) { + $this->assertNotEmpty($endpoint["path"]); + $this->assertNotEmpty($endpoint["method"]); + $this->assertEquals("http.request", $endpoint["operation_name"]); + $this->assertEquals($endpoint["method"] . " " . $endpoint["path"], $endpoint["resource_name"]); + } + } +} diff --git a/tests/Integrations/Symfony/V5_1/TelemetryTest.php b/tests/Integrations/Symfony/V5_1/TelemetryTest.php new file mode 100644 index 0000000000..b43a1e910f --- /dev/null +++ b/tests/Integrations/Symfony/V5_1/TelemetryTest.php @@ -0,0 +1,79 @@ + 'laravel_test_app', + 'DD_TRACE_DEBUG' => 'true', + 'DD_SERVICE' => 'test_symfony_51', + 'DD_TRACE_AGENT_PORT' => 80, + 'DD_AGENT_HOST' => 'request-replayer', + 'DD_INSTRUMENTATION_TELEMETRY_ENABLED' => 1, + ]); + } + + private function readTelemetryPayloads($response) + { + $telemetryPayloads = []; + foreach ($response as $request) { + if (strpos($request["uri"], "/telemetry/") === 0) { + $json = json_decode($request["body"], true); + $batch = $json["request_type"] == "message-batch" ? $json["payload"] : [$json]; + foreach ($batch as $innerJson) { + if (isset($json["application"])) { + $innerJson["application"] = $json["application"]; + } + $telemetryPayloads[] = $innerJson; + } + } + } + + // Filter the payloads from the trace background sender + return array_values($telemetryPayloads); + } + + public function testAppEndpointsAreSent() + { + if (extension_loaded('xdebug')) { + $this->markTestSkipped('Xdebug extension is loaded'); + } + + $this->resetRequestDumper(); + + $this->call(GetSpec::create("telemetry", "/telemetry")); + usleep(500000); + $response = $this->retrieveDumpedData($this->untilTelemetryRequest("app-endpoints"), true); + $payloads = $this->readTelemetryPayloads($response); + $endpointsPayloads = array_values(array_filter($payloads, function ($p) { return $p["request_type"] == "app-endpoints"; })); + + $this->assertCount(1, $endpointsPayloads); + + $endpointsPayload = $endpointsPayloads[0]; + $endpoints = $endpointsPayload["payload"]["endpoints"]; + $this->assertGreaterThan(0, $endpoints); + foreach ($endpoints as $endpoint) { + $this->assertNotEmpty($endpoint["path"]); + $this->assertNotEmpty($endpoint["method"]); + $this->assertEquals("http.request", $endpoint["operation_name"]); + $this->assertEquals($endpoint["method"] . " " . $endpoint["path"], $endpoint["resource_name"]); + } + } +} diff --git a/tests/Integrations/Symfony/V5_2/TelemetryTest.php b/tests/Integrations/Symfony/V5_2/TelemetryTest.php new file mode 100644 index 0000000000..1c260c8edd --- /dev/null +++ b/tests/Integrations/Symfony/V5_2/TelemetryTest.php @@ -0,0 +1,79 @@ + 'laravel_test_app', + 'DD_TRACE_DEBUG' => 'true', + 'DD_SERVICE' => 'test_symfony_52', + 'DD_TRACE_AGENT_PORT' => 80, + 'DD_AGENT_HOST' => 'request-replayer', + 'DD_INSTRUMENTATION_TELEMETRY_ENABLED' => 1, + ]); + } + + private function readTelemetryPayloads($response) + { + $telemetryPayloads = []; + foreach ($response as $request) { + if (strpos($request["uri"], "/telemetry/") === 0) { + $json = json_decode($request["body"], true); + $batch = $json["request_type"] == "message-batch" ? $json["payload"] : [$json]; + foreach ($batch as $innerJson) { + if (isset($json["application"])) { + $innerJson["application"] = $json["application"]; + } + $telemetryPayloads[] = $innerJson; + } + } + } + + // Filter the payloads from the trace background sender + return array_values($telemetryPayloads); + } + + public function testAppEndpointsAreSent() + { + if (extension_loaded('xdebug')) { + $this->markTestSkipped('Xdebug extension is loaded'); + } + + $this->resetRequestDumper(); + + $this->call(GetSpec::create("telemetry", "/telemetry")); + usleep(500000); + $response = $this->retrieveDumpedData($this->untilTelemetryRequest("app-endpoints"), true); + $payloads = $this->readTelemetryPayloads($response); + $endpointsPayloads = array_values(array_filter($payloads, function ($p) { return $p["request_type"] == "app-endpoints"; })); + + $this->assertCount(1, $endpointsPayloads); + + $endpointsPayload = $endpointsPayloads[0]; + $endpoints = $endpointsPayload["payload"]["endpoints"]; + $this->assertGreaterThan(0, $endpoints); + foreach ($endpoints as $endpoint) { + $this->assertNotEmpty($endpoint["path"]); + $this->assertNotEmpty($endpoint["method"]); + $this->assertEquals("http.request", $endpoint["operation_name"]); + $this->assertEquals($endpoint["method"] . " " . $endpoint["path"], $endpoint["resource_name"]); + } + } +} diff --git a/tests/Integrations/Symfony/V6_2/TelemetryTest.php b/tests/Integrations/Symfony/V6_2/TelemetryTest.php new file mode 100644 index 0000000000..6a30b2ddf7 --- /dev/null +++ b/tests/Integrations/Symfony/V6_2/TelemetryTest.php @@ -0,0 +1,79 @@ + 'laravel_test_app', + 'DD_TRACE_DEBUG' => 'true', + 'DD_SERVICE' => 'test_symfony_62', + 'DD_TRACE_AGENT_PORT' => 80, + 'DD_AGENT_HOST' => 'request-replayer', + 'DD_INSTRUMENTATION_TELEMETRY_ENABLED' => 1, + ]); + } + + private function readTelemetryPayloads($response) + { + $telemetryPayloads = []; + foreach ($response as $request) { + if (strpos($request["uri"], "/telemetry/") === 0) { + $json = json_decode($request["body"], true); + $batch = $json["request_type"] == "message-batch" ? $json["payload"] : [$json]; + foreach ($batch as $innerJson) { + if (isset($json["application"])) { + $innerJson["application"] = $json["application"]; + } + $telemetryPayloads[] = $innerJson; + } + } + } + + // Filter the payloads from the trace background sender + return array_values($telemetryPayloads); + } + + public function testAppEndpointsAreSent() + { + if (extension_loaded('xdebug')) { + $this->markTestSkipped('Xdebug extension is loaded'); + } + + $this->resetRequestDumper(); + + $this->call(GetSpec::create("telemetry", "/telemetry")); + usleep(500000); + $response = $this->retrieveDumpedData($this->untilTelemetryRequest("app-endpoints"), true); + $payloads = $this->readTelemetryPayloads($response); + $endpointsPayloads = array_values(array_filter($payloads, function ($p) { return $p["request_type"] == "app-endpoints"; })); + + $this->assertCount(1, $endpointsPayloads); + + $endpointsPayload = $endpointsPayloads[0]; + $endpoints = $endpointsPayload["payload"]["endpoints"]; + $this->assertGreaterThan(0, $endpoints); + foreach ($endpoints as $endpoint) { + $this->assertNotEmpty($endpoint["path"]); + $this->assertNotEmpty($endpoint["method"]); + $this->assertEquals("http.request", $endpoint["operation_name"]); + $this->assertEquals($endpoint["method"] . " " . $endpoint["path"], $endpoint["resource_name"]); + } + } +} From 704d5cdac6f752fa484d43d561128894120fa19f Mon Sep 17 00:00:00 2001 From: Alejandro Estringana Ruiz Date: Wed, 29 Oct 2025 12:29:52 +0100 Subject: [PATCH 41/53] Fix latest symfony --- .../Latest/src/Controller/CommonScenariosController.php | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/tests/Frameworks/Symfony/Latest/src/Controller/CommonScenariosController.php b/tests/Frameworks/Symfony/Latest/src/Controller/CommonScenariosController.php index ac52790ff3..0b8669603f 100644 --- a/tests/Frameworks/Symfony/Latest/src/Controller/CommonScenariosController.php +++ b/tests/Frameworks/Symfony/Latest/src/Controller/CommonScenariosController.php @@ -40,9 +40,7 @@ public function behindAuthAction(Request $request) return new Response('Hi!'); } - /** - * @Route("/telemetry", name="telemetry") - */ + #[Route('/telemetry', name: 'telemetry')] public function telemetryAction(Request $request) { dd_trace_internal_fn("finalize_telemetry"); From 50a29e0f9fd3b7567054c936bcb28b8266467195 Mon Sep 17 00:00:00 2001 From: Alejandro Estringana Ruiz Date: Wed, 29 Oct 2025 12:45:49 +0100 Subject: [PATCH 42/53] Fix old symfony versions tests --- src/DDTrace/Integrations/Symfony/SymfonyIntegration.php | 2 +- tests/Integrations/Symfony/V2_3/TelemetryTest.php | 2 +- tests/Integrations/Symfony/V2_8/TelemetryTest.php | 2 +- tests/Integrations/Symfony/V3_0/TelemetryTest.php | 2 +- tests/Integrations/Symfony/V3_3/TelemetryTest.php | 2 +- tests/Integrations/Symfony/V3_4/TelemetryTest.php | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/DDTrace/Integrations/Symfony/SymfonyIntegration.php b/src/DDTrace/Integrations/Symfony/SymfonyIntegration.php index 6a972265ad..2718b0e755 100644 --- a/src/DDTrace/Integrations/Symfony/SymfonyIntegration.php +++ b/src/DDTrace/Integrations/Symfony/SymfonyIntegration.php @@ -78,7 +78,7 @@ public static function init(): int $span->resource = \get_class($this); $span->type = Type::WEB_SERVLET; $span->service = \ddtrace_config_app_name('symfony'); - $span->meta[Tag::COMPONENT] = SymfonyIntegration::NAME; + $span->meta[Tag::COMPONENT] = SymfonyIntegration::NAME; }, ] ); diff --git a/tests/Integrations/Symfony/V2_3/TelemetryTest.php b/tests/Integrations/Symfony/V2_3/TelemetryTest.php index f216bd838a..0ccb13bf31 100644 --- a/tests/Integrations/Symfony/V2_3/TelemetryTest.php +++ b/tests/Integrations/Symfony/V2_3/TelemetryTest.php @@ -10,7 +10,7 @@ class TelemetryTest extends WebFrameworkTestCase { public static function getAppIndexScript() { - return __DIR__ . '/../../../Frameworks/Symfony/Version_2_3/public/index.php'; + return __DIR__ . '/../../../Frameworks/Symfony/Version_2_3/web/app.php'; } public static function getTestedLibrary() diff --git a/tests/Integrations/Symfony/V2_8/TelemetryTest.php b/tests/Integrations/Symfony/V2_8/TelemetryTest.php index aaf0416fc7..a0ba8475e9 100644 --- a/tests/Integrations/Symfony/V2_8/TelemetryTest.php +++ b/tests/Integrations/Symfony/V2_8/TelemetryTest.php @@ -10,7 +10,7 @@ class TelemetryTest extends WebFrameworkTestCase { public static function getAppIndexScript() { - return __DIR__ . '/../../../Frameworks/Symfony/Version_2_8/public/index.php'; + return __DIR__ . '/../../../Frameworks/Symfony/Version_2_8/web/app.php'; } public static function getTestedLibrary() diff --git a/tests/Integrations/Symfony/V3_0/TelemetryTest.php b/tests/Integrations/Symfony/V3_0/TelemetryTest.php index bf935de9c4..977dfd73c8 100644 --- a/tests/Integrations/Symfony/V3_0/TelemetryTest.php +++ b/tests/Integrations/Symfony/V3_0/TelemetryTest.php @@ -10,7 +10,7 @@ class TelemetryTest extends WebFrameworkTestCase { public static function getAppIndexScript() { - return __DIR__ . '/../../../Frameworks/Symfony/Version_3_0/public/index.php'; + return __DIR__ . '/../../../Frameworks/Symfony/Version_3_0/web/index.php'; } public static function getTestedLibrary() diff --git a/tests/Integrations/Symfony/V3_3/TelemetryTest.php b/tests/Integrations/Symfony/V3_3/TelemetryTest.php index 90907190c2..245f7c40ce 100644 --- a/tests/Integrations/Symfony/V3_3/TelemetryTest.php +++ b/tests/Integrations/Symfony/V3_3/TelemetryTest.php @@ -10,7 +10,7 @@ class TelemetryTest extends WebFrameworkTestCase { public static function getAppIndexScript() { - return __DIR__ . '/../../../Frameworks/Symfony/Version_3_3/public/index.php'; + return __DIR__ . '/../../../Frameworks/Symfony/Version_3_3/web/index.php'; } public static function getTestedLibrary() diff --git a/tests/Integrations/Symfony/V3_4/TelemetryTest.php b/tests/Integrations/Symfony/V3_4/TelemetryTest.php index 8cfaccaedc..9d8ed9d3c5 100644 --- a/tests/Integrations/Symfony/V3_4/TelemetryTest.php +++ b/tests/Integrations/Symfony/V3_4/TelemetryTest.php @@ -10,7 +10,7 @@ class TelemetryTest extends WebFrameworkTestCase { public static function getAppIndexScript() { - return __DIR__ . '/../../../Frameworks/Symfony/Version_3_4/public/index.php'; + return __DIR__ . '/../../../Frameworks/Symfony/Version_3_4/web/index.php'; } public static function getTestedLibrary() From cd3c0fe27ee21c360bc57b21f0a1ed52a67e099f Mon Sep 17 00:00:00 2001 From: Alejandro Estringana Ruiz Date: Thu, 30 Oct 2025 12:40:00 +0100 Subject: [PATCH 43/53] Fix some symfony failing versions --- tests/Integrations/Symfony/V2_3/TelemetryTest.php | 8 +++++++- tests/Integrations/Symfony/V2_8/TelemetryTest.php | 2 +- tests/Integrations/Symfony/V3_0/TelemetryTest.php | 5 +++++ tests/Integrations/Symfony/V3_3/TelemetryTest.php | 5 +++++ tests/Integrations/Symfony/V3_4/TelemetryTest.php | 5 +++++ 5 files changed, 23 insertions(+), 2 deletions(-) diff --git a/tests/Integrations/Symfony/V2_3/TelemetryTest.php b/tests/Integrations/Symfony/V2_3/TelemetryTest.php index 0ccb13bf31..4874d75984 100644 --- a/tests/Integrations/Symfony/V2_3/TelemetryTest.php +++ b/tests/Integrations/Symfony/V2_3/TelemetryTest.php @@ -18,6 +18,11 @@ public static function getTestedLibrary() return 'symfony/framework-bundle'; } + protected static function getTestedVersion($testedLibrary) + { + return '2.3.42'; + } + protected static function getEnvs() { return array_merge(parent::getEnvs(), [ @@ -58,7 +63,8 @@ public function testAppEndpointsAreSent() $this->resetRequestDumper(); - $this->call(GetSpec::create("telemetry", "/telemetry")); + $this->call(GetSpec::create("telemetry", "/app.php/telemetry")); + usleep(500000); $response = $this->retrieveDumpedData($this->untilTelemetryRequest("app-endpoints"), true); $payloads = $this->readTelemetryPayloads($response); diff --git a/tests/Integrations/Symfony/V2_8/TelemetryTest.php b/tests/Integrations/Symfony/V2_8/TelemetryTest.php index a0ba8475e9..b2093ace45 100644 --- a/tests/Integrations/Symfony/V2_8/TelemetryTest.php +++ b/tests/Integrations/Symfony/V2_8/TelemetryTest.php @@ -58,7 +58,7 @@ public function testAppEndpointsAreSent() $this->resetRequestDumper(); - $this->call(GetSpec::create("telemetry", "/telemetry")); + $this->call(GetSpec::create("telemetry", "/app.php/telemetry")); usleep(500000); $response = $this->retrieveDumpedData($this->untilTelemetryRequest("app-endpoints"), true); $payloads = $this->readTelemetryPayloads($response); diff --git a/tests/Integrations/Symfony/V3_0/TelemetryTest.php b/tests/Integrations/Symfony/V3_0/TelemetryTest.php index 977dfd73c8..6b84f6d6dd 100644 --- a/tests/Integrations/Symfony/V3_0/TelemetryTest.php +++ b/tests/Integrations/Symfony/V3_0/TelemetryTest.php @@ -18,6 +18,11 @@ public static function getTestedLibrary() return 'symfony/framework-bundle'; } + protected static function getTestedVersion($testedLibrary) + { + return '3.0.9'; + } + protected static function getEnvs() { return array_merge(parent::getEnvs(), [ diff --git a/tests/Integrations/Symfony/V3_3/TelemetryTest.php b/tests/Integrations/Symfony/V3_3/TelemetryTest.php index 245f7c40ce..efeddcb98f 100644 --- a/tests/Integrations/Symfony/V3_3/TelemetryTest.php +++ b/tests/Integrations/Symfony/V3_3/TelemetryTest.php @@ -18,6 +18,11 @@ public static function getTestedLibrary() return 'symfony/framework-bundle'; } + protected static function getTestedVersion($testedLibrary) + { + return '3.3.18'; + } + protected static function getEnvs() { return array_merge(parent::getEnvs(), [ diff --git a/tests/Integrations/Symfony/V3_4/TelemetryTest.php b/tests/Integrations/Symfony/V3_4/TelemetryTest.php index 9d8ed9d3c5..cb560c5399 100644 --- a/tests/Integrations/Symfony/V3_4/TelemetryTest.php +++ b/tests/Integrations/Symfony/V3_4/TelemetryTest.php @@ -18,6 +18,11 @@ public static function getTestedLibrary() return 'symfony/framework-bundle'; } + protected static function getTestedVersion($testedLibrary) + { + return '3.3.47'; + } + protected static function getEnvs() { return array_merge(parent::getEnvs(), [ From 806ae4cd37c8046d9e62a34811b272f6ba644cdc Mon Sep 17 00:00:00 2001 From: Alejandro Estringana Ruiz Date: Tue, 30 Dec 2025 16:33:27 +0100 Subject: [PATCH 44/53] Fix build --- Cargo.lock | 1397 ++++++++++++++++++---------------- components-rs/common.h | 161 ++-- components-rs/crashtracker.h | 16 +- components-rs/ddtrace.h | 12 +- components-rs/sidecar.h | 3 +- components-rs/telemetry.h | 3 +- components-rs/telemetry.rs | 18 +- libdatadog | 2 +- 8 files changed, 850 insertions(+), 762 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 666f097ac1..4e8fc664de 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -122,6 +122,15 @@ version = "1.0.98" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" +[[package]] +name = "arbitrary" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1" +dependencies = [ + "derive_arbitrary", +] + [[package]] name = "arc-swap" version = "1.7.1" @@ -156,6 +165,12 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b34d609dfbaf33d6889b2b7106d3ca345eacad44200913df5ba02bfd31d2ba9" +[[package]] +name = "assert_no_alloc" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55ca83137a482d61d916ceb1eba52a684f98004f18e0cafea230fe5579c178a3" + [[package]] name = "async-lock" version = "3.4.0" @@ -518,16 +533,6 @@ dependencies = [ "serde_json", ] -[[package]] -name = "build_common" -version = "21.0.0" -source = "git+https://github.com/DataDog/libdatadog?rev=0b59f64c4fc08105e5b73c5a0752ced3cf8f653e#0b59f64c4fc08105e5b73c5a0752ced3cf8f653e" -dependencies = [ - "cbindgen 0.29.0", - "serde", - "serde_json", -] - [[package]] name = "bumpalo" version = "3.16.0" @@ -604,7 +609,7 @@ checksum = "3fce8dd7fcfcbf3a0a87d8f515194b49d6135acab73e18bd380d1d93bb1a15eb" dependencies = [ "clap", "heck 0.4.1", - "indexmap 2.7.1", + "indexmap 2.12.1", "log", "proc-macro2", "quote", @@ -623,7 +628,7 @@ checksum = "975982cdb7ad6a142be15bdf84aea7ec6a9e5d4d797c004d43185b24cfe4e684" dependencies = [ "clap", "heck 0.5.0", - "indexmap 2.7.1", + "indexmap 2.12.1", "log", "proc-macro2", "quote", @@ -776,6 +781,17 @@ dependencies = [ "cc", ] +[[package]] +name = "codespan-reporting" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af491d569909a7e4dee0ad7db7f5341fef5c614d5b8ec8cf765732aba3cff681" +dependencies = [ + "serde", + "termcolor", + "unicode-width", +] + [[package]] name = "colorchoice" version = "1.0.3" @@ -1064,148 +1080,100 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a74858bcfe44b22016cb49337d7b6f04618c58e5dbfdef61b06b8c434324a0bc" [[package]] -name = "darling" -version = "0.20.10" +name = "cxx" +version = "1.0.192" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" +checksum = "bbda285ba6e5866529faf76352bdf73801d9b44a6308d7cd58ca2379f378e994" dependencies = [ - "darling_core", - "darling_macro", + "cc", + "cxx-build", + "cxxbridge-cmd", + "cxxbridge-flags", + "cxxbridge-macro", + "foldhash 0.2.0", + "link-cplusplus", ] [[package]] -name = "darling_core" -version = "0.20.10" +name = "cxx-build" +version = "1.0.192" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" +checksum = "af9efde466c5d532d57efd92f861da3bdb7f61e369128ce8b4c3fe0c9de4fa4d" dependencies = [ - "fnv", - "ident_case", + "cc", + "codespan-reporting", + "indexmap 2.12.1", "proc-macro2", "quote", - "strsim", + "scratch", "syn 2.0.96", ] [[package]] -name = "darling_macro" -version = "0.20.10" +name = "cxxbridge-cmd" +version = "1.0.192" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" +checksum = "3efb93799095bccd4f763ca07997dc39a69e5e61ab52d2c407d4988d21ce144d" dependencies = [ - "darling_core", + "clap", + "codespan-reporting", + "indexmap 2.12.1", + "proc-macro2", "quote", "syn 2.0.96", ] [[package]] -name = "data-pipeline" -version = "0.0.1" -dependencies = [ - "anyhow", - "arc-swap", - "bytes", - "clap", - "criterion", - "datadog-ddsketch", - "datadog-log", - "datadog-trace-protobuf", - "datadog-trace-stats", - "datadog-trace-utils", - "ddcommon 0.0.1", - "ddtelemetry", - "dogstatsd-client", - "either", - "http", - "http-body-util", - "httpmock", - "hyper", - "hyper-util", - "rand 0.8.5", - "regex", - "rmp-serde", - "serde", - "serde_json", - "sha2", - "tempfile", - "tinybytes", - "tokio", - "tokio-util", - "tracing", - "uuid", -] +name = "cxxbridge-flags" +version = "1.0.192" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3092010228026e143b32a4463ed9fa8f86dca266af4bf5f3b2a26e113dbe4e45" [[package]] -name = "datadog-alloc" -version = "21.0.0" -source = "git+https://github.com/DataDog/libdatadog?rev=0b59f64c4fc08105e5b73c5a0752ced3cf8f653e#0b59f64c4fc08105e5b73c5a0752ced3cf8f653e" +name = "cxxbridge-macro" +version = "1.0.192" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31d72ebfcd351ae404fb00ff378dfc9571827a00722c9e735c9181aec320ba0a" dependencies = [ - "allocator-api2", - "libc 0.2.177", - "windows-sys 0.52.0", + "indexmap 2.12.1", + "proc-macro2", + "quote", + "syn 2.0.96", ] [[package]] -name = "datadog-crashtracker" -version = "0.0.1" +name = "darling" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" dependencies = [ - "anyhow", - "backtrace", - "blazesym", - "cc", - "cc_utils", - "chrono", - "criterion", - "ddcommon 0.0.1", - "ddtelemetry", - "goblin", - "http", - "libc 0.2.177", - "nix", - "num-derive", - "num-traits", - "os_info", - "page_size", - "portable-atomic", - "rand 0.8.5", - "schemars", - "serde", - "serde_json", - "symbolic-common", - "symbolic-demangle", - "tempfile", - "thiserror 1.0.69", - "tokio", - "uuid", - "windows 0.59.0", + "darling_core", + "darling_macro", ] [[package]] -name = "datadog-crashtracker-ffi" -version = "0.0.1" +name = "darling_core" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" dependencies = [ - "anyhow", - "build_common 0.0.1", - "datadog-crashtracker", - "ddcommon 0.0.1", - "ddcommon-ffi 0.0.1", - "function_name", - "libc 0.2.177", - "serde", - "serde_json", - "symbolic-common", - "symbolic-demangle", - "tempfile", - "windows 0.59.0", + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.96", ] [[package]] -name = "datadog-ddsketch" -version = "0.0.1" +name = "darling_macro" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ - "prost", - "prost-build", - "protoc-bin-vendored", + "darling_core", + "quote", + "syn 2.0.96", ] [[package]] @@ -1216,11 +1184,12 @@ dependencies = [ "bytes", "criterion", "datadog-ipc-macros", - "ddcommon 0.0.1", "futures", "glibc_version", "io-lifetimes", "libc 0.2.177", + "libdd-common 1.0.0", + "libdd-tinybytes", "memfd", "nix", "page_size", @@ -1231,7 +1200,6 @@ dependencies = [ "spawn_worker", "tarpc", "tempfile", - "tinybytes", "tokio", "tokio-serde", "tokio-util", @@ -1249,69 +1217,16 @@ dependencies = [ "syn 2.0.96", ] -[[package]] -name = "datadog-library-config" -version = "0.0.2" -dependencies = [ - "anyhow", - "memfd", - "rand 0.8.5", - "rmp", - "rmp-serde", - "serde", - "serde_yaml", - "tempfile", -] - -[[package]] -name = "datadog-library-config" -version = "0.0.2" -source = "git+https://github.com/DataDog/libdatadog?rev=0b59f64c4fc08105e5b73c5a0752ced3cf8f653e#0b59f64c4fc08105e5b73c5a0752ced3cf8f653e" -dependencies = [ - "anyhow", - "memfd", - "rand 0.8.5", - "rmp", - "rmp-serde", - "serde", - "serde_yaml", -] - -[[package]] -name = "datadog-library-config-ffi" -version = "0.0.2" -dependencies = [ - "anyhow", - "build_common 0.0.1", - "constcat", - "datadog-library-config 0.0.2", - "ddcommon 0.0.1", - "ddcommon-ffi 0.0.1", - "tempfile", -] - -[[package]] -name = "datadog-library-config-ffi" -version = "0.0.2" -source = "git+https://github.com/DataDog/libdatadog?rev=0b59f64c4fc08105e5b73c5a0752ced3cf8f653e#0b59f64c4fc08105e5b73c5a0752ced3cf8f653e" -dependencies = [ - "anyhow", - "build_common 21.0.0", - "constcat", - "datadog-library-config 0.0.2 (git+https://github.com/DataDog/libdatadog?rev=0b59f64c4fc08105e5b73c5a0752ced3cf8f653e)", - "ddcommon 21.0.0", - "ddcommon-ffi 21.0.0", -] - [[package]] name = "datadog-live-debugger" version = "0.0.1" dependencies = [ "anyhow", "constcat", - "ddcommon 0.0.1", "http-body-util", "hyper", + "libdd-common 1.0.0", + "libdd-data-pipeline", "percent-encoding", "regex", "regex-automata 0.4.9", @@ -1327,10 +1242,10 @@ dependencies = [ name = "datadog-live-debugger-ffi" version = "0.0.1" dependencies = [ - "build_common 0.0.1", + "build_common", "datadog-live-debugger", - "ddcommon 0.0.1", - "ddcommon-ffi 0.0.1", + "libdd-common 1.0.0", + "libdd-common-ffi", "log", "percent-encoding", "serde_json", @@ -1339,18 +1254,6 @@ dependencies = [ "uuid", ] -[[package]] -name = "datadog-log" -version = "0.0.1" -dependencies = [ - "chrono", - "ddcommon-ffi 0.0.1", - "tempfile", - "tracing", - "tracing-appender", - "tracing-subscriber", -] - [[package]] name = "datadog-php-profiling" version = "0.0.0" @@ -1366,14 +1269,14 @@ dependencies = [ "criterion", "criterion-perf-events", "crossbeam-channel", - "datadog-alloc", - "datadog-library-config-ffi 0.0.2 (git+https://github.com/DataDog/libdatadog?rev=0b59f64c4fc08105e5b73c5a0752ced3cf8f653e)", "datadog-php-profiling", - "datadog-profiling", - "ddcommon 21.0.0", "env_logger 0.11.6", "lazy_static", "libc 0.2.177", + "libdd-alloc", + "libdd-common 1.0.0 (git+https://github.com/DataDog/libdatadog?tag=v24.0.2)", + "libdd-library-config-ffi", + "libdd-profiling", "log", "once_cell", "perfcnt", @@ -1388,44 +1291,6 @@ dependencies = [ "uuid", ] -[[package]] -name = "datadog-profiling" -version = "21.0.0" -source = "git+https://github.com/DataDog/libdatadog?rev=0b59f64c4fc08105e5b73c5a0752ced3cf8f653e#0b59f64c4fc08105e5b73c5a0752ced3cf8f653e" -dependencies = [ - "anyhow", - "bitmaps", - "byteorder", - "bytes", - "chrono", - "datadog-alloc", - "datadog-profiling-protobuf", - "ddcommon 21.0.0", - "futures", - "http", - "http-body-util", - "hyper", - "hyper-multipart-rfc7578", - "indexmap 2.7.1", - "lz4_flex", - "mime", - "prost", - "rustc-hash", - "serde", - "serde_json", - "target-triple", - "tokio", - "tokio-util", -] - -[[package]] -name = "datadog-profiling-protobuf" -version = "21.0.0" -source = "git+https://github.com/DataDog/libdatadog?rev=0b59f64c4fc08105e5b73c5a0752ced3cf8f653e#0b59f64c4fc08105e5b73c5a0752ced3cf8f653e" -dependencies = [ - "prost", -] - [[package]] name = "datadog-remote-config" version = "0.0.1" @@ -1434,14 +1299,14 @@ dependencies = [ "base64 0.22.1", "datadog-live-debugger", "datadog-remote-config", - "datadog-trace-protobuf", - "ddcommon 0.0.1", "futures", "futures-util", "http", "http-body-util", "hyper", "hyper-util", + "libdd-common 1.0.0", + "libdd-trace-protobuf", "manual_future", "serde", "serde_json", @@ -1464,25 +1329,26 @@ dependencies = [ "bincode", "chrono", "console-subscriber", - "data-pipeline", - "datadog-crashtracker", - "datadog-crashtracker-ffi", "datadog-ipc", "datadog-ipc-macros", "datadog-live-debugger", "datadog-remote-config", "datadog-sidecar-macros", - "datadog-trace-utils", - "ddcommon 0.0.1", - "ddcommon-ffi 0.0.1", - "ddtelemetry", - "dogstatsd-client", "futures", "http", "http-body-util", "httpmock", "hyper", "libc 0.2.177", + "libdd-common 1.0.0", + "libdd-common-ffi", + "libdd-crashtracker", + "libdd-crashtracker-ffi", + "libdd-data-pipeline", + "libdd-dogstatsd-client", + "libdd-telemetry", + "libdd-tinybytes", + "libdd-trace-utils", "manual_future", "memory-stats", "microseh", @@ -1498,7 +1364,6 @@ dependencies = [ "simd-json", "spawn_worker", "tempfile", - "tinybytes", "tokio", "tokio-util", "tracing", @@ -1514,24 +1379,24 @@ dependencies = [ name = "datadog-sidecar-ffi" version = "0.0.1" dependencies = [ - "datadog-crashtracker-ffi", "datadog-ipc", "datadog-live-debugger", "datadog-remote-config", "datadog-sidecar", - "datadog-trace-utils", - "ddcommon 0.0.1", - "ddcommon-ffi 0.0.1", - "ddtelemetry", - "ddtelemetry-ffi", - "dogstatsd-client", "http", "libc 0.2.177", + "libdd-common 1.0.0", + "libdd-common-ffi", + "libdd-crashtracker-ffi", + "libdd-dogstatsd-client", + "libdd-telemetry", + "libdd-telemetry-ffi", + "libdd-tinybytes", + "libdd-trace-utils", "paste", "rmp-serde", "serde_json", "tempfile", - "tinybytes", "tracing", ] @@ -1544,256 +1409,48 @@ dependencies = [ ] [[package]] -name = "datadog-trace-normalization" +name = "ddtrace-php" version = "0.0.1" dependencies = [ "anyhow", - "criterion", - "datadog-trace-protobuf", - "duplicate", - "rand 0.8.5", -] - -[[package]] -name = "datadog-trace-protobuf" -version = "0.0.1" -dependencies = [ - "prost", - "prost-build", - "protoc-bin-vendored", - "serde", - "serde_bytes", - "serde_json", - "tokio", -] - -[[package]] -name = "datadog-trace-stats" -version = "0.0.1" -dependencies = [ - "criterion", - "datadog-ddsketch", - "datadog-trace-protobuf", - "datadog-trace-utils", - "hashbrown 0.15.2", - "rand 0.8.5", -] - -[[package]] -name = "datadog-trace-utils" -version = "0.0.1" -dependencies = [ - "anyhow", - "bolero", - "bytes", - "cargo-platform", - "cargo_metadata", - "criterion", - "datadog-trace-normalization", - "datadog-trace-protobuf", - "datadog-trace-utils", - "ddcommon 0.0.1", - "flate2", - "futures", - "http-body-util", - "httpmock", - "hyper", - "hyper-http-proxy", - "prost", - "rand 0.8.5", - "rmp", - "rmp-serde", - "rmpv", - "serde", - "serde_json", - "tempfile", - "tinybytes", - "tokio", - "tracing", - "urlencoding", - "zstd", -] - -[[package]] -name = "ddcommon" -version = "0.0.1" -dependencies = [ - "anyhow", - "cc", - "const_format", - "futures", - "futures-core", - "futures-util", - "hex", - "http", - "http-body", - "http-body-util", - "hyper", - "hyper-rustls", - "hyper-util", - "indexmap 2.7.1", - "libc 0.2.177", - "maplit", - "nix", - "pin-project", - "regex", - "rustls", - "rustls-native-certs", - "serde", - "static_assertions", - "tempfile", - "thiserror 1.0.69", - "tokio", - "tokio-rustls", - "tower-service", - "windows-sys 0.52.0", -] - -[[package]] -name = "ddcommon" -version = "21.0.0" -source = "git+https://github.com/DataDog/libdatadog?rev=0b59f64c4fc08105e5b73c5a0752ced3cf8f653e#0b59f64c4fc08105e5b73c5a0752ced3cf8f653e" -dependencies = [ - "anyhow", - "cc", - "const_format", - "futures", - "futures-core", - "futures-util", - "hex", - "http", - "http-body", - "http-body-util", - "hyper", - "hyper-rustls", - "hyper-util", - "libc 0.2.177", - "nix", - "pin-project", - "regex", - "rustls", - "rustls-native-certs", - "serde", - "static_assertions", - "thiserror 1.0.69", - "tokio", - "tokio-rustls", - "tower-service", - "windows-sys 0.52.0", -] - -[[package]] -name = "ddcommon-ffi" -version = "0.0.1" -dependencies = [ - "anyhow", - "bolero", - "build_common 0.0.1", - "chrono", - "crossbeam-queue", - "ddcommon 0.0.1", - "hyper", - "serde", -] - -[[package]] -name = "ddcommon-ffi" -version = "21.0.0" -source = "git+https://github.com/DataDog/libdatadog?rev=0b59f64c4fc08105e5b73c5a0752ced3cf8f653e#0b59f64c4fc08105e5b73c5a0752ced3cf8f653e" -dependencies = [ - "anyhow", - "build_common 21.0.0", - "chrono", - "crossbeam-queue", - "ddcommon 21.0.0", - "hyper", - "serde", -] - -[[package]] -name = "ddtelemetry" -version = "0.0.1" -dependencies = [ - "anyhow", - "base64 0.22.1", - "datadog-ddsketch", - "ddcommon 0.0.1", - "ddcommon-ffi 0.0.1", - "futures", - "hashbrown 0.15.2", - "http", - "http-body-util", - "hyper", - "hyper-util", - "libc 0.2.177", - "serde", - "serde_json", - "sys-info", - "tokio", - "tokio-util", - "tracing", - "tracing-subscriber", - "uuid", - "winver", -] - -[[package]] -name = "ddtelemetry-ffi" -version = "0.0.1" -dependencies = [ - "build_common 0.0.1", - "ddcommon 0.0.1", - "ddcommon-ffi 0.0.1", - "ddtelemetry", - "function_name", - "libc 0.2.177", - "paste", - "tempfile", -] - -[[package]] -name = "ddtrace-php" -version = "0.0.1" -dependencies = [ - "anyhow", - "bincode", - "cbindgen 0.27.0", - "const-str", - "datadog-crashtracker-ffi", - "datadog-ipc", - "datadog-library-config-ffi 0.0.2", - "datadog-live-debugger", - "datadog-live-debugger-ffi", - "datadog-remote-config", - "datadog-sidecar", - "datadog-sidecar-ffi", - "datadog-trace-utils", - "ddcommon 0.0.1", - "ddcommon-ffi 0.0.1", - "ddtelemetry", - "ddtelemetry-ffi", - "env_logger 0.10.2", - "hashbrown 0.15.2", - "http", - "itertools 0.11.0", - "lazy_static", - "libc 0.2.177", - "log", - "paste", - "regex", - "regex-automata 0.4.9", - "serde", - "serde_json", - "serde_with", - "simd-json", - "spawn_worker", - "tempfile", - "tinybytes", - "tracing", - "tracing-core", - "tracing-subscriber", - "uuid", - "zwohash", + "bincode", + "cbindgen 0.27.0", + "const-str", + "datadog-ipc", + "datadog-live-debugger", + "datadog-live-debugger-ffi", + "datadog-remote-config", + "datadog-sidecar", + "datadog-sidecar-ffi", + "env_logger 0.10.2", + "hashbrown 0.15.2", + "http", + "itertools 0.11.0", + "lazy_static", + "libc 0.2.177", + "libdd-common 1.0.0", + "libdd-common-ffi", + "libdd-crashtracker-ffi", + "libdd-library-config-ffi", + "libdd-telemetry", + "libdd-telemetry-ffi", + "libdd-tinybytes", + "libdd-trace-utils", + "log", + "paste", + "regex", + "regex-automata 0.4.9", + "serde", + "serde_json", + "serde_with", + "simd-json", + "spawn_worker", + "tempfile", + "tracing", + "tracing-core", + "tracing-subscriber", + "uuid", + "zwohash", ] [[package]] @@ -1815,6 +1472,17 @@ dependencies = [ "serde", ] +[[package]] +name = "derive_arbitrary" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e567bd82dcff979e4b03460c307b3cdc9e96fde3d73bed1496d2bc75d9dd62a" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.96", +] + [[package]] name = "diff" version = "0.1.13" @@ -1842,19 +1510,6 @@ dependencies = [ "syn 2.0.96", ] -[[package]] -name = "dogstatsd-client" -version = "0.0.1" -dependencies = [ - "anyhow", - "cadence", - "ddcommon 0.0.1", - "http", - "serde", - "tokio", - "tracing", -] - [[package]] name = "dunce" version = "1.0.5" @@ -2026,6 +1681,12 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" +[[package]] +name = "foldhash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" + [[package]] name = "form_urlencoded" version = "1.2.1" @@ -2221,7 +1882,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "93563d740bc9ef04104f9ed6f86f1e3275c2cdafb95664e26584b9ca807a8ffe" dependencies = [ "fallible-iterator", - "indexmap 2.7.1", + "indexmap 2.12.1", "stable_deref_trait", ] @@ -2263,7 +1924,7 @@ dependencies = [ "futures-core", "futures-sink", "http", - "indexmap 2.7.1", + "indexmap 2.12.1", "slab", "tokio", "tokio-util", @@ -2314,9 +1975,15 @@ checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" dependencies = [ "allocator-api2", "equivalent", - "foldhash", + "foldhash 0.1.5", ] +[[package]] +name = "hashbrown" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" + [[package]] name = "hdrhistogram" version = "7.5.4" @@ -2500,26 +2167,6 @@ dependencies = [ "want", ] -[[package]] -name = "hyper-http-proxy" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ad4b0a1e37510028bc4ba81d0e38d239c39671b0f0ce9e02dfa93a8133f7c08" -dependencies = [ - "bytes", - "futures-util", - "headers", - "http", - "hyper", - "hyper-rustls", - "hyper-util", - "pin-project-lite", - "tokio", - "tokio-rustls", - "tower-service", - "webpki-roots", -] - [[package]] name = "hyper-multipart-rfc7578" version = "0.9.0" @@ -2766,135 +2413,548 @@ dependencies = [ ] [[package]] -name = "indexmap" -version = "2.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c9c992b02b5b4c94ea26e32fe5bccb7aa7d9f390ab5c1221ff895bc7ea8b652" +name = "indexmap" +version = "2.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ad4bb2b565bca0645f4d68c5c9af97fba094e9791da685bf83cb5f3ce74acf2" +dependencies = [ + "equivalent", + "hashbrown 0.16.1", + "serde", + "serde_core", +] + +[[package]] +name = "integer-encoding" +version = "3.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bb03732005da905c88227371639bf1ad885cc712789c011c31c5fb3ab3ccf02" + +[[package]] +name = "io-lifetimes" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" +dependencies = [ + "hermit-abi 0.3.9", + "libc 0.2.177", + "windows-sys 0.48.0", +] + +[[package]] +name = "is-terminal" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "261f68e344040fbd0edea105bef17c66edf46f984ddb1115b775ce31be948f4b" +dependencies = [ + "hermit-abi 0.4.0", + "libc 0.2.177", + "windows-sys 0.52.0", +] + +[[package]] +name = "is_terminal_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" + +[[package]] +name = "jobserver" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" +dependencies = [ + "libc 0.2.177", +] + +[[package]] +name = "js-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "kernel32-sys" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" +dependencies = [ + "winapi 0.2.8", + "winapi-build", +] + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "lazycell" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" + +[[package]] +name = "libc" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e32a70cf75e5846d53a673923498228bbec6a8624708a9ea5645f075d6276122" + +[[package]] +name = "libc" +version = "0.2.177" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" + +[[package]] +name = "libdd-alloc" +version = "1.0.0" +source = "git+https://github.com/DataDog/libdatadog?tag=v24.0.2#d0393310c6e86ed7eb120c6cb6255f4f6eab1b9b" +dependencies = [ + "allocator-api2", + "libc 0.2.177", + "windows-sys 0.52.0", +] + +[[package]] +name = "libdd-common" +version = "1.0.0" +dependencies = [ + "anyhow", + "cc", + "const_format", + "futures", + "futures-core", + "futures-util", + "hex", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-rustls", + "hyper-util", + "indexmap 2.12.1", + "libc 0.2.177", + "maplit", + "nix", + "pin-project", + "regex", + "rustls", + "rustls-native-certs", + "serde", + "static_assertions", + "tempfile", + "thiserror 1.0.69", + "tokio", + "tokio-rustls", + "tower-service", + "windows-sys 0.52.0", +] + +[[package]] +name = "libdd-common" +version = "1.0.0" +source = "git+https://github.com/DataDog/libdatadog?tag=v24.0.2#d0393310c6e86ed7eb120c6cb6255f4f6eab1b9b" +dependencies = [ + "anyhow", + "cc", + "const_format", + "futures", + "futures-core", + "futures-util", + "hex", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-rustls", + "hyper-util", + "libc 0.2.177", + "nix", + "pin-project", + "regex", + "rustls", + "rustls-native-certs", + "serde", + "static_assertions", + "thiserror 1.0.69", + "tokio", + "tokio-rustls", + "tower-service", + "windows-sys 0.52.0", +] + +[[package]] +name = "libdd-common-ffi" +version = "0.0.1" +dependencies = [ + "anyhow", + "assert_no_alloc", + "bolero", + "build_common", + "chrono", + "crossbeam-queue", + "function_name", + "hyper", + "libdd-common 1.0.0", + "serde", +] + +[[package]] +name = "libdd-crashtracker" +version = "1.0.0" +dependencies = [ + "anyhow", + "backtrace", + "blazesym", + "cc", + "chrono", + "criterion", + "cxx", + "cxx-build", + "goblin", + "http", + "libc 0.2.177", + "libdd-common 1.0.0", + "libdd-telemetry", + "nix", + "num-derive", + "num-traits", + "os_info", + "page_size", + "portable-atomic", + "rand 0.8.5", + "schemars", + "serde", + "serde_json", + "symbolic-common", + "symbolic-demangle", + "tempfile", + "thiserror 1.0.69", + "tokio", + "uuid", + "windows 0.59.0", +] + +[[package]] +name = "libdd-crashtracker-ffi" +version = "0.0.1" +dependencies = [ + "anyhow", + "build_common", + "function_name", + "libc 0.2.177", + "libdd-common 1.0.0", + "libdd-common-ffi", + "libdd-crashtracker", + "serde", + "serde_json", + "symbolic-common", + "symbolic-demangle", + "tempfile", + "windows 0.59.0", +] + +[[package]] +name = "libdd-data-pipeline" +version = "1.0.0" +dependencies = [ + "anyhow", + "arc-swap", + "bytes", + "clap", + "criterion", + "either", + "http", + "http-body-util", + "httpmock", + "hyper", + "hyper-util", + "libdd-common 1.0.0", + "libdd-ddsketch", + "libdd-dogstatsd-client", + "libdd-log", + "libdd-telemetry", + "libdd-tinybytes", + "libdd-trace-protobuf", + "libdd-trace-stats", + "libdd-trace-utils", + "rand 0.8.5", + "regex", + "rmp-serde", + "serde", + "serde_json", + "sha2", + "tempfile", + "tokio", + "tokio-util", + "tracing", + "uuid", +] + +[[package]] +name = "libdd-ddsketch" +version = "1.0.0" +dependencies = [ + "prost", + "prost-build", + "protoc-bin-vendored", +] + +[[package]] +name = "libdd-dogstatsd-client" +version = "1.0.0" +dependencies = [ + "anyhow", + "cadence", + "http", + "libdd-common 1.0.0", + "serde", + "tokio", + "tracing", +] + +[[package]] +name = "libdd-library-config" +version = "1.0.0" dependencies = [ - "equivalent", - "hashbrown 0.15.2", + "anyhow", + "memfd", + "rand 0.8.5", + "rmp", + "rmp-serde", "serde", + "serde_yaml", + "tempfile", ] [[package]] -name = "integer-encoding" -version = "3.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bb03732005da905c88227371639bf1ad885cc712789c011c31c5fb3ab3ccf02" - -[[package]] -name = "io-lifetimes" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" +name = "libdd-library-config-ffi" +version = "0.0.2" dependencies = [ - "hermit-abi 0.3.9", - "libc 0.2.177", - "windows-sys 0.48.0", + "anyhow", + "build_common", + "constcat", + "libdd-common 1.0.0", + "libdd-common-ffi", + "libdd-library-config", + "tempfile", ] [[package]] -name = "is-terminal" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "261f68e344040fbd0edea105bef17c66edf46f984ddb1115b775ce31be948f4b" +name = "libdd-log" +version = "1.0.0" dependencies = [ - "hermit-abi 0.4.0", - "libc 0.2.177", - "windows-sys 0.52.0", + "chrono", + "tempfile", + "tracing", + "tracing-appender", + "tracing-subscriber", ] [[package]] -name = "is_terminal_polyfill" -version = "1.70.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" - -[[package]] -name = "itertools" -version = "0.10.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +name = "libdd-profiling" +version = "1.0.0" +source = "git+https://github.com/DataDog/libdatadog?tag=v24.0.2#d0393310c6e86ed7eb120c6cb6255f4f6eab1b9b" dependencies = [ - "either", + "anyhow", + "bitmaps", + "byteorder", + "bytes", + "chrono", + "futures", + "http", + "http-body-util", + "hyper", + "hyper-multipart-rfc7578", + "indexmap 2.12.1", + "libdd-alloc", + "libdd-common 1.0.0 (git+https://github.com/DataDog/libdatadog?tag=v24.0.2)", + "libdd-profiling-protobuf", + "lz4_flex", + "mime", + "prost", + "rustc-hash", + "serde", + "serde_json", + "target-triple", + "tokio", + "tokio-util", + "zstd", ] [[package]] -name = "itertools" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" +name = "libdd-profiling-protobuf" +version = "1.0.0" +source = "git+https://github.com/DataDog/libdatadog?tag=v24.0.2#d0393310c6e86ed7eb120c6cb6255f4f6eab1b9b" dependencies = [ - "either", + "prost", ] [[package]] -name = "itertools" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +name = "libdd-telemetry" +version = "1.0.0" dependencies = [ - "either", + "anyhow", + "base64 0.22.1", + "futures", + "hashbrown 0.15.2", + "http", + "http-body-util", + "hyper", + "hyper-util", + "libc 0.2.177", + "libdd-common 1.0.0", + "libdd-common-ffi", + "libdd-ddsketch", + "serde", + "serde_json", + "sys-info", + "tokio", + "tokio-util", + "tracing", + "tracing-subscriber", + "uuid", + "winver", ] [[package]] -name = "itoa" -version = "1.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" - -[[package]] -name = "jobserver" -version = "0.1.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" +name = "libdd-telemetry-ffi" +version = "0.0.1" dependencies = [ + "build_common", + "function_name", "libc 0.2.177", + "libdd-common 1.0.0", + "libdd-common-ffi", + "libdd-telemetry", + "paste", + "tempfile", ] [[package]] -name = "js-sys" -version = "0.3.77" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +name = "libdd-tinybytes" +version = "1.0.0" dependencies = [ + "libdd-tinybytes", "once_cell", - "wasm-bindgen", + "pretty_assertions", + "proptest", + "rmp-serde", + "serde", + "serde_json", + "test-case", ] [[package]] -name = "kernel32-sys" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" +name = "libdd-trace-normalization" +version = "1.0.0" dependencies = [ - "winapi 0.2.8", - "winapi-build", + "anyhow", + "arbitrary", + "criterion", + "duplicate", + "libdd-trace-protobuf", + "rand 0.8.5", ] [[package]] -name = "lazy_static" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" - -[[package]] -name = "lazycell" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" +name = "libdd-trace-protobuf" +version = "1.0.0" +dependencies = [ + "prost", + "prost-build", + "protoc-bin-vendored", + "serde", + "serde_bytes", + "serde_json", + "tokio", +] [[package]] -name = "libc" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e32a70cf75e5846d53a673923498228bbec6a8624708a9ea5645f075d6276122" +name = "libdd-trace-stats" +version = "1.0.0" +dependencies = [ + "criterion", + "hashbrown 0.15.2", + "libdd-ddsketch", + "libdd-trace-protobuf", + "libdd-trace-utils", + "rand 0.8.5", +] [[package]] -name = "libc" -version = "0.2.177" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" +name = "libdd-trace-utils" +version = "1.0.0" +dependencies = [ + "anyhow", + "bolero", + "bytes", + "cargo-platform", + "cargo_metadata", + "criterion", + "flate2", + "futures", + "http-body-util", + "httpmock", + "hyper", + "indexmap 2.12.1", + "libdd-common 1.0.0", + "libdd-tinybytes", + "libdd-trace-normalization", + "libdd-trace-protobuf", + "libdd-trace-utils", + "prost", + "rand 0.8.5", + "rmp", + "rmp-serde", + "rmpv", + "serde", + "serde_json", + "tempfile", + "tokio", + "tracing", + "urlencoding", + "zstd", +] [[package]] name = "libloading" @@ -2912,12 +2972,27 @@ version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" +[[package]] +name = "link-cplusplus" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f78c730aaa7d0b9336a299029ea49f9ee53b0ed06e9202e8cb7db9bae7b8c82" +dependencies = [ + "cc", +] + [[package]] name = "linux-raw-sys" version = "0.4.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" +[[package]] +name = "linux-raw-sys" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" + [[package]] name = "litemap" version = "0.7.4" @@ -2991,7 +3066,7 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b2cffa4ad52c6f791f4f8b15f0c05f9824b2ced1160e88cc393d64fff9a8ac64" dependencies = [ - "rustix", + "rustix 0.38.43", ] [[package]] @@ -3389,7 +3464,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" dependencies = [ "fixedbitset", - "indexmap 2.7.1", + "indexmap 2.12.1", ] [[package]] @@ -3541,7 +3616,7 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "059a34f111a9dee2ce1ac2826a68b24601c4298cfeb1a587c3cb493d5ab46f52" dependencies = [ - "libc 0.1.12", + "libc 0.2.177", "nix", ] @@ -3579,7 +3654,7 @@ checksum = "714c75db297bc88a63783ffc6ab9f830698a6705aa0201416931759ef4c8183d" dependencies = [ "autocfg", "equivalent", - "indexmap 2.7.1", + "indexmap 2.12.1", ] [[package]] @@ -4085,7 +4160,20 @@ dependencies = [ "bitflags 2.8.0", "errno", "libc 0.2.177", - "linux-raw-sys", + "linux-raw-sys 0.4.15", + "windows-sys 0.59.0", +] + +[[package]] +name = "rustix" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "146c9e247ccc180c1f61615433868c99f3de3ae256a30a43b49f67c2d9171f34" +dependencies = [ + "bitflags 2.8.0", + "errno", + "libc 0.2.177", + "linux-raw-sys 0.11.0", "windows-sys 0.59.0", ] @@ -4205,6 +4293,12 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +[[package]] +name = "scratch" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d68f2ec51b097e4c1a75b681a8bec621909b5e91f15bb7b840c4f2f7b01148b2" + [[package]] name = "scroll" version = "0.12.0" @@ -4269,10 +4363,11 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.217" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" dependencies = [ + "serde_core", "serde_derive", ] @@ -4285,11 +4380,20 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + [[package]] name = "serde_derive" -version = "1.0.217" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", @@ -4348,7 +4452,7 @@ dependencies = [ "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.7.1", + "indexmap 2.12.1", "serde", "serde_derive", "serde_json", @@ -4374,7 +4478,7 @@ version = "0.9.34+deprecated" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" dependencies = [ - "indexmap 2.7.1", + "indexmap 2.12.1", "itoa", "ryu", "serde", @@ -4691,15 +4795,14 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.15.0" +version = "3.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a8a559c81686f576e8cd0290cd2a24a2a9ad80c98b3478856500fcbd7acd704" +checksum = "655da9c7eb6305c55742045d5a8d2037996d61d8de95806335c7c86ce0f82e9c" dependencies = [ - "cfg-if", "fastrand", - "getrandom 0.2.15", + "getrandom 0.3.2", "once_cell", - "rustix", + "rustix 1.1.3", "windows-sys 0.59.0", ] @@ -4837,20 +4940,6 @@ dependencies = [ "time-core", ] -[[package]] -name = "tinybytes" -version = "0.0.1" -dependencies = [ - "once_cell", - "pretty_assertions", - "proptest", - "rmp-serde", - "serde", - "serde_json", - "test-case", - "tinybytes", -] - [[package]] name = "tinystr" version = "0.7.6" @@ -4981,7 +5070,7 @@ version = "0.20.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "70f427fce4d84c72b5b732388bf4a9f4531b53f74e2887e3ecb2481f68f66d81" dependencies = [ - "indexmap 2.7.1", + "indexmap 2.12.1", "toml_datetime", "winnow 0.5.40", ] @@ -4992,7 +5081,7 @@ version = "0.22.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" dependencies = [ - "indexmap 2.7.1", + "indexmap 2.12.1", "serde", "serde_spanned", "toml_datetime", @@ -5449,7 +5538,7 @@ dependencies = [ "either", "home", "once_cell", - "rustix", + "rustix 0.38.43", ] [[package]] diff --git a/components-rs/common.h b/components-rs/common.h index f74f8461d0..395882afdf 100644 --- a/components-rs/common.h +++ b/components-rs/common.h @@ -264,34 +264,6 @@ typedef struct _zend_string _zend_string; #define ddog_MultiTargetFetcher_DEFAULT_CLIENTS_LIMIT 100 -typedef enum ddog_ConfigurationOrigin { - DDOG_CONFIGURATION_ORIGIN_ENV_VAR, - DDOG_CONFIGURATION_ORIGIN_CODE, - DDOG_CONFIGURATION_ORIGIN_DD_CONFIG, - DDOG_CONFIGURATION_ORIGIN_REMOTE_CONFIG, - DDOG_CONFIGURATION_ORIGIN_DEFAULT, - DDOG_CONFIGURATION_ORIGIN_LOCAL_STABLE_CONFIG, - DDOG_CONFIGURATION_ORIGIN_FLEET_STABLE_CONFIG, -} ddog_ConfigurationOrigin; - -typedef enum ddog_DynamicConfigUpdateMode { - DDOG_DYNAMIC_CONFIG_UPDATE_MODE_READ, - DDOG_DYNAMIC_CONFIG_UPDATE_MODE_READ_WRITE, - DDOG_DYNAMIC_CONFIG_UPDATE_MODE_WRITE, - DDOG_DYNAMIC_CONFIG_UPDATE_MODE_RESTORE, -} ddog_DynamicConfigUpdateMode; - -typedef enum ddog_EvaluateAt { - DDOG_EVALUATE_AT_ENTRY, - DDOG_EVALUATE_AT_EXIT, -} ddog_EvaluateAt; - -typedef enum ddog_InBodyLocation { - DDOG_IN_BODY_LOCATION_NONE, - DDOG_IN_BODY_LOCATION_START, - DDOG_IN_BODY_LOCATION_END, -} ddog_InBodyLocation; - typedef enum ddog_Log { DDOG_LOG_ERROR = 1, DDOG_LOG_WARN = 2, @@ -306,6 +278,13 @@ typedef enum ddog_Log { DDOG_LOG_HOOK_TRACE = (5 | (4 << 4)), } ddog_Log; +typedef enum ddog_DynamicConfigUpdateMode { + DDOG_DYNAMIC_CONFIG_UPDATE_MODE_READ, + DDOG_DYNAMIC_CONFIG_UPDATE_MODE_READ_WRITE, + DDOG_DYNAMIC_CONFIG_UPDATE_MODE_WRITE, + DDOG_DYNAMIC_CONFIG_UPDATE_MODE_RESTORE, +} ddog_DynamicConfigUpdateMode; + typedef enum ddog_InBodyLocation { DDOG_IN_BODY_LOCATION_NONE, DDOG_IN_BODY_LOCATION_START, @@ -346,6 +325,7 @@ typedef enum ddog_ConfigurationOrigin { DDOG_CONFIGURATION_ORIGIN_DEFAULT, DDOG_CONFIGURATION_ORIGIN_LOCAL_STABLE_CONFIG, DDOG_CONFIGURATION_ORIGIN_FLEET_STABLE_CONFIG, + DDOG_CONFIGURATION_ORIGIN_CALCULATED, } ddog_ConfigurationOrigin; typedef enum ddog_MetricType { @@ -461,11 +441,11 @@ typedef struct ddog_SidecarTransport ddog_SidecarTransport; * Holds the raw parts of a Rust Vec; it should only be created from Rust, * never from C. */ -typedef struct ddog_Vec_CharSlice { - const ddog_CharSlice *ptr; +typedef struct ddog_Vec_CChar { + const char *ptr; uintptr_t len; uintptr_t capacity; -} ddog_Vec_CharSlice; +} ddog_Vec_CChar; typedef struct ddog_Tag { ddog_CharSlice name; @@ -478,20 +458,6 @@ typedef struct _zend_string *(*ddog_DynamicConfigUpdate)(ddog_CharSlice config, ddog_OwnedZendString value, enum ddog_DynamicConfigUpdateMode mode); -/** - * Holds the raw parts of a Rust Vec; it should only be created from Rust, - * never from C. - */ -typedef struct ddog_Vec_CChar { - const char *ptr; - uintptr_t len; - uintptr_t capacity; -} ddog_Vec_CChar; - -typedef struct ddog_Vec_CChar *(*ddog_DynamicConfigUpdate)(ddog_CharSlice config, - ddog_CharSlice value, - bool return_old); - typedef enum ddog_IntermediateValue_Tag { DDOG_INTERMEDIATE_VALUE_STRING, DDOG_INTERMEDIATE_VALUE_NUMBER, @@ -817,6 +783,7 @@ typedef enum ddog_FieldType { typedef enum ddog_DebuggerType { DDOG_DEBUGGER_TYPE_DIAGNOSTICS, + DDOG_DEBUGGER_TYPE_SNAPSHOTS, DDOG_DEBUGGER_TYPE_LOGS, } ddog_DebuggerType; @@ -989,6 +956,20 @@ typedef struct ddog_TelemetryWorkerBuilder ddog_TelemetryWorkerBuilder; */ typedef struct ddog_TelemetryWorkerHandle ddog_TelemetryWorkerHandle; +typedef enum ddog_Option_U64_Tag { + DDOG_OPTION_U64_SOME_U64, + DDOG_OPTION_U64_NONE_U64, +} ddog_Option_U64_Tag; + +typedef struct ddog_Option_U64 { + ddog_Option_U64_Tag tag; + union { + struct { + uint64_t some; + }; + }; +} ddog_Option_U64; + typedef enum ddog_Option_Bool_Tag { DDOG_OPTION_BOOL_SOME_BOOL, DDOG_OPTION_BOOL_NONE_BOOL, @@ -1014,11 +995,6 @@ typedef struct ddog_SpanEventBytes ddog_SpanEventBytes; typedef struct ddog_AttributeAnyValueBytes ddog_AttributeAnyValueBytes; typedef struct ddog_AttributeArrayValueBytes ddog_AttributeArrayValueBytes; -typedef enum ddog_DynamicInstrumentationConfigState { - DDOG_DYNAMIC_INSTRUMENTATION_CONFIG_STATE_ENABLED, - DDOG_DYNAMIC_INSTRUMENTATION_CONFIG_STATE_DISABLED, - DDOG_DYNAMIC_INSTRUMENTATION_CONFIG_STATE_NOT_SET, -} ddog_DynamicInstrumentationConfigState; typedef enum ddog_Method { DDOG_METHOD_GET = 0, @@ -1033,6 +1009,12 @@ typedef enum ddog_Method { DDOG_METHOD_OTHER = 9, } ddog_Method; +typedef enum ddog_DynamicInstrumentationConfigState { + DDOG_DYNAMIC_INSTRUMENTATION_CONFIG_STATE_ENABLED, + DDOG_DYNAMIC_INSTRUMENTATION_CONFIG_STATE_DISABLED, + DDOG_DYNAMIC_INSTRUMENTATION_CONFIG_STATE_NOT_SET, +} ddog_DynamicInstrumentationConfigState; + typedef struct ddog_AgentInfoReader ddog_AgentInfoReader; typedef struct ddog_AgentRemoteConfigReader ddog_AgentRemoteConfigReader; @@ -1112,37 +1094,28 @@ typedef struct ddog_SenderParameters { ddog_CharSlice url; } ddog_SenderParameters; -typedef enum ddog_crasht_BuildIdType { - DDOG_CRASHT_BUILD_ID_TYPE_GNU, - DDOG_CRASHT_BUILD_ID_TYPE_GO, - DDOG_CRASHT_BUILD_ID_TYPE_PDB, - DDOG_CRASHT_BUILD_ID_TYPE_SHA1, -} ddog_crasht_BuildIdType; - /** - * Result type for runtime callback registration + * Stacktrace collection occurs in the context of a crashing process. + * If the stack is sufficiently corruputed, it is possible (but unlikely), + * for stack trace collection itself to crash. + * We recommend fully enabling stacktrace collection, but having an environment + * variable to allow downgrading the collector. */ -typedef enum ddog_crasht_CallbackResult { - DDOG_CRASHT_CALLBACK_RESULT_OK, - DDOG_CRASHT_CALLBACK_RESULT_ERROR, -} ddog_crasht_CallbackResult; - -typedef enum ddog_crasht_DemangleOptions { - DDOG_CRASHT_DEMANGLE_OPTIONS_COMPLETE, - DDOG_CRASHT_DEMANGLE_OPTIONS_NAME_ONLY, -} ddog_crasht_DemangleOptions; - -typedef enum ddog_crasht_ErrorKind { - DDOG_CRASHT_ERROR_KIND_PANIC, - DDOG_CRASHT_ERROR_KIND_UNHANDLED_EXCEPTION, - DDOG_CRASHT_ERROR_KIND_UNIX_SIGNAL, -} ddog_crasht_ErrorKind; - -typedef enum ddog_crasht_FileType { - DDOG_CRASHT_FILE_TYPE_APK, - DDOG_CRASHT_FILE_TYPE_ELF, - DDOG_CRASHT_FILE_TYPE_PE, -} ddog_crasht_FileType; +typedef enum ddog_crasht_StacktraceCollection { + /** + * Stacktrace collection occurs in the + */ + DDOG_CRASHT_STACKTRACE_COLLECTION_DISABLED, + DDOG_CRASHT_STACKTRACE_COLLECTION_WITHOUT_SYMBOLS, + /** + * This option uses `backtrace::resolve_frame_unsynchronized()` to gather symbol information + * and also unwind inlined functions. Enabling this feature will not only provide symbolic + * details, but may also yield additional or less stack frames compared to other + * configurations. + */ + DDOG_CRASHT_STACKTRACE_COLLECTION_ENABLED_WITH_INPROCESS_SYMBOLS, + DDOG_CRASHT_STACKTRACE_COLLECTION_ENABLED_WITH_SYMBOLS_IN_RECEIVER, +} ddog_crasht_StacktraceCollection; /** * This enum represents operations a the tracked library might be engaged in. @@ -1263,6 +1236,14 @@ typedef enum ddog_crasht_DemangleOptions { DDOG_CRASHT_DEMANGLE_OPTIONS_NAME_ONLY, } ddog_crasht_DemangleOptions; +/** + * Result type for runtime callback registration + */ +typedef enum ddog_crasht_CallbackResult { + DDOG_CRASHT_CALLBACK_RESULT_OK, + DDOG_CRASHT_CALLBACK_RESULT_ERROR, +} ddog_crasht_CallbackResult; + typedef struct ddog_crasht_CrashInfo ddog_crasht_CrashInfo; typedef struct ddog_crasht_CrashInfoBuilder ddog_crasht_CrashInfoBuilder; @@ -1339,7 +1320,7 @@ typedef struct ddog_crasht_Config { /** * Timeout in milliseconds before the signal handler starts tearing things down to return. * If 0, uses the default timeout as specified in - * `datadog_crashtracker::shared::constants::DD_CRASHTRACK_DEFAULT_TIMEOUT`. Otherwise, uses + * `libdd_crashtracker::shared::constants::DD_CRASHTRACK_DEFAULT_TIMEOUT`. Otherwise, uses * the specified timeout value. * This is given as a uint32_t, but the actual timeout needs to fit inside of an i32 (max * 2^31-1). This is a limitation of the various interfaces used to guarantee the timeout. @@ -1459,13 +1440,17 @@ typedef struct ddog_crasht_CrashInfoBuilder_NewResult { }; } ddog_crasht_CrashInfoBuilder_NewResult; -typedef enum ddog_crasht_CrashInfo_NewResult_Tag { - DDOG_CRASHT_CRASH_INFO_NEW_RESULT_OK, - DDOG_CRASHT_CRASH_INFO_NEW_RESULT_ERR, -} ddog_crasht_CrashInfo_NewResult_Tag; +/** + * A generic result type for when an operation may fail, + * or may return in case of success. + */ +typedef enum ddog_crasht_Result_HandleCrashInfo_Tag { + DDOG_CRASHT_RESULT_HANDLE_CRASH_INFO_OK_HANDLE_CRASH_INFO, + DDOG_CRASHT_RESULT_HANDLE_CRASH_INFO_ERR_HANDLE_CRASH_INFO, +} ddog_crasht_Result_HandleCrashInfo_Tag; -typedef struct ddog_crasht_CrashInfo_NewResult { - ddog_crasht_CrashInfo_NewResult_Tag tag; +typedef struct ddog_crasht_Result_HandleCrashInfo { + ddog_crasht_Result_HandleCrashInfo_Tag tag; union { struct { struct ddog_crasht_Handle_CrashInfo ok; @@ -1474,7 +1459,9 @@ typedef struct ddog_crasht_CrashInfo_NewResult { struct ddog_Error err; }; }; -} ddog_crasht_CrashInfo_NewResult; +} ddog_crasht_Result_HandleCrashInfo; + +typedef struct ddog_crasht_Result_HandleCrashInfo ddog_crasht_CrashInfo_NewResult; typedef struct ddog_crasht_OsInfo { ddog_CharSlice architecture; diff --git a/components-rs/crashtracker.h b/components-rs/crashtracker.h index 58a93c1df5..96ed333d62 100644 --- a/components-rs/crashtracker.h +++ b/components-rs/crashtracker.h @@ -410,6 +410,16 @@ DDOG_CHECK_RETURN struct ddog_VoidResult ddog_crasht_CrashInfo_resolve_names(struct ddog_crasht_Handle_CrashInfo *crash_info, uint32_t pid); +/** + * # Safety + * The `crash_info` can be null, but if non-null it must point to a Builder made by this module, + * which has not previously been dropped. + * This function will: + */ +DDOG_CHECK_RETURN +struct ddog_VoidResult ddog_crasht_CrashInfo_enrich_callstacks(struct ddog_crasht_Handle_CrashInfo *crash_info, + uint32_t pid); + /** * # Safety * The `crash_info` can be null, but if non-null it must point to a Builder made by this module, @@ -441,7 +451,7 @@ void ddog_crasht_CrashInfoBuilder_drop(struct ddog_crasht_Handle_CrashInfoBuilde * which has not previously been dropped. */ DDOG_CHECK_RETURN -struct ddog_crasht_CrashInfo_NewResult ddog_crasht_CrashInfoBuilder_build(struct ddog_crasht_Handle_CrashInfoBuilder *builder); +ddog_crasht_CrashInfo_NewResult ddog_crasht_CrashInfoBuilder_build(struct ddog_crasht_Handle_CrashInfoBuilder *builder); /** * # Safety @@ -844,7 +854,7 @@ struct ddog_StringWrapperResult ddog_crasht_demangle(ddog_CharSlice name, * signal handler is dangerous, so we fork a sidecar to do the stuff we aren't * allowed to do in the handler. * - * See comments in [datadog-crashtracker/lib.rs] for a full architecture description. + * See comments in [libdd-crashtracker/lib.rs] for a full architecture description. * # Safety * No safety concerns */ @@ -858,7 +868,7 @@ DDOG_CHECK_RETURN struct ddog_VoidResult ddog_crasht_receiver_entry_point_stdin( * signal handler is dangerous, so we fork a sidecar to do the stuff we aren't * allowed to do in the handler. * - * See comments in [datadog-crashtracker/lib.rs] for a full architecture + * See comments in [libdd-crashtracker/lib.rs] for a full architecture * description. * # Safety * No safety concerns diff --git a/components-rs/ddtrace.h b/components-rs/ddtrace.h index e9f786a721..de7ea97972 100644 --- a/components-rs/ddtrace.h +++ b/components-rs/ddtrace.h @@ -1,6 +1,4 @@ struct _zend_string; - - #ifndef DDTRACE_PHP_H #define DDTRACE_PHP_H @@ -82,7 +80,7 @@ bool ddog_remote_configs_service_env_change(struct ddog_RemoteConfigState *remot bool ddog_remote_config_alter_dynamic_config(struct ddog_RemoteConfigState *remote_config, ddog_CharSlice config, - ddog_CharSlice new_value); + ddog_OwnedZendString new_value); void ddog_setup_remote_config(ddog_DynamicConfigUpdate update_config, const struct ddog_LiveDebuggerSetup *setup); @@ -112,7 +110,8 @@ ddog_MaybeError ddog_sidecar_connect_php(struct ddog_SidecarTransport **connecti const char *error_path, ddog_CharSlice log_level, bool enable_telemetry, - void (*on_reconnect)(struct ddog_SidecarTransport*)); + void (*on_reconnect)(struct ddog_SidecarTransport*), + const struct ddog_Endpoint *crashtracker_endpoint); void ddtrace_sidecar_reconnect(struct ddog_SidecarTransport **transport, struct ddog_SidecarTransport *(*factory)(void)); @@ -186,8 +185,9 @@ bool ddog_sidecar_telemetry_are_endpoints_collected(ddog_ShmCacheMap *cache, ddog_CharSlice service, ddog_CharSlice env); -void ddog_init_span_func(void (*free_func)(struct _zend_string*), - void (*addref_func)(struct _zend_string*)); +void ddog_init_span_func(void (*free_func)(ddog_OwnedZendString), + void (*addref_func)(struct _zend_string*), + ddog_OwnedZendString (*init_func)(ddog_CharSlice)); void ddog_set_span_service_zstr(ddog_SpanBytes *ptr, struct _zend_string *str); diff --git a/components-rs/sidecar.h b/components-rs/sidecar.h index defa992dec..76aa150c41 100644 --- a/components-rs/sidecar.h +++ b/components-rs/sidecar.h @@ -118,7 +118,8 @@ ddog_MaybeError ddog_sidecar_telemetry_enqueueConfig(struct ddog_SidecarTranspor ddog_CharSlice config_key, ddog_CharSlice config_value, enum ddog_ConfigurationOrigin origin, - ddog_CharSlice config_id); + ddog_CharSlice config_id, + struct ddog_Option_U64 seq_id); /** * Reports an endpoint to the telemetry. diff --git a/components-rs/telemetry.h b/components-rs/telemetry.h index fd8ffadcdb..5a6c6288ec 100644 --- a/components-rs/telemetry.h +++ b/components-rs/telemetry.h @@ -42,7 +42,8 @@ ddog_MaybeError ddog_telemetry_builder_with_config(struct ddog_TelemetryWorkerBu ddog_CharSlice name, ddog_CharSlice value, enum ddog_ConfigurationOrigin origin, - ddog_CharSlice config_id); + ddog_CharSlice config_id, + struct ddog_Option_U64 seq_id); /** * Builds the telemetry worker and return a handle to it diff --git a/components-rs/telemetry.rs b/components-rs/telemetry.rs index 3ec61e180b..1a230a268b 100644 --- a/components-rs/telemetry.rs +++ b/components-rs/telemetry.rs @@ -13,15 +13,15 @@ use datadog_sidecar::service::{ blocking::{self, SidecarTransport}, InstanceId, QueueId, SidecarAction, }; -use ddcommon::tag::parse_tags; -use ddcommon_ffi::slice::AsBytes; -use ddcommon_ffi::{self as ffi, CharSlice, MaybeError}; -use ddtelemetry::data; -use ddtelemetry::data::metrics::{MetricNamespace, MetricType}; -use ddtelemetry::data::{Dependency, Integration, LogLevel}; -use ddtelemetry::metrics::MetricContext; -use ddtelemetry::worker::{LogIdentifier, TelemetryActions}; -use ddtelemetry_ffi::try_c; +use libdd_common::tag::parse_tags; +use libdd_common_ffi::slice::AsBytes; +use libdd_common_ffi::{self as ffi, CharSlice, MaybeError}; +use libdd_telemetry::data; +use libdd_telemetry::data::metrics::{MetricNamespace, MetricType}; +use libdd_telemetry::data::{Dependency, Integration, LogLevel}; +use libdd_telemetry::metrics::MetricContext; +use libdd_telemetry::worker::{LogIdentifier, TelemetryActions}; +use libdd_telemetry_ffi::try_c; use std::error::Error; use std::hash::{Hash, Hasher}; use std::str::FromStr; diff --git a/libdatadog b/libdatadog index 436bbdf55e..801a248af8 160000 --- a/libdatadog +++ b/libdatadog @@ -1 +1 @@ -Subproject commit 436bbdf55e8f3de2b657eacde57252dede508d32 +Subproject commit 801a248af88047db9783e8e1f4a948c3f4f94d80 From dc0b8664a677c0fb7c2115401d7cdcf4441d50f4 Mon Sep 17 00:00:00 2001 From: Alejandro Estringana Ruiz Date: Tue, 30 Dec 2025 17:33:32 +0100 Subject: [PATCH 45/53] Point to latest libdatadog --- Cargo.lock | 127 +---------------------------------------------------- libdatadog | 2 +- 2 files changed, 2 insertions(+), 127 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4e8fc664de..58f3f331f5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -122,15 +122,6 @@ version = "1.0.98" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" -[[package]] -name = "arbitrary" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1" -dependencies = [ - "derive_arbitrary", -] - [[package]] name = "arc-swap" version = "1.7.1" @@ -165,12 +156,6 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b34d609dfbaf33d6889b2b7106d3ca345eacad44200913df5ba02bfd31d2ba9" -[[package]] -name = "assert_no_alloc" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55ca83137a482d61d916ceb1eba52a684f98004f18e0cafea230fe5579c178a3" - [[package]] name = "async-lock" version = "3.4.0" @@ -781,17 +766,6 @@ dependencies = [ "cc", ] -[[package]] -name = "codespan-reporting" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af491d569909a7e4dee0ad7db7f5341fef5c614d5b8ec8cf765732aba3cff681" -dependencies = [ - "serde", - "termcolor", - "unicode-width", -] - [[package]] name = "colorchoice" version = "1.0.3" @@ -1079,68 +1053,6 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a74858bcfe44b22016cb49337d7b6f04618c58e5dbfdef61b06b8c434324a0bc" -[[package]] -name = "cxx" -version = "1.0.192" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbda285ba6e5866529faf76352bdf73801d9b44a6308d7cd58ca2379f378e994" -dependencies = [ - "cc", - "cxx-build", - "cxxbridge-cmd", - "cxxbridge-flags", - "cxxbridge-macro", - "foldhash 0.2.0", - "link-cplusplus", -] - -[[package]] -name = "cxx-build" -version = "1.0.192" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af9efde466c5d532d57efd92f861da3bdb7f61e369128ce8b4c3fe0c9de4fa4d" -dependencies = [ - "cc", - "codespan-reporting", - "indexmap 2.12.1", - "proc-macro2", - "quote", - "scratch", - "syn 2.0.96", -] - -[[package]] -name = "cxxbridge-cmd" -version = "1.0.192" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3efb93799095bccd4f763ca07997dc39a69e5e61ab52d2c407d4988d21ce144d" -dependencies = [ - "clap", - "codespan-reporting", - "indexmap 2.12.1", - "proc-macro2", - "quote", - "syn 2.0.96", -] - -[[package]] -name = "cxxbridge-flags" -version = "1.0.192" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3092010228026e143b32a4463ed9fa8f86dca266af4bf5f3b2a26e113dbe4e45" - -[[package]] -name = "cxxbridge-macro" -version = "1.0.192" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31d72ebfcd351ae404fb00ff378dfc9571827a00722c9e735c9181aec320ba0a" -dependencies = [ - "indexmap 2.12.1", - "proc-macro2", - "quote", - "syn 2.0.96", -] - [[package]] name = "darling" version = "0.20.10" @@ -1472,17 +1384,6 @@ dependencies = [ "serde", ] -[[package]] -name = "derive_arbitrary" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e567bd82dcff979e4b03460c307b3cdc9e96fde3d73bed1496d2bc75d9dd62a" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.96", -] - [[package]] name = "diff" version = "0.1.13" @@ -1681,12 +1582,6 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" -[[package]] -name = "foldhash" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" - [[package]] name = "form_urlencoded" version = "1.2.1" @@ -1975,7 +1870,7 @@ checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" dependencies = [ "allocator-api2", "equivalent", - "foldhash 0.1.5", + "foldhash", ] [[package]] @@ -2627,12 +2522,10 @@ name = "libdd-common-ffi" version = "0.0.1" dependencies = [ "anyhow", - "assert_no_alloc", "bolero", "build_common", "chrono", "crossbeam-queue", - "function_name", "hyper", "libdd-common 1.0.0", "serde", @@ -2648,8 +2541,6 @@ dependencies = [ "cc", "chrono", "criterion", - "cxx", - "cxx-build", "goblin", "http", "libc 0.2.177", @@ -2889,7 +2780,6 @@ name = "libdd-trace-normalization" version = "1.0.0" dependencies = [ "anyhow", - "arbitrary", "criterion", "duplicate", "libdd-trace-protobuf", @@ -2972,15 +2862,6 @@ version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" -[[package]] -name = "link-cplusplus" -version = "1.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f78c730aaa7d0b9336a299029ea49f9ee53b0ed06e9202e8cb7db9bae7b8c82" -dependencies = [ - "cc", -] - [[package]] name = "linux-raw-sys" version = "0.4.15" @@ -4293,12 +4174,6 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" -[[package]] -name = "scratch" -version = "1.0.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d68f2ec51b097e4c1a75b681a8bec621909b5e91f15bb7b840c4f2f7b01148b2" - [[package]] name = "scroll" version = "0.12.0" diff --git a/libdatadog b/libdatadog index 801a248af8..42c1895a44 160000 --- a/libdatadog +++ b/libdatadog @@ -1 +1 @@ -Subproject commit 801a248af88047db9783e8e1f4a948c3f4f94d80 +Subproject commit 42c1895a44e000bd4de0efd54799f66b79632bac From 4dd7002afbdbf4a9a4d2058d3a552fcbbb054b4c Mon Sep 17 00:00:00 2001 From: Alejandro Estringana Ruiz Date: Fri, 2 Jan 2026 09:54:23 +0100 Subject: [PATCH 46/53] Remove debugging lines --- tests/Integrations/WordPress/V4_8/CommonScenariosTest.php | 4 ---- 1 file changed, 4 deletions(-) diff --git a/tests/Integrations/WordPress/V4_8/CommonScenariosTest.php b/tests/Integrations/WordPress/V4_8/CommonScenariosTest.php index d00f16ee30..0634aa074b 100644 --- a/tests/Integrations/WordPress/V4_8/CommonScenariosTest.php +++ b/tests/Integrations/WordPress/V4_8/CommonScenariosTest.php @@ -66,7 +66,6 @@ protected static function getTestedVersion($testedLibrary) public function testScenarioGetReturnString() { - var_dump("Alex 1"); $this->call( GetSpec::create( 'A simple GET request returning a string', @@ -74,7 +73,6 @@ public function testScenarioGetReturnString() ) ); - usleep(600000); $found_app_endpoints = false; $until = function ($request) use (&$found_app_endpoints) { if (strpos($request["body"] ?? "", "app-endpoints") !== false) { @@ -84,8 +82,6 @@ public function testScenarioGetReturnString() }; $response = $this->retrieveDumpedData($until); - var_dump("Alex 2"); - $endpoints = $this->readEndpointsTelemetry($response); $endpoints = isset($endpoints[0]) ? $endpoints[0] : []; $this->assertCount(2, $endpoints); From d0a543538c5985eb660dfd416e8c121f9b09622c Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Fri, 2 Jan 2026 12:16:34 +0100 Subject: [PATCH 47/53] Avoid failing tests to report success And skip timeout on local runs Signed-off-by: Bob Weinand --- Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 52376a9882..50aabe0dfb 100644 --- a/Makefile +++ b/Makefile @@ -1210,8 +1210,8 @@ define run_tests_debug (set -o pipefail; { $(call run_tests,$(1)) 2>&1 >&3 | \ tee >(grep --line-buffered -vE '\[ddtrace\] \[debug\]|\[ddtrace\] \[info\]' >&2) | \ { ! (grep --line-buffered -E '\[error\]|\[warning\]|\[deprecated\]' >/dev/null && \ - echo $$'\033[41m'"ERROR: Found debug log errors in the output."$$'\033[0m'); }; } 3>&1); \ - timeout 10 bash -c 'wait' 2>/dev/null || true + echo $$'\033[41m'"ERROR: Found debug log errors in the output."$$'\033[0m'); }; } 3>&1 \ + ) && ([ -n "${DD_TRACE_DOCKER_DEBUG}" ] || timeout 10 bash -c 'wait' 2>/dev/null || true) \ $(eval TEST_EXTRA_ENV=) endef From cfe36d1e8fc53819010c28ac38f3fde7825ff58a Mon Sep 17 00:00:00 2001 From: Alejandro Estringana Ruiz Date: Fri, 2 Jan 2026 16:39:30 +0100 Subject: [PATCH 48/53] Reduce telemetry heartbeat lapse --- tests/Integrations/Laravel/V4/TelemetryTest.php | 1 - tests/Integrations/Laravel/V5_7/TelemetryTest.php | 1 + tests/Integrations/Symfony/Latest/TelemetryTest.php | 1 + tests/Integrations/Symfony/V2_3/TelemetryTest.php | 1 + tests/Integrations/Symfony/V2_8/TelemetryTest.php | 1 + tests/Integrations/Symfony/V3_0/TelemetryTest.php | 1 + tests/Integrations/Symfony/V3_3/TelemetryTest.php | 1 + tests/Integrations/Symfony/V3_4/TelemetryTest.php | 1 + tests/Integrations/Symfony/V4_0/TelemetryTest.php | 1 + tests/Integrations/Symfony/V4_2/TelemetryTest.php | 1 + tests/Integrations/Symfony/V4_4/TelemetryTest.php | 1 + tests/Integrations/Symfony/V5_0/TelemetryTest.php | 1 + tests/Integrations/Symfony/V5_1/TelemetryTest.php | 1 + tests/Integrations/Symfony/V5_2/TelemetryTest.php | 1 + tests/Integrations/Symfony/V6_2/TelemetryTest.php | 1 + .../WordPress/V4_8/CommonScenariosTest.php | 11 ++++++----- 16 files changed, 20 insertions(+), 6 deletions(-) diff --git a/tests/Integrations/Laravel/V4/TelemetryTest.php b/tests/Integrations/Laravel/V4/TelemetryTest.php index 637df9f8d6..86e460ff56 100644 --- a/tests/Integrations/Laravel/V4/TelemetryTest.php +++ b/tests/Integrations/Laravel/V4/TelemetryTest.php @@ -59,7 +59,6 @@ public function testAppEndpointsAreSent() $this->resetRequestDumper(); $this->call(GetSpec::create("autoloaded", "/telemetry")); - usleep(500000); $response = $this->retrieveDumpedData($this->untilTelemetryRequest("app-endpoints"), true); $payloads = $this->readTelemetryPayloads($response); $endpointsPayloads = array_values(array_filter($payloads, function ($p) { return $p["request_type"] == "app-endpoints"; })); diff --git a/tests/Integrations/Laravel/V5_7/TelemetryTest.php b/tests/Integrations/Laravel/V5_7/TelemetryTest.php index afa4d978dd..61cbe2089f 100644 --- a/tests/Integrations/Laravel/V5_7/TelemetryTest.php +++ b/tests/Integrations/Laravel/V5_7/TelemetryTest.php @@ -22,6 +22,7 @@ protected static function getEnvs() 'DD_TRACE_AGENT_PORT' => 80, 'DD_AGENT_HOST' => 'request-replayer', 'DD_INSTRUMENTATION_TELEMETRY_ENABLED' => 1, + 'DD_TELEMETRY_HEARTBEAT_INTERVAL' => 10, ]); } diff --git a/tests/Integrations/Symfony/Latest/TelemetryTest.php b/tests/Integrations/Symfony/Latest/TelemetryTest.php index f962be19a9..34176f9c62 100644 --- a/tests/Integrations/Symfony/Latest/TelemetryTest.php +++ b/tests/Integrations/Symfony/Latest/TelemetryTest.php @@ -27,6 +27,7 @@ protected static function getEnvs() 'DD_TRACE_AGENT_PORT' => 80, 'DD_AGENT_HOST' => 'request-replayer', 'DD_INSTRUMENTATION_TELEMETRY_ENABLED' => 1, + 'DD_TELEMETRY_HEARTBEAT_INTERVAL' => 10, ]); } diff --git a/tests/Integrations/Symfony/V2_3/TelemetryTest.php b/tests/Integrations/Symfony/V2_3/TelemetryTest.php index 4874d75984..27d5f209c0 100644 --- a/tests/Integrations/Symfony/V2_3/TelemetryTest.php +++ b/tests/Integrations/Symfony/V2_3/TelemetryTest.php @@ -32,6 +32,7 @@ protected static function getEnvs() 'DD_TRACE_AGENT_PORT' => 80, 'DD_AGENT_HOST' => 'request-replayer', 'DD_INSTRUMENTATION_TELEMETRY_ENABLED' => 1, + 'DD_TELEMETRY_HEARTBEAT_INTERVAL' => 10, ]); } diff --git a/tests/Integrations/Symfony/V2_8/TelemetryTest.php b/tests/Integrations/Symfony/V2_8/TelemetryTest.php index b2093ace45..f3a6f76ce6 100644 --- a/tests/Integrations/Symfony/V2_8/TelemetryTest.php +++ b/tests/Integrations/Symfony/V2_8/TelemetryTest.php @@ -27,6 +27,7 @@ protected static function getEnvs() 'DD_TRACE_AGENT_PORT' => 80, 'DD_AGENT_HOST' => 'request-replayer', 'DD_INSTRUMENTATION_TELEMETRY_ENABLED' => 1, + 'DD_TELEMETRY_HEARTBEAT_INTERVAL' => 10, ]); } diff --git a/tests/Integrations/Symfony/V3_0/TelemetryTest.php b/tests/Integrations/Symfony/V3_0/TelemetryTest.php index 6b84f6d6dd..d13c0b893f 100644 --- a/tests/Integrations/Symfony/V3_0/TelemetryTest.php +++ b/tests/Integrations/Symfony/V3_0/TelemetryTest.php @@ -32,6 +32,7 @@ protected static function getEnvs() 'DD_TRACE_AGENT_PORT' => 80, 'DD_AGENT_HOST' => 'request-replayer', 'DD_INSTRUMENTATION_TELEMETRY_ENABLED' => 1, + 'DD_TELEMETRY_HEARTBEAT_INTERVAL' => 10, ]); } diff --git a/tests/Integrations/Symfony/V3_3/TelemetryTest.php b/tests/Integrations/Symfony/V3_3/TelemetryTest.php index efeddcb98f..66000abc65 100644 --- a/tests/Integrations/Symfony/V3_3/TelemetryTest.php +++ b/tests/Integrations/Symfony/V3_3/TelemetryTest.php @@ -32,6 +32,7 @@ protected static function getEnvs() 'DD_TRACE_AGENT_PORT' => 80, 'DD_AGENT_HOST' => 'request-replayer', 'DD_INSTRUMENTATION_TELEMETRY_ENABLED' => 1, + 'DD_TELEMETRY_HEARTBEAT_INTERVAL' => 10, ]); } diff --git a/tests/Integrations/Symfony/V3_4/TelemetryTest.php b/tests/Integrations/Symfony/V3_4/TelemetryTest.php index cb560c5399..9d429df83e 100644 --- a/tests/Integrations/Symfony/V3_4/TelemetryTest.php +++ b/tests/Integrations/Symfony/V3_4/TelemetryTest.php @@ -32,6 +32,7 @@ protected static function getEnvs() 'DD_TRACE_AGENT_PORT' => 80, 'DD_AGENT_HOST' => 'request-replayer', 'DD_INSTRUMENTATION_TELEMETRY_ENABLED' => 1, + 'DD_TELEMETRY_HEARTBEAT_INTERVAL' => 10, ]); } diff --git a/tests/Integrations/Symfony/V4_0/TelemetryTest.php b/tests/Integrations/Symfony/V4_0/TelemetryTest.php index f105b46fe3..8f1dc051b7 100644 --- a/tests/Integrations/Symfony/V4_0/TelemetryTest.php +++ b/tests/Integrations/Symfony/V4_0/TelemetryTest.php @@ -27,6 +27,7 @@ protected static function getEnvs() 'DD_TRACE_AGENT_PORT' => 80, 'DD_AGENT_HOST' => 'request-replayer', 'DD_INSTRUMENTATION_TELEMETRY_ENABLED' => 1, + 'DD_TELEMETRY_HEARTBEAT_INTERVAL' => 10, ]); } diff --git a/tests/Integrations/Symfony/V4_2/TelemetryTest.php b/tests/Integrations/Symfony/V4_2/TelemetryTest.php index 990ec3d791..6a469a6245 100644 --- a/tests/Integrations/Symfony/V4_2/TelemetryTest.php +++ b/tests/Integrations/Symfony/V4_2/TelemetryTest.php @@ -27,6 +27,7 @@ protected static function getEnvs() 'DD_TRACE_AGENT_PORT' => 80, 'DD_AGENT_HOST' => 'request-replayer', 'DD_INSTRUMENTATION_TELEMETRY_ENABLED' => 1, + 'DD_TELEMETRY_HEARTBEAT_INTERVAL' => 10, ]); } diff --git a/tests/Integrations/Symfony/V4_4/TelemetryTest.php b/tests/Integrations/Symfony/V4_4/TelemetryTest.php index 44f7b19551..30242d853d 100644 --- a/tests/Integrations/Symfony/V4_4/TelemetryTest.php +++ b/tests/Integrations/Symfony/V4_4/TelemetryTest.php @@ -27,6 +27,7 @@ protected static function getEnvs() 'DD_TRACE_AGENT_PORT' => 80, 'DD_AGENT_HOST' => 'request-replayer', 'DD_INSTRUMENTATION_TELEMETRY_ENABLED' => 1, + 'DD_TELEMETRY_HEARTBEAT_INTERVAL' => 10, ]); } diff --git a/tests/Integrations/Symfony/V5_0/TelemetryTest.php b/tests/Integrations/Symfony/V5_0/TelemetryTest.php index 45540fddc9..aa7e2760f8 100644 --- a/tests/Integrations/Symfony/V5_0/TelemetryTest.php +++ b/tests/Integrations/Symfony/V5_0/TelemetryTest.php @@ -27,6 +27,7 @@ protected static function getEnvs() 'DD_TRACE_AGENT_PORT' => 80, 'DD_AGENT_HOST' => 'request-replayer', 'DD_INSTRUMENTATION_TELEMETRY_ENABLED' => 1, + 'DD_TELEMETRY_HEARTBEAT_INTERVAL' => 10, ]); } diff --git a/tests/Integrations/Symfony/V5_1/TelemetryTest.php b/tests/Integrations/Symfony/V5_1/TelemetryTest.php index b43a1e910f..70a2d412c5 100644 --- a/tests/Integrations/Symfony/V5_1/TelemetryTest.php +++ b/tests/Integrations/Symfony/V5_1/TelemetryTest.php @@ -27,6 +27,7 @@ protected static function getEnvs() 'DD_TRACE_AGENT_PORT' => 80, 'DD_AGENT_HOST' => 'request-replayer', 'DD_INSTRUMENTATION_TELEMETRY_ENABLED' => 1, + 'DD_TELEMETRY_HEARTBEAT_INTERVAL' => 10, ]); } diff --git a/tests/Integrations/Symfony/V5_2/TelemetryTest.php b/tests/Integrations/Symfony/V5_2/TelemetryTest.php index 1c260c8edd..6cab9c28e4 100644 --- a/tests/Integrations/Symfony/V5_2/TelemetryTest.php +++ b/tests/Integrations/Symfony/V5_2/TelemetryTest.php @@ -27,6 +27,7 @@ protected static function getEnvs() 'DD_TRACE_AGENT_PORT' => 80, 'DD_AGENT_HOST' => 'request-replayer', 'DD_INSTRUMENTATION_TELEMETRY_ENABLED' => 1, + 'DD_TELEMETRY_HEARTBEAT_INTERVAL' => 10, ]); } diff --git a/tests/Integrations/Symfony/V6_2/TelemetryTest.php b/tests/Integrations/Symfony/V6_2/TelemetryTest.php index 6a30b2ddf7..70ea8c3e40 100644 --- a/tests/Integrations/Symfony/V6_2/TelemetryTest.php +++ b/tests/Integrations/Symfony/V6_2/TelemetryTest.php @@ -27,6 +27,7 @@ protected static function getEnvs() 'DD_TRACE_AGENT_PORT' => 80, 'DD_AGENT_HOST' => 'request-replayer', 'DD_INSTRUMENTATION_TELEMETRY_ENABLED' => 1, + 'DD_TELEMETRY_HEARTBEAT_INTERVAL' => 10, ]); } diff --git a/tests/Integrations/WordPress/V4_8/CommonScenariosTest.php b/tests/Integrations/WordPress/V4_8/CommonScenariosTest.php index 0634aa074b..379105117b 100644 --- a/tests/Integrations/WordPress/V4_8/CommonScenariosTest.php +++ b/tests/Integrations/WordPress/V4_8/CommonScenariosTest.php @@ -34,6 +34,7 @@ protected static function getEnvs() 'DD_AGENT_HOST' => 'request-replayer', 'DD_INSTRUMENTATION_TELEMETRY_ENABLED' => 1, 'DD_LOGS_INJECTION' => 'false', + 'DD_TELEMETRY_HEARTBEAT_INTERVAL' => 10, ]); } @@ -88,19 +89,19 @@ public function testScenarioGetReturnString() $first_endpoint = $endpoints[0]; $second_endpoint = $endpoints[1]; - if ($first_endpoint['path'] !== 'http://localhost/?p=1') { + if ($first_endpoint['path'] !== '/?p=1') { $first_endpoint = $endpoints[1]; $second_endpoint = $endpoints[0]; } - $this->assertSame('http://localhost/?p=1', $first_endpoint['path']); + $this->assertSame('/?p=1', $first_endpoint['path']); $this->assertSame('GET', $first_endpoint['method']); $this->assertSame('http.request', $first_endpoint['operation_name']); - $this->assertSame('GET http://localhost/?p=1', $first_endpoint['resource_name']); - $this->assertSame('http://localhost/?page_id=2', $second_endpoint['path']); + $this->assertSame('GET /?p=1', $first_endpoint['resource_name']); + $this->assertSame('/?page_id=2', $second_endpoint['path']); $this->assertSame('GET', $second_endpoint['method']); $this->assertSame('http.request', $second_endpoint['operation_name']); - $this->assertSame('GET http://localhost/?page_id=2', $second_endpoint['resource_name']); + $this->assertSame('GET /?page_id=2', $second_endpoint['resource_name']); } public function testScenarioGetWithView() From 0f3d6c60c840b0703971f040bdbe995e76c6b560 Mon Sep 17 00:00:00 2001 From: Alejandro Estringana Ruiz Date: Fri, 2 Jan 2026 17:03:40 +0100 Subject: [PATCH 49/53] Refactor test to avoid duplication --- .../Laravel/TelemetryTestSuite.php | 63 ++++++++++++++++ .../Integrations/Laravel/V4/TelemetryTest.php | 62 +--------------- .../Laravel/V5_7/TelemetryTest.php | 64 +--------------- .../Symfony/TelemetryTestSuite.php | 74 +++++++++++++++++++ .../Symfony/V2_3/TelemetryTest.php | 69 +---------------- .../Symfony/V2_8/TelemetryTest.php | 65 +--------------- .../Symfony/V3_0/TelemetryTest.php | 66 +---------------- .../Symfony/V3_3/TelemetryTest.php | 66 +---------------- .../Symfony/V3_4/TelemetryTest.php | 64 +--------------- .../Symfony/V4_0/TelemetryTest.php | 66 +---------------- .../Symfony/V4_2/TelemetryTest.php | 66 +---------------- .../Symfony/V4_4/TelemetryTest.php | 66 +---------------- .../Symfony/V5_0/TelemetryTest.php | 66 +---------------- .../Symfony/V5_1/TelemetryTest.php | 66 +---------------- .../Symfony/V5_2/TelemetryTest.php | 66 +---------------- .../Symfony/V6_2/TelemetryTest.php | 66 +---------------- 16 files changed, 166 insertions(+), 889 deletions(-) create mode 100644 tests/Integrations/Laravel/TelemetryTestSuite.php create mode 100644 tests/Integrations/Symfony/TelemetryTestSuite.php diff --git a/tests/Integrations/Laravel/TelemetryTestSuite.php b/tests/Integrations/Laravel/TelemetryTestSuite.php new file mode 100644 index 0000000000..5630a0a449 --- /dev/null +++ b/tests/Integrations/Laravel/TelemetryTestSuite.php @@ -0,0 +1,63 @@ + 'laravel_test_app', + 'DD_SERVICE' => 'laravel_test_app', + 'DD_TRACE_AGENT_PORT' => 80, + 'DD_AGENT_HOST' => 'request-replayer', + 'DD_INSTRUMENTATION_TELEMETRY_ENABLED' => 1, + 'DD_TELEMETRY_HEARTBEAT_INTERVAL' => 10, + ]); + } + + private function readTelemetryPayloads($response) + { + $telemetryPayloads = []; + foreach ($response as $request) { + if (strpos($request["uri"], "/telemetry/") === 0) { + $json = json_decode($request["body"], true); + $batch = $json["request_type"] == "message-batch" ? $json["payload"] : [$json]; + foreach ($batch as $innerJson) { + if (isset($json["application"])) { + $innerJson["application"] = $json["application"]; + } + $telemetryPayloads[] = $innerJson; + } + } + } + + // Filter the payloads from the trace background sender + return array_values($telemetryPayloads); + } + + public function testAppEndpointsAreSent() + { + $this->resetRequestDumper(); + + $this->call(GetSpec::create("autoloaded", "/telemetry")); + $response = $this->retrieveDumpedData($this->untilTelemetryRequest("app-endpoints"), true); + $payloads = $this->readTelemetryPayloads($response); + $endpointsPayloads = array_values(array_filter($payloads, function ($p) { return $p["request_type"] == "app-endpoints"; })); + + $this->assertCount(1, $endpointsPayloads); + + $endpointsPayload = $endpointsPayloads[0]; + $endpoints = $endpointsPayload["payload"]["endpoints"]; + $this->assertGreaterThan(0, $endpoints); + foreach ($endpoints as $endpoint) { + $this->assertNotEmpty($endpoint["path"]); + $this->assertNotEmpty($endpoint["method"]); + $this->assertEquals("http.request", $endpoint["operation_name"]); + $this->assertEquals($endpoint["method"] . " " . $endpoint["path"], $endpoint["resource_name"]); + } + } +} \ No newline at end of file diff --git a/tests/Integrations/Laravel/V4/TelemetryTest.php b/tests/Integrations/Laravel/V4/TelemetryTest.php index 86e460ff56..6517097457 100644 --- a/tests/Integrations/Laravel/V4/TelemetryTest.php +++ b/tests/Integrations/Laravel/V4/TelemetryTest.php @@ -2,10 +2,9 @@ namespace DDTrace\Tests\Integrations\Laravel\V4; -use DDTrace\Tests\Common\WebFrameworkTestCase; -use DDTrace\Tests\Frameworks\Util\Request\GetSpec; +use DDTrace\Tests\Integrations\Laravel\TelemetryTestSuite; -class TelemetryTest extends WebFrameworkTestCase +class TelemetryTest extends TelemetryTestSuite { public static $database = "laravel42"; @@ -14,65 +13,8 @@ public static function getAppIndexScript() return __DIR__ . '/../../../Frameworks/Laravel/Version_4_2/public/index.php'; } - protected static function getEnvs() - { - return array_merge(parent::getEnvs(), [ - 'APP_NAME' => 'laravel_test_app', - 'DD_SERVICE' => 'laravel_test_app', - 'DD_TRACE_AGENT_PORT' => 80, - 'DD_AGENT_HOST' => 'request-replayer', - 'DD_INSTRUMENTATION_TELEMETRY_ENABLED' => 1, - ]); - } - public static function getTestedLibrary() { return 'laravel/framework'; } - - private function readTelemetryPayloads($response) - { - $telemetryPayloads = []; - foreach ($response as $request) { - if (strpos($request["uri"], "/telemetry/") === 0) { - $json = json_decode($request["body"], true); - $batch = $json["request_type"] == "message-batch" ? $json["payload"] : [$json]; - foreach ($batch as $innerJson) { - if (isset($json["application"])) { - $innerJson["application"] = $json["application"]; - } - $telemetryPayloads[] = $innerJson; - } - } - } - - // Filter the payloads from the trace background sender - return array_values($telemetryPayloads); - } - - public function testAppEndpointsAreSent() - { - if (extension_loaded('xdebug')) { - $this->markTestSkipped('Xdebug extension is loaded'); - } - - $this->resetRequestDumper(); - - $this->call(GetSpec::create("autoloaded", "/telemetry")); - $response = $this->retrieveDumpedData($this->untilTelemetryRequest("app-endpoints"), true); - $payloads = $this->readTelemetryPayloads($response); - $endpointsPayloads = array_values(array_filter($payloads, function ($p) { return $p["request_type"] == "app-endpoints"; })); - - $this->assertCount(1, $endpointsPayloads); - - $endpointsPayload = $endpointsPayloads[0]; - $endpoints = $endpointsPayload["payload"]["endpoints"]; - $this->assertGreaterThan(0, $endpoints); - foreach ($endpoints as $endpoint) { - $this->assertNotEmpty($endpoint["path"]); - $this->assertNotEmpty($endpoint["method"]); - $this->assertEquals("http.request", $endpoint["operation_name"]); - $this->assertEquals($endpoint["method"] . " " . $endpoint["path"], $endpoint["resource_name"]); - } - } } \ No newline at end of file diff --git a/tests/Integrations/Laravel/V5_7/TelemetryTest.php b/tests/Integrations/Laravel/V5_7/TelemetryTest.php index 61cbe2089f..8b9299efa4 100644 --- a/tests/Integrations/Laravel/V5_7/TelemetryTest.php +++ b/tests/Integrations/Laravel/V5_7/TelemetryTest.php @@ -2,10 +2,9 @@ namespace DDTrace\Tests\Integrations\Laravel\V5_7; -use DDTrace\Tests\Common\WebFrameworkTestCase; -use DDTrace\Tests\Frameworks\Util\Request\GetSpec; +use DDTrace\Tests\Integrations\Laravel\TelemetryTestSuite; -class TelemetryTest extends WebFrameworkTestCase +class TelemetryTest extends TelemetryTestSuite { public static $database = "laravel57"; @@ -14,67 +13,8 @@ public static function getAppIndexScript() return __DIR__ . '/../../../Frameworks/Laravel/Version_5_7/public/index.php'; } - protected static function getEnvs() - { - return array_merge(parent::getEnvs(), [ - 'APP_NAME' => 'laravel_test_app', - 'DD_SERVICE' => 'laravel_test_app', - 'DD_TRACE_AGENT_PORT' => 80, - 'DD_AGENT_HOST' => 'request-replayer', - 'DD_INSTRUMENTATION_TELEMETRY_ENABLED' => 1, - 'DD_TELEMETRY_HEARTBEAT_INTERVAL' => 10, - ]); - } - public static function getTestedLibrary() { return 'laravel/framework'; } - - private function readTelemetryPayloads($response) - { - $telemetryPayloads = []; - foreach ($response as $request) { - if (strpos($request["uri"], "/telemetry/") === 0) { - $json = json_decode($request["body"], true); - $batch = $json["request_type"] == "message-batch" ? $json["payload"] : [$json]; - foreach ($batch as $innerJson) { - if (isset($json["application"])) { - $innerJson["application"] = $json["application"]; - } - $telemetryPayloads[] = $innerJson; - } - } - } - - // Filter the payloads from the trace background sender - return array_values($telemetryPayloads); - } - - public function testAppEndpointsAreSent() - { - if (extension_loaded('xdebug')) { - $this->markTestSkipped('Xdebug extension is loaded'); - } - - $this->resetRequestDumper(); - - $this->call(GetSpec::create("autoloaded", "/telemetry")); - usleep(500000); - $response = $this->retrieveDumpedData($this->untilTelemetryRequest("app-endpoints"), true); - $payloads = $this->readTelemetryPayloads($response); - $endpointsPayloads = array_values(array_filter($payloads, function ($p) { return $p["request_type"] == "app-endpoints"; })); - - $this->assertCount(1, $endpointsPayloads); - - $endpointsPayload = $endpointsPayloads[0]; - $endpoints = $endpointsPayload["payload"]["endpoints"]; - $this->assertGreaterThan(0, $endpoints); - foreach ($endpoints as $endpoint) { - $this->assertNotEmpty($endpoint["path"]); - $this->assertNotEmpty($endpoint["method"]); - $this->assertEquals("http.request", $endpoint["operation_name"]); - $this->assertEquals($endpoint["method"] . " " . $endpoint["path"], $endpoint["resource_name"]); - } - } } \ No newline at end of file diff --git a/tests/Integrations/Symfony/TelemetryTestSuite.php b/tests/Integrations/Symfony/TelemetryTestSuite.php new file mode 100644 index 0000000000..086ea0db72 --- /dev/null +++ b/tests/Integrations/Symfony/TelemetryTestSuite.php @@ -0,0 +1,74 @@ + 'symfony_test_app', + 'DD_TRACE_DEBUG' => 'true', + 'DD_SERVICE' => 'test_symfony_23', + 'DD_TRACE_AGENT_PORT' => 80, + 'DD_AGENT_HOST' => 'request-replayer', + 'DD_INSTRUMENTATION_TELEMETRY_ENABLED' => 1, + 'DD_TELEMETRY_HEARTBEAT_INTERVAL' => 10, + ]); + } + + private function readTelemetryPayloads($response) + { + $telemetryPayloads = []; + foreach ($response as $request) { + if (strpos($request["uri"], "/telemetry/") === 0) { + $json = json_decode($request["body"], true); + $batch = $json["request_type"] == "message-batch" ? $json["payload"] : [$json]; + foreach ($batch as $innerJson) { + if (isset($json["application"])) { + $innerJson["application"] = $json["application"]; + } + $telemetryPayloads[] = $innerJson; + } + } + } + + // Filter the payloads from the trace background sender + return array_values($telemetryPayloads); + } + + public function testAppEndpointsAreSent() + { + if (extension_loaded('xdebug')) { + $this->markTestSkipped('Xdebug extension is loaded'); + } + + $this->resetRequestDumper(); + + $this->call(GetSpec::create("telemetry", "/app.php/telemetry")); + + usleep(500000); + $response = $this->retrieveDumpedData($this->untilTelemetryRequest("app-endpoints"), true); + $payloads = $this->readTelemetryPayloads($response); + $endpointsPayloads = array_values(array_filter($payloads, function ($p) { return $p["request_type"] == "app-endpoints"; })); + + $this->assertCount(1, $endpointsPayloads); + + $endpointsPayload = $endpointsPayloads[0]; + $endpoints = $endpointsPayload["payload"]["endpoints"]; + $this->assertGreaterThan(0, $endpoints); + foreach ($endpoints as $endpoint) { + $this->assertNotEmpty($endpoint["path"]); + $this->assertNotEmpty($endpoint["method"]); + $this->assertEquals("http.request", $endpoint["operation_name"]); + $this->assertEquals($endpoint["method"] . " " . $endpoint["path"], $endpoint["resource_name"]); + } + } +} diff --git a/tests/Integrations/Symfony/V2_3/TelemetryTest.php b/tests/Integrations/Symfony/V2_3/TelemetryTest.php index 27d5f209c0..601fe1ba1a 100644 --- a/tests/Integrations/Symfony/V2_3/TelemetryTest.php +++ b/tests/Integrations/Symfony/V2_3/TelemetryTest.php @@ -2,11 +2,9 @@ namespace DDTrace\Tests\Integrations\Symfony\V2_3; -use DDTrace\Tests\Common\WebFrameworkTestCase; -use DDTrace\Tests\Frameworks\Util\Request\GetSpec; +use DDTrace\Tests\Integrations\Symfony\TelemetryTestSuite; - -class TelemetryTest extends WebFrameworkTestCase +class TelemetryTest extends TelemetryTestSuite { public static function getAppIndexScript() { @@ -21,66 +19,5 @@ public static function getTestedLibrary() protected static function getTestedVersion($testedLibrary) { return '2.3.42'; - } - - protected static function getEnvs() - { - return array_merge(parent::getEnvs(), [ - 'APP_NAME' => 'laravel_test_app', - 'DD_TRACE_DEBUG' => 'true', - 'DD_SERVICE' => 'test_symfony_23', - 'DD_TRACE_AGENT_PORT' => 80, - 'DD_AGENT_HOST' => 'request-replayer', - 'DD_INSTRUMENTATION_TELEMETRY_ENABLED' => 1, - 'DD_TELEMETRY_HEARTBEAT_INTERVAL' => 10, - ]); - } - - private function readTelemetryPayloads($response) - { - $telemetryPayloads = []; - foreach ($response as $request) { - if (strpos($request["uri"], "/telemetry/") === 0) { - $json = json_decode($request["body"], true); - $batch = $json["request_type"] == "message-batch" ? $json["payload"] : [$json]; - foreach ($batch as $innerJson) { - if (isset($json["application"])) { - $innerJson["application"] = $json["application"]; - } - $telemetryPayloads[] = $innerJson; - } - } - } - - // Filter the payloads from the trace background sender - return array_values($telemetryPayloads); - } - - public function testAppEndpointsAreSent() - { - if (extension_loaded('xdebug')) { - $this->markTestSkipped('Xdebug extension is loaded'); - } - - $this->resetRequestDumper(); - - $this->call(GetSpec::create("telemetry", "/app.php/telemetry")); - - usleep(500000); - $response = $this->retrieveDumpedData($this->untilTelemetryRequest("app-endpoints"), true); - $payloads = $this->readTelemetryPayloads($response); - $endpointsPayloads = array_values(array_filter($payloads, function ($p) { return $p["request_type"] == "app-endpoints"; })); - - $this->assertCount(1, $endpointsPayloads); - - $endpointsPayload = $endpointsPayloads[0]; - $endpoints = $endpointsPayload["payload"]["endpoints"]; - $this->assertGreaterThan(0, $endpoints); - foreach ($endpoints as $endpoint) { - $this->assertNotEmpty($endpoint["path"]); - $this->assertNotEmpty($endpoint["method"]); - $this->assertEquals("http.request", $endpoint["operation_name"]); - $this->assertEquals($endpoint["method"] . " " . $endpoint["path"], $endpoint["resource_name"]); - } - } + } } diff --git a/tests/Integrations/Symfony/V2_8/TelemetryTest.php b/tests/Integrations/Symfony/V2_8/TelemetryTest.php index f3a6f76ce6..d7089b9d4a 100644 --- a/tests/Integrations/Symfony/V2_8/TelemetryTest.php +++ b/tests/Integrations/Symfony/V2_8/TelemetryTest.php @@ -2,11 +2,10 @@ namespace DDTrace\Tests\Integrations\Symfony\V2_8; -use DDTrace\Tests\Common\WebFrameworkTestCase; -use DDTrace\Tests\Frameworks\Util\Request\GetSpec; +use DDTrace\Tests\Integrations\Symfony\TelemetryTestSuite; -class TelemetryTest extends WebFrameworkTestCase +class TelemetryTest extends TelemetryTestSuite { public static function getAppIndexScript() { @@ -17,64 +16,4 @@ public static function getTestedLibrary() { return 'symfony/framework-bundle'; } - - protected static function getEnvs() - { - return array_merge(parent::getEnvs(), [ - 'APP_NAME' => 'laravel_test_app', - 'DD_TRACE_DEBUG' => 'true', - 'DD_SERVICE' => 'test_symfony_28', - 'DD_TRACE_AGENT_PORT' => 80, - 'DD_AGENT_HOST' => 'request-replayer', - 'DD_INSTRUMENTATION_TELEMETRY_ENABLED' => 1, - 'DD_TELEMETRY_HEARTBEAT_INTERVAL' => 10, - ]); - } - - private function readTelemetryPayloads($response) - { - $telemetryPayloads = []; - foreach ($response as $request) { - if (strpos($request["uri"], "/telemetry/") === 0) { - $json = json_decode($request["body"], true); - $batch = $json["request_type"] == "message-batch" ? $json["payload"] : [$json]; - foreach ($batch as $innerJson) { - if (isset($json["application"])) { - $innerJson["application"] = $json["application"]; - } - $telemetryPayloads[] = $innerJson; - } - } - } - - // Filter the payloads from the trace background sender - return array_values($telemetryPayloads); - } - - public function testAppEndpointsAreSent() - { - if (extension_loaded('xdebug')) { - $this->markTestSkipped('Xdebug extension is loaded'); - } - - $this->resetRequestDumper(); - - $this->call(GetSpec::create("telemetry", "/app.php/telemetry")); - usleep(500000); - $response = $this->retrieveDumpedData($this->untilTelemetryRequest("app-endpoints"), true); - $payloads = $this->readTelemetryPayloads($response); - $endpointsPayloads = array_values(array_filter($payloads, function ($p) { return $p["request_type"] == "app-endpoints"; })); - - $this->assertCount(1, $endpointsPayloads); - - $endpointsPayload = $endpointsPayloads[0]; - $endpoints = $endpointsPayload["payload"]["endpoints"]; - $this->assertGreaterThan(0, $endpoints); - foreach ($endpoints as $endpoint) { - $this->assertNotEmpty($endpoint["path"]); - $this->assertNotEmpty($endpoint["method"]); - $this->assertEquals("http.request", $endpoint["operation_name"]); - $this->assertEquals($endpoint["method"] . " " . $endpoint["path"], $endpoint["resource_name"]); - } - } } diff --git a/tests/Integrations/Symfony/V3_0/TelemetryTest.php b/tests/Integrations/Symfony/V3_0/TelemetryTest.php index d13c0b893f..a392c528ba 100644 --- a/tests/Integrations/Symfony/V3_0/TelemetryTest.php +++ b/tests/Integrations/Symfony/V3_0/TelemetryTest.php @@ -2,11 +2,9 @@ namespace DDTrace\Tests\Integrations\Symfony\V3_0; -use DDTrace\Tests\Common\WebFrameworkTestCase; -use DDTrace\Tests\Frameworks\Util\Request\GetSpec; +use DDTrace\Tests\Integrations\Symfony\TelemetryTestSuite; - -class TelemetryTest extends WebFrameworkTestCase +class TelemetryTest extends TelemetryTestSuite { public static function getAppIndexScript() { @@ -22,64 +20,4 @@ protected static function getTestedVersion($testedLibrary) { return '3.0.9'; } - - protected static function getEnvs() - { - return array_merge(parent::getEnvs(), [ - 'APP_NAME' => 'laravel_test_app', - 'DD_TRACE_DEBUG' => 'true', - 'DD_SERVICE' => 'test_symfony_30', - 'DD_TRACE_AGENT_PORT' => 80, - 'DD_AGENT_HOST' => 'request-replayer', - 'DD_INSTRUMENTATION_TELEMETRY_ENABLED' => 1, - 'DD_TELEMETRY_HEARTBEAT_INTERVAL' => 10, - ]); - } - - private function readTelemetryPayloads($response) - { - $telemetryPayloads = []; - foreach ($response as $request) { - if (strpos($request["uri"], "/telemetry/") === 0) { - $json = json_decode($request["body"], true); - $batch = $json["request_type"] == "message-batch" ? $json["payload"] : [$json]; - foreach ($batch as $innerJson) { - if (isset($json["application"])) { - $innerJson["application"] = $json["application"]; - } - $telemetryPayloads[] = $innerJson; - } - } - } - - // Filter the payloads from the trace background sender - return array_values($telemetryPayloads); - } - - public function testAppEndpointsAreSent() - { - if (extension_loaded('xdebug')) { - $this->markTestSkipped('Xdebug extension is loaded'); - } - - $this->resetRequestDumper(); - - $this->call(GetSpec::create("telemetry", "/telemetry")); - usleep(500000); - $response = $this->retrieveDumpedData($this->untilTelemetryRequest("app-endpoints"), true); - $payloads = $this->readTelemetryPayloads($response); - $endpointsPayloads = array_values(array_filter($payloads, function ($p) { return $p["request_type"] == "app-endpoints"; })); - - $this->assertCount(1, $endpointsPayloads); - - $endpointsPayload = $endpointsPayloads[0]; - $endpoints = $endpointsPayload["payload"]["endpoints"]; - $this->assertGreaterThan(0, $endpoints); - foreach ($endpoints as $endpoint) { - $this->assertNotEmpty($endpoint["path"]); - $this->assertNotEmpty($endpoint["method"]); - $this->assertEquals("http.request", $endpoint["operation_name"]); - $this->assertEquals($endpoint["method"] . " " . $endpoint["path"], $endpoint["resource_name"]); - } - } } diff --git a/tests/Integrations/Symfony/V3_3/TelemetryTest.php b/tests/Integrations/Symfony/V3_3/TelemetryTest.php index 66000abc65..d4a8803bf7 100644 --- a/tests/Integrations/Symfony/V3_3/TelemetryTest.php +++ b/tests/Integrations/Symfony/V3_3/TelemetryTest.php @@ -2,11 +2,9 @@ namespace DDTrace\Tests\Integrations\Symfony\V3_3; -use DDTrace\Tests\Common\WebFrameworkTestCase; -use DDTrace\Tests\Frameworks\Util\Request\GetSpec; +use DDTrace\Tests\Integrations\Symfony\TelemetryTestSuite; - -class TelemetryTest extends WebFrameworkTestCase +class TelemetryTest extends TelemetryTestSuite { public static function getAppIndexScript() { @@ -22,64 +20,4 @@ protected static function getTestedVersion($testedLibrary) { return '3.3.18'; } - - protected static function getEnvs() - { - return array_merge(parent::getEnvs(), [ - 'APP_NAME' => 'laravel_test_app', - 'DD_TRACE_DEBUG' => 'true', - 'DD_SERVICE' => 'test_symfony_33', - 'DD_TRACE_AGENT_PORT' => 80, - 'DD_AGENT_HOST' => 'request-replayer', - 'DD_INSTRUMENTATION_TELEMETRY_ENABLED' => 1, - 'DD_TELEMETRY_HEARTBEAT_INTERVAL' => 10, - ]); - } - - private function readTelemetryPayloads($response) - { - $telemetryPayloads = []; - foreach ($response as $request) { - if (strpos($request["uri"], "/telemetry/") === 0) { - $json = json_decode($request["body"], true); - $batch = $json["request_type"] == "message-batch" ? $json["payload"] : [$json]; - foreach ($batch as $innerJson) { - if (isset($json["application"])) { - $innerJson["application"] = $json["application"]; - } - $telemetryPayloads[] = $innerJson; - } - } - } - - // Filter the payloads from the trace background sender - return array_values($telemetryPayloads); - } - - public function testAppEndpointsAreSent() - { - if (extension_loaded('xdebug')) { - $this->markTestSkipped('Xdebug extension is loaded'); - } - - $this->resetRequestDumper(); - - $this->call(GetSpec::create("telemetry", "/telemetry")); - usleep(500000); - $response = $this->retrieveDumpedData($this->untilTelemetryRequest("app-endpoints"), true); - $payloads = $this->readTelemetryPayloads($response); - $endpointsPayloads = array_values(array_filter($payloads, function ($p) { return $p["request_type"] == "app-endpoints"; })); - - $this->assertCount(1, $endpointsPayloads); - - $endpointsPayload = $endpointsPayloads[0]; - $endpoints = $endpointsPayload["payload"]["endpoints"]; - $this->assertGreaterThan(0, $endpoints); - foreach ($endpoints as $endpoint) { - $this->assertNotEmpty($endpoint["path"]); - $this->assertNotEmpty($endpoint["method"]); - $this->assertEquals("http.request", $endpoint["operation_name"]); - $this->assertEquals($endpoint["method"] . " " . $endpoint["path"], $endpoint["resource_name"]); - } - } } diff --git a/tests/Integrations/Symfony/V3_4/TelemetryTest.php b/tests/Integrations/Symfony/V3_4/TelemetryTest.php index 9d429df83e..05dea36009 100644 --- a/tests/Integrations/Symfony/V3_4/TelemetryTest.php +++ b/tests/Integrations/Symfony/V3_4/TelemetryTest.php @@ -2,11 +2,11 @@ namespace DDTrace\Tests\Integrations\Symfony\V3_4; -use DDTrace\Tests\Common\WebFrameworkTestCase; +use DDTrace\Tests\Integrations\Symfony\TelemetryTestSuite; use DDTrace\Tests\Frameworks\Util\Request\GetSpec; -class TelemetryTest extends WebFrameworkTestCase +class TelemetryTest extends TelemetryTestSuite { public static function getAppIndexScript() { @@ -22,64 +22,4 @@ protected static function getTestedVersion($testedLibrary) { return '3.3.47'; } - - protected static function getEnvs() - { - return array_merge(parent::getEnvs(), [ - 'APP_NAME' => 'laravel_test_app', - 'DD_TRACE_DEBUG' => 'true', - 'DD_SERVICE' => 'test_symfony_34', - 'DD_TRACE_AGENT_PORT' => 80, - 'DD_AGENT_HOST' => 'request-replayer', - 'DD_INSTRUMENTATION_TELEMETRY_ENABLED' => 1, - 'DD_TELEMETRY_HEARTBEAT_INTERVAL' => 10, - ]); - } - - private function readTelemetryPayloads($response) - { - $telemetryPayloads = []; - foreach ($response as $request) { - if (strpos($request["uri"], "/telemetry/") === 0) { - $json = json_decode($request["body"], true); - $batch = $json["request_type"] == "message-batch" ? $json["payload"] : [$json]; - foreach ($batch as $innerJson) { - if (isset($json["application"])) { - $innerJson["application"] = $json["application"]; - } - $telemetryPayloads[] = $innerJson; - } - } - } - - // Filter the payloads from the trace background sender - return array_values($telemetryPayloads); - } - - public function testAppEndpointsAreSent() - { - if (extension_loaded('xdebug')) { - $this->markTestSkipped('Xdebug extension is loaded'); - } - - $this->resetRequestDumper(); - - $this->call(GetSpec::create("telemetry", "/telemetry")); - usleep(500000); - $response = $this->retrieveDumpedData($this->untilTelemetryRequest("app-endpoints"), true); - $payloads = $this->readTelemetryPayloads($response); - $endpointsPayloads = array_values(array_filter($payloads, function ($p) { return $p["request_type"] == "app-endpoints"; })); - - $this->assertCount(1, $endpointsPayloads); - - $endpointsPayload = $endpointsPayloads[0]; - $endpoints = $endpointsPayload["payload"]["endpoints"]; - $this->assertGreaterThan(0, $endpoints); - foreach ($endpoints as $endpoint) { - $this->assertNotEmpty($endpoint["path"]); - $this->assertNotEmpty($endpoint["method"]); - $this->assertEquals("http.request", $endpoint["operation_name"]); - $this->assertEquals($endpoint["method"] . " " . $endpoint["path"], $endpoint["resource_name"]); - } - } } diff --git a/tests/Integrations/Symfony/V4_0/TelemetryTest.php b/tests/Integrations/Symfony/V4_0/TelemetryTest.php index 8f1dc051b7..1f3df5bc92 100644 --- a/tests/Integrations/Symfony/V4_0/TelemetryTest.php +++ b/tests/Integrations/Symfony/V4_0/TelemetryTest.php @@ -2,11 +2,9 @@ namespace DDTrace\Tests\Integrations\Symfony\V4_0; -use DDTrace\Tests\Common\WebFrameworkTestCase; -use DDTrace\Tests\Frameworks\Util\Request\GetSpec; +use DDTrace\Tests\Integrations\Symfony\TelemetryTestSuite; - -class TelemetryTest extends WebFrameworkTestCase +class TelemetryTest extends TelemetryTestSuite { public static function getAppIndexScript() { @@ -17,64 +15,4 @@ public static function getTestedLibrary() { return 'symfony/framework-bundle'; } - - protected static function getEnvs() - { - return array_merge(parent::getEnvs(), [ - 'APP_NAME' => 'laravel_test_app', - 'DD_TRACE_DEBUG' => 'true', - 'DD_SERVICE' => 'test_symfony_40', - 'DD_TRACE_AGENT_PORT' => 80, - 'DD_AGENT_HOST' => 'request-replayer', - 'DD_INSTRUMENTATION_TELEMETRY_ENABLED' => 1, - 'DD_TELEMETRY_HEARTBEAT_INTERVAL' => 10, - ]); - } - - private function readTelemetryPayloads($response) - { - $telemetryPayloads = []; - foreach ($response as $request) { - if (strpos($request["uri"], "/telemetry/") === 0) { - $json = json_decode($request["body"], true); - $batch = $json["request_type"] == "message-batch" ? $json["payload"] : [$json]; - foreach ($batch as $innerJson) { - if (isset($json["application"])) { - $innerJson["application"] = $json["application"]; - } - $telemetryPayloads[] = $innerJson; - } - } - } - - // Filter the payloads from the trace background sender - return array_values($telemetryPayloads); - } - - public function testAppEndpointsAreSent() - { - if (extension_loaded('xdebug')) { - $this->markTestSkipped('Xdebug extension is loaded'); - } - - $this->resetRequestDumper(); - - $this->call(GetSpec::create("telemetry", "/telemetry")); - usleep(500000); - $response = $this->retrieveDumpedData($this->untilTelemetryRequest("app-endpoints"), true); - $payloads = $this->readTelemetryPayloads($response); - $endpointsPayloads = array_values(array_filter($payloads, function ($p) { return $p["request_type"] == "app-endpoints"; })); - - $this->assertCount(1, $endpointsPayloads); - - $endpointsPayload = $endpointsPayloads[0]; - $endpoints = $endpointsPayload["payload"]["endpoints"]; - $this->assertGreaterThan(0, $endpoints); - foreach ($endpoints as $endpoint) { - $this->assertNotEmpty($endpoint["path"]); - $this->assertNotEmpty($endpoint["method"]); - $this->assertEquals("http.request", $endpoint["operation_name"]); - $this->assertEquals($endpoint["method"] . " " . $endpoint["path"], $endpoint["resource_name"]); - } - } } diff --git a/tests/Integrations/Symfony/V4_2/TelemetryTest.php b/tests/Integrations/Symfony/V4_2/TelemetryTest.php index 6a469a6245..29bf8111ea 100644 --- a/tests/Integrations/Symfony/V4_2/TelemetryTest.php +++ b/tests/Integrations/Symfony/V4_2/TelemetryTest.php @@ -2,11 +2,9 @@ namespace DDTrace\Tests\Integrations\Symfony\V4_2; -use DDTrace\Tests\Common\WebFrameworkTestCase; -use DDTrace\Tests\Frameworks\Util\Request\GetSpec; +use DDTrace\Tests\Integrations\Symfony\TelemetryTestSuite; - -class TelemetryTest extends WebFrameworkTestCase +class TelemetryTest extends TelemetryTestSuite { public static function getAppIndexScript() { @@ -17,64 +15,4 @@ public static function getTestedLibrary() { return 'symfony/framework-bundle'; } - - protected static function getEnvs() - { - return array_merge(parent::getEnvs(), [ - 'APP_NAME' => 'laravel_test_app', - 'DD_TRACE_DEBUG' => 'true', - 'DD_SERVICE' => 'test_symfony_42', - 'DD_TRACE_AGENT_PORT' => 80, - 'DD_AGENT_HOST' => 'request-replayer', - 'DD_INSTRUMENTATION_TELEMETRY_ENABLED' => 1, - 'DD_TELEMETRY_HEARTBEAT_INTERVAL' => 10, - ]); - } - - private function readTelemetryPayloads($response) - { - $telemetryPayloads = []; - foreach ($response as $request) { - if (strpos($request["uri"], "/telemetry/") === 0) { - $json = json_decode($request["body"], true); - $batch = $json["request_type"] == "message-batch" ? $json["payload"] : [$json]; - foreach ($batch as $innerJson) { - if (isset($json["application"])) { - $innerJson["application"] = $json["application"]; - } - $telemetryPayloads[] = $innerJson; - } - } - } - - // Filter the payloads from the trace background sender - return array_values($telemetryPayloads); - } - - public function testAppEndpointsAreSent() - { - if (extension_loaded('xdebug')) { - $this->markTestSkipped('Xdebug extension is loaded'); - } - - $this->resetRequestDumper(); - - $this->call(GetSpec::create("telemetry", "/telemetry")); - usleep(500000); - $response = $this->retrieveDumpedData($this->untilTelemetryRequest("app-endpoints"), true); - $payloads = $this->readTelemetryPayloads($response); - $endpointsPayloads = array_values(array_filter($payloads, function ($p) { return $p["request_type"] == "app-endpoints"; })); - - $this->assertCount(1, $endpointsPayloads); - - $endpointsPayload = $endpointsPayloads[0]; - $endpoints = $endpointsPayload["payload"]["endpoints"]; - $this->assertGreaterThan(0, $endpoints); - foreach ($endpoints as $endpoint) { - $this->assertNotEmpty($endpoint["path"]); - $this->assertNotEmpty($endpoint["method"]); - $this->assertEquals("http.request", $endpoint["operation_name"]); - $this->assertEquals($endpoint["method"] . " " . $endpoint["path"], $endpoint["resource_name"]); - } - } } diff --git a/tests/Integrations/Symfony/V4_4/TelemetryTest.php b/tests/Integrations/Symfony/V4_4/TelemetryTest.php index 30242d853d..7cf0f4c03f 100644 --- a/tests/Integrations/Symfony/V4_4/TelemetryTest.php +++ b/tests/Integrations/Symfony/V4_4/TelemetryTest.php @@ -2,11 +2,9 @@ namespace DDTrace\Tests\Integrations\Symfony\V4_4; -use DDTrace\Tests\Common\WebFrameworkTestCase; -use DDTrace\Tests\Frameworks\Util\Request\GetSpec; +use DDTrace\Tests\Integrations\Symfony\TelemetryTestSuite; - -class TelemetryTest extends WebFrameworkTestCase +class TelemetryTest extends TelemetryTestSuite { public static function getAppIndexScript() { @@ -17,64 +15,4 @@ public static function getTestedLibrary() { return 'symfony/framework-bundle'; } - - protected static function getEnvs() - { - return array_merge(parent::getEnvs(), [ - 'APP_NAME' => 'laravel_test_app', - 'DD_TRACE_DEBUG' => 'true', - 'DD_SERVICE' => 'test_symfony_44', - 'DD_TRACE_AGENT_PORT' => 80, - 'DD_AGENT_HOST' => 'request-replayer', - 'DD_INSTRUMENTATION_TELEMETRY_ENABLED' => 1, - 'DD_TELEMETRY_HEARTBEAT_INTERVAL' => 10, - ]); - } - - private function readTelemetryPayloads($response) - { - $telemetryPayloads = []; - foreach ($response as $request) { - if (strpos($request["uri"], "/telemetry/") === 0) { - $json = json_decode($request["body"], true); - $batch = $json["request_type"] == "message-batch" ? $json["payload"] : [$json]; - foreach ($batch as $innerJson) { - if (isset($json["application"])) { - $innerJson["application"] = $json["application"]; - } - $telemetryPayloads[] = $innerJson; - } - } - } - - // Filter the payloads from the trace background sender - return array_values($telemetryPayloads); - } - - public function testAppEndpointsAreSent() - { - if (extension_loaded('xdebug')) { - $this->markTestSkipped('Xdebug extension is loaded'); - } - - $this->resetRequestDumper(); - - $this->call(GetSpec::create("telemetry", "/telemetry")); - usleep(500000); - $response = $this->retrieveDumpedData($this->untilTelemetryRequest("app-endpoints"), true); - $payloads = $this->readTelemetryPayloads($response); - $endpointsPayloads = array_values(array_filter($payloads, function ($p) { return $p["request_type"] == "app-endpoints"; })); - - $this->assertCount(1, $endpointsPayloads); - - $endpointsPayload = $endpointsPayloads[0]; - $endpoints = $endpointsPayload["payload"]["endpoints"]; - $this->assertGreaterThan(0, $endpoints); - foreach ($endpoints as $endpoint) { - $this->assertNotEmpty($endpoint["path"]); - $this->assertNotEmpty($endpoint["method"]); - $this->assertEquals("http.request", $endpoint["operation_name"]); - $this->assertEquals($endpoint["method"] . " " . $endpoint["path"], $endpoint["resource_name"]); - } - } } diff --git a/tests/Integrations/Symfony/V5_0/TelemetryTest.php b/tests/Integrations/Symfony/V5_0/TelemetryTest.php index aa7e2760f8..05f5b4b6b4 100644 --- a/tests/Integrations/Symfony/V5_0/TelemetryTest.php +++ b/tests/Integrations/Symfony/V5_0/TelemetryTest.php @@ -2,11 +2,9 @@ namespace DDTrace\Tests\Integrations\Symfony\V5_0; -use DDTrace\Tests\Common\WebFrameworkTestCase; -use DDTrace\Tests\Frameworks\Util\Request\GetSpec; +use DDTrace\Tests\Integrations\Symfony\TelemetryTestSuite; - -class TelemetryTest extends WebFrameworkTestCase +class TelemetryTest extends TelemetryTestSuite { public static function getAppIndexScript() { @@ -17,64 +15,4 @@ public static function getTestedLibrary() { return 'symfony/framework-bundle'; } - - protected static function getEnvs() - { - return array_merge(parent::getEnvs(), [ - 'APP_NAME' => 'laravel_test_app', - 'DD_TRACE_DEBUG' => 'true', - 'DD_SERVICE' => 'test_symfony_50', - 'DD_TRACE_AGENT_PORT' => 80, - 'DD_AGENT_HOST' => 'request-replayer', - 'DD_INSTRUMENTATION_TELEMETRY_ENABLED' => 1, - 'DD_TELEMETRY_HEARTBEAT_INTERVAL' => 10, - ]); - } - - private function readTelemetryPayloads($response) - { - $telemetryPayloads = []; - foreach ($response as $request) { - if (strpos($request["uri"], "/telemetry/") === 0) { - $json = json_decode($request["body"], true); - $batch = $json["request_type"] == "message-batch" ? $json["payload"] : [$json]; - foreach ($batch as $innerJson) { - if (isset($json["application"])) { - $innerJson["application"] = $json["application"]; - } - $telemetryPayloads[] = $innerJson; - } - } - } - - // Filter the payloads from the trace background sender - return array_values($telemetryPayloads); - } - - public function testAppEndpointsAreSent() - { - if (extension_loaded('xdebug')) { - $this->markTestSkipped('Xdebug extension is loaded'); - } - - $this->resetRequestDumper(); - - $this->call(GetSpec::create("telemetry", "/telemetry")); - usleep(500000); - $response = $this->retrieveDumpedData($this->untilTelemetryRequest("app-endpoints"), true); - $payloads = $this->readTelemetryPayloads($response); - $endpointsPayloads = array_values(array_filter($payloads, function ($p) { return $p["request_type"] == "app-endpoints"; })); - - $this->assertCount(1, $endpointsPayloads); - - $endpointsPayload = $endpointsPayloads[0]; - $endpoints = $endpointsPayload["payload"]["endpoints"]; - $this->assertGreaterThan(0, $endpoints); - foreach ($endpoints as $endpoint) { - $this->assertNotEmpty($endpoint["path"]); - $this->assertNotEmpty($endpoint["method"]); - $this->assertEquals("http.request", $endpoint["operation_name"]); - $this->assertEquals($endpoint["method"] . " " . $endpoint["path"], $endpoint["resource_name"]); - } - } } diff --git a/tests/Integrations/Symfony/V5_1/TelemetryTest.php b/tests/Integrations/Symfony/V5_1/TelemetryTest.php index 70a2d412c5..2ad2807264 100644 --- a/tests/Integrations/Symfony/V5_1/TelemetryTest.php +++ b/tests/Integrations/Symfony/V5_1/TelemetryTest.php @@ -2,11 +2,9 @@ namespace DDTrace\Tests\Integrations\Symfony\V5_1; -use DDTrace\Tests\Common\WebFrameworkTestCase; -use DDTrace\Tests\Frameworks\Util\Request\GetSpec; +use DDTrace\Tests\Integrations\Symfony\TelemetryTestSuite; - -class TelemetryTest extends WebFrameworkTestCase +class TelemetryTest extends TelemetryTestSuite { public static function getAppIndexScript() { @@ -17,64 +15,4 @@ public static function getTestedLibrary() { return 'symfony/framework-bundle'; } - - protected static function getEnvs() - { - return array_merge(parent::getEnvs(), [ - 'APP_NAME' => 'laravel_test_app', - 'DD_TRACE_DEBUG' => 'true', - 'DD_SERVICE' => 'test_symfony_51', - 'DD_TRACE_AGENT_PORT' => 80, - 'DD_AGENT_HOST' => 'request-replayer', - 'DD_INSTRUMENTATION_TELEMETRY_ENABLED' => 1, - 'DD_TELEMETRY_HEARTBEAT_INTERVAL' => 10, - ]); - } - - private function readTelemetryPayloads($response) - { - $telemetryPayloads = []; - foreach ($response as $request) { - if (strpos($request["uri"], "/telemetry/") === 0) { - $json = json_decode($request["body"], true); - $batch = $json["request_type"] == "message-batch" ? $json["payload"] : [$json]; - foreach ($batch as $innerJson) { - if (isset($json["application"])) { - $innerJson["application"] = $json["application"]; - } - $telemetryPayloads[] = $innerJson; - } - } - } - - // Filter the payloads from the trace background sender - return array_values($telemetryPayloads); - } - - public function testAppEndpointsAreSent() - { - if (extension_loaded('xdebug')) { - $this->markTestSkipped('Xdebug extension is loaded'); - } - - $this->resetRequestDumper(); - - $this->call(GetSpec::create("telemetry", "/telemetry")); - usleep(500000); - $response = $this->retrieveDumpedData($this->untilTelemetryRequest("app-endpoints"), true); - $payloads = $this->readTelemetryPayloads($response); - $endpointsPayloads = array_values(array_filter($payloads, function ($p) { return $p["request_type"] == "app-endpoints"; })); - - $this->assertCount(1, $endpointsPayloads); - - $endpointsPayload = $endpointsPayloads[0]; - $endpoints = $endpointsPayload["payload"]["endpoints"]; - $this->assertGreaterThan(0, $endpoints); - foreach ($endpoints as $endpoint) { - $this->assertNotEmpty($endpoint["path"]); - $this->assertNotEmpty($endpoint["method"]); - $this->assertEquals("http.request", $endpoint["operation_name"]); - $this->assertEquals($endpoint["method"] . " " . $endpoint["path"], $endpoint["resource_name"]); - } - } } diff --git a/tests/Integrations/Symfony/V5_2/TelemetryTest.php b/tests/Integrations/Symfony/V5_2/TelemetryTest.php index 6cab9c28e4..3b3aaf7585 100644 --- a/tests/Integrations/Symfony/V5_2/TelemetryTest.php +++ b/tests/Integrations/Symfony/V5_2/TelemetryTest.php @@ -2,11 +2,9 @@ namespace DDTrace\Tests\Integrations\Symfony\V5_2; -use DDTrace\Tests\Common\WebFrameworkTestCase; -use DDTrace\Tests\Frameworks\Util\Request\GetSpec; +use DDTrace\Tests\Integrations\Symfony\TelemetryTestSuite; - -class TelemetryTest extends WebFrameworkTestCase +class TelemetryTest extends TelemetryTestSuite { public static function getAppIndexScript() { @@ -17,64 +15,4 @@ public static function getTestedLibrary() { return 'symfony/framework-bundle'; } - - protected static function getEnvs() - { - return array_merge(parent::getEnvs(), [ - 'APP_NAME' => 'laravel_test_app', - 'DD_TRACE_DEBUG' => 'true', - 'DD_SERVICE' => 'test_symfony_52', - 'DD_TRACE_AGENT_PORT' => 80, - 'DD_AGENT_HOST' => 'request-replayer', - 'DD_INSTRUMENTATION_TELEMETRY_ENABLED' => 1, - 'DD_TELEMETRY_HEARTBEAT_INTERVAL' => 10, - ]); - } - - private function readTelemetryPayloads($response) - { - $telemetryPayloads = []; - foreach ($response as $request) { - if (strpos($request["uri"], "/telemetry/") === 0) { - $json = json_decode($request["body"], true); - $batch = $json["request_type"] == "message-batch" ? $json["payload"] : [$json]; - foreach ($batch as $innerJson) { - if (isset($json["application"])) { - $innerJson["application"] = $json["application"]; - } - $telemetryPayloads[] = $innerJson; - } - } - } - - // Filter the payloads from the trace background sender - return array_values($telemetryPayloads); - } - - public function testAppEndpointsAreSent() - { - if (extension_loaded('xdebug')) { - $this->markTestSkipped('Xdebug extension is loaded'); - } - - $this->resetRequestDumper(); - - $this->call(GetSpec::create("telemetry", "/telemetry")); - usleep(500000); - $response = $this->retrieveDumpedData($this->untilTelemetryRequest("app-endpoints"), true); - $payloads = $this->readTelemetryPayloads($response); - $endpointsPayloads = array_values(array_filter($payloads, function ($p) { return $p["request_type"] == "app-endpoints"; })); - - $this->assertCount(1, $endpointsPayloads); - - $endpointsPayload = $endpointsPayloads[0]; - $endpoints = $endpointsPayload["payload"]["endpoints"]; - $this->assertGreaterThan(0, $endpoints); - foreach ($endpoints as $endpoint) { - $this->assertNotEmpty($endpoint["path"]); - $this->assertNotEmpty($endpoint["method"]); - $this->assertEquals("http.request", $endpoint["operation_name"]); - $this->assertEquals($endpoint["method"] . " " . $endpoint["path"], $endpoint["resource_name"]); - } - } } diff --git a/tests/Integrations/Symfony/V6_2/TelemetryTest.php b/tests/Integrations/Symfony/V6_2/TelemetryTest.php index 70ea8c3e40..1fc44672ed 100644 --- a/tests/Integrations/Symfony/V6_2/TelemetryTest.php +++ b/tests/Integrations/Symfony/V6_2/TelemetryTest.php @@ -2,11 +2,9 @@ namespace DDTrace\Tests\Integrations\Symfony\V6_2; -use DDTrace\Tests\Common\WebFrameworkTestCase; -use DDTrace\Tests\Frameworks\Util\Request\GetSpec; +use DDTrace\Tests\Integrations\Symfony\TelemetryTestSuite; - -class TelemetryTest extends WebFrameworkTestCase +class TelemetryTest extends TelemetryTestSuite { public static function getAppIndexScript() { @@ -17,64 +15,4 @@ public static function getTestedLibrary() { return 'symfony/framework-bundle'; } - - protected static function getEnvs() - { - return array_merge(parent::getEnvs(), [ - 'APP_NAME' => 'laravel_test_app', - 'DD_TRACE_DEBUG' => 'true', - 'DD_SERVICE' => 'test_symfony_62', - 'DD_TRACE_AGENT_PORT' => 80, - 'DD_AGENT_HOST' => 'request-replayer', - 'DD_INSTRUMENTATION_TELEMETRY_ENABLED' => 1, - 'DD_TELEMETRY_HEARTBEAT_INTERVAL' => 10, - ]); - } - - private function readTelemetryPayloads($response) - { - $telemetryPayloads = []; - foreach ($response as $request) { - if (strpos($request["uri"], "/telemetry/") === 0) { - $json = json_decode($request["body"], true); - $batch = $json["request_type"] == "message-batch" ? $json["payload"] : [$json]; - foreach ($batch as $innerJson) { - if (isset($json["application"])) { - $innerJson["application"] = $json["application"]; - } - $telemetryPayloads[] = $innerJson; - } - } - } - - // Filter the payloads from the trace background sender - return array_values($telemetryPayloads); - } - - public function testAppEndpointsAreSent() - { - if (extension_loaded('xdebug')) { - $this->markTestSkipped('Xdebug extension is loaded'); - } - - $this->resetRequestDumper(); - - $this->call(GetSpec::create("telemetry", "/telemetry")); - usleep(500000); - $response = $this->retrieveDumpedData($this->untilTelemetryRequest("app-endpoints"), true); - $payloads = $this->readTelemetryPayloads($response); - $endpointsPayloads = array_values(array_filter($payloads, function ($p) { return $p["request_type"] == "app-endpoints"; })); - - $this->assertCount(1, $endpointsPayloads); - - $endpointsPayload = $endpointsPayloads[0]; - $endpoints = $endpointsPayload["payload"]["endpoints"]; - $this->assertGreaterThan(0, $endpoints); - foreach ($endpoints as $endpoint) { - $this->assertNotEmpty($endpoint["path"]); - $this->assertNotEmpty($endpoint["method"]); - $this->assertEquals("http.request", $endpoint["operation_name"]); - $this->assertEquals($endpoint["method"] . " " . $endpoint["path"], $endpoint["resource_name"]); - } - } } From e84351f57f3d745749c4c4bb69d299b844fdb05a Mon Sep 17 00:00:00 2001 From: Alejandro Estringana Ruiz Date: Fri, 2 Jan 2026 17:48:33 +0100 Subject: [PATCH 50/53] Test wordpress --- .../WordPress/TelemetryTestSuite.php | 79 +++++++++++++++++++ .../WordPress/V4_8/TelemetryTest.php | 22 ++++++ .../WordPress/V5_5/TelemetryTest.php | 23 ++++++ .../WordPress/V5_9/TelemetryTest.php | 22 ++++++ .../WordPress/V6_1/TelemetryTest.php | 18 +++++ 5 files changed, 164 insertions(+) create mode 100644 tests/Integrations/WordPress/TelemetryTestSuite.php create mode 100644 tests/Integrations/WordPress/V4_8/TelemetryTest.php create mode 100644 tests/Integrations/WordPress/V5_5/TelemetryTest.php create mode 100644 tests/Integrations/WordPress/V5_9/TelemetryTest.php create mode 100644 tests/Integrations/WordPress/V6_1/TelemetryTest.php diff --git a/tests/Integrations/WordPress/TelemetryTestSuite.php b/tests/Integrations/WordPress/TelemetryTestSuite.php new file mode 100644 index 0000000000..60cf1493e2 --- /dev/null +++ b/tests/Integrations/WordPress/TelemetryTestSuite.php @@ -0,0 +1,79 @@ + 'wordpress_test_app', + 'DD_TRACE_WORDPRESS_CALLBACKS' => '0', + 'DD_TRACE_MYSQLI_ENABLED' => '0', + 'DD_TRACE_AGENT_PORT' => 80, + 'DD_AGENT_HOST' => 'request-replayer', + 'DD_INSTRUMENTATION_TELEMETRY_ENABLED' => 1, + 'DD_LOGS_INJECTION' => 'false', + 'DD_TELEMETRY_HEARTBEAT_INTERVAL' => 10, + ]); + } + + private function readEndpointsTelemetry($response) + { + $telemetryPayloads = []; + foreach ($response as $request) { + if (strpos($request["uri"], "/telemetry/") === 0) { + $json = json_decode($request["body"], true); + $batch = $json["request_type"] == "message-batch" ? $json["payload"] : [$json]; + foreach ($batch as $innerJson) { + if (isset($innerJson["request_type"]) && $innerJson["request_type"] == "app-endpoints") { + $telemetryPayloads[] = $innerJson["payload"]["endpoints"]; + } + } + } + } + return $telemetryPayloads; + } + + public function testAppEndpointsAreSent() + { + $this->call( + GetSpec::create( + 'A simple GET request returning a string', + '/simple?key=value&pwd=should_redact' + ) + ); + + $found_app_endpoints = false; + $until = function ($request) use (&$found_app_endpoints) { + if (strpos($request["body"] ?? "", "app-endpoints") !== false) { + $found_app_endpoints = true; + } + return $found_app_endpoints; + }; + $response = $this->retrieveDumpedData($until); + + $endpoints = $this->readEndpointsTelemetry($response); + $endpoints = isset($endpoints[0]) ? $endpoints[0] : []; + $this->assertCount(2, $endpoints); + + $first_endpoint = $endpoints[0]; + $second_endpoint = $endpoints[1]; + if ($first_endpoint['path'] !== '/?p=1') { + $first_endpoint = $endpoints[1]; + $second_endpoint = $endpoints[0]; + } + + $this->assertSame('/?p=1', $first_endpoint['path']); + $this->assertSame('GET', $first_endpoint['method']); + $this->assertSame('http.request', $first_endpoint['operation_name']); + $this->assertSame('GET /?p=1', $first_endpoint['resource_name']); + $this->assertSame('/?page_id=2', $second_endpoint['path']); + $this->assertSame('GET', $second_endpoint['method']); + $this->assertSame('http.request', $second_endpoint['operation_name']); + $this->assertSame('GET /?page_id=2', $second_endpoint['resource_name']); + } +} diff --git a/tests/Integrations/WordPress/V4_8/TelemetryTest.php b/tests/Integrations/WordPress/V4_8/TelemetryTest.php new file mode 100644 index 0000000000..49684fd4f7 --- /dev/null +++ b/tests/Integrations/WordPress/V4_8/TelemetryTest.php @@ -0,0 +1,22 @@ + Date: Mon, 5 Jan 2026 10:35:15 +0100 Subject: [PATCH 51/53] Fix telemetry --- tests/Integrations/Symfony/TelemetryTestSuite.php | 7 ++++++- tests/Integrations/Symfony/V2_3/TelemetryTest.php | 7 ++++++- tests/Integrations/Symfony/V2_8/TelemetryTest.php | 5 +++++ 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/tests/Integrations/Symfony/TelemetryTestSuite.php b/tests/Integrations/Symfony/TelemetryTestSuite.php index 086ea0db72..fac9a1b6e7 100644 --- a/tests/Integrations/Symfony/TelemetryTestSuite.php +++ b/tests/Integrations/Symfony/TelemetryTestSuite.php @@ -52,7 +52,7 @@ public function testAppEndpointsAreSent() $this->resetRequestDumper(); - $this->call(GetSpec::create("telemetry", "/app.php/telemetry")); + $this->call(GetSpec::create("telemetry", $this->getBase() . "/telemetry")); usleep(500000); $response = $this->retrieveDumpedData($this->untilTelemetryRequest("app-endpoints"), true); @@ -71,4 +71,9 @@ public function testAppEndpointsAreSent() $this->assertEquals($endpoint["method"] . " " . $endpoint["path"], $endpoint["resource_name"]); } } + + protected function getBase() + { + return '/'; + } } diff --git a/tests/Integrations/Symfony/V2_3/TelemetryTest.php b/tests/Integrations/Symfony/V2_3/TelemetryTest.php index 601fe1ba1a..2f9b382cab 100644 --- a/tests/Integrations/Symfony/V2_3/TelemetryTest.php +++ b/tests/Integrations/Symfony/V2_3/TelemetryTest.php @@ -19,5 +19,10 @@ public static function getTestedLibrary() protected static function getTestedVersion($testedLibrary) { return '2.3.42'; - } + } + + protected function getBase() + { + return '/app.php'; + } } diff --git a/tests/Integrations/Symfony/V2_8/TelemetryTest.php b/tests/Integrations/Symfony/V2_8/TelemetryTest.php index d7089b9d4a..2dcb2c293a 100644 --- a/tests/Integrations/Symfony/V2_8/TelemetryTest.php +++ b/tests/Integrations/Symfony/V2_8/TelemetryTest.php @@ -16,4 +16,9 @@ public static function getTestedLibrary() { return 'symfony/framework-bundle'; } + + protected function getBase() + { + return '/app.php'; + } } From 940648b7461574b2c5bb4b9f9147b04a9741809f Mon Sep 17 00:00:00 2001 From: Alejandro Estringana Ruiz Date: Wed, 7 Jan 2026 13:44:17 +0100 Subject: [PATCH 52/53] Exclude symfony 4 from getting endpoints at startup --- .../Symfony/SymfonyIntegration.php | 2 +- .../Symfony/TelemetryTestSuite.php | 4 ++-- .../Symfony/V4_0/TelemetryTest.php | 18 ------------------ .../Symfony/V4_2/TelemetryTest.php | 18 ------------------ .../Symfony/V4_4/TelemetryTest.php | 18 ------------------ 5 files changed, 3 insertions(+), 57 deletions(-) delete mode 100644 tests/Integrations/Symfony/V4_0/TelemetryTest.php delete mode 100644 tests/Integrations/Symfony/V4_2/TelemetryTest.php delete mode 100644 tests/Integrations/Symfony/V4_4/TelemetryTest.php diff --git a/src/DDTrace/Integrations/Symfony/SymfonyIntegration.php b/src/DDTrace/Integrations/Symfony/SymfonyIntegration.php index 2718b0e755..fc0d70a8e5 100644 --- a/src/DDTrace/Integrations/Symfony/SymfonyIntegration.php +++ b/src/DDTrace/Integrations/Symfony/SymfonyIntegration.php @@ -589,7 +589,7 @@ static function(HookData $hook) use ($controllerName) { } } - if (self::$frameworkPrefix === SymfonyIntegration::NAME && self::$kernel !== null && !\DDTrace\are_endpoints_collected()) + if (strpos(self::$kernel::VERSION, '4.') !== 0 && self::$frameworkPrefix === SymfonyIntegration::NAME && self::$kernel !== null && !\DDTrace\are_endpoints_collected()) { /** @var ContainerInterface $container */ $container = self::$kernel->getContainer(); diff --git a/tests/Integrations/Symfony/TelemetryTestSuite.php b/tests/Integrations/Symfony/TelemetryTestSuite.php index fac9a1b6e7..c99decfc99 100644 --- a/tests/Integrations/Symfony/TelemetryTestSuite.php +++ b/tests/Integrations/Symfony/TelemetryTestSuite.php @@ -16,7 +16,7 @@ protected static function getEnvs() return array_merge(parent::getEnvs(), [ 'APP_NAME' => 'symfony_test_app', 'DD_TRACE_DEBUG' => 'true', - 'DD_SERVICE' => 'test_symfony_23', + 'DD_SERVICE' => 'test_symfony', 'DD_TRACE_AGENT_PORT' => 80, 'DD_AGENT_HOST' => 'request-replayer', 'DD_INSTRUMENTATION_TELEMETRY_ENABLED' => 1, @@ -74,6 +74,6 @@ public function testAppEndpointsAreSent() protected function getBase() { - return '/'; + return ''; } } diff --git a/tests/Integrations/Symfony/V4_0/TelemetryTest.php b/tests/Integrations/Symfony/V4_0/TelemetryTest.php deleted file mode 100644 index 1f3df5bc92..0000000000 --- a/tests/Integrations/Symfony/V4_0/TelemetryTest.php +++ /dev/null @@ -1,18 +0,0 @@ - Date: Wed, 7 Jan 2026 16:12:26 +0100 Subject: [PATCH 53/53] Fix wordpress tests --- .../WordPress/TelemetryTestSuite.php | 45 ++++++++++++------- .../WordPress/V4_8/TelemetryTest.php | 18 ++++++++ 2 files changed, 47 insertions(+), 16 deletions(-) diff --git a/tests/Integrations/WordPress/TelemetryTestSuite.php b/tests/Integrations/WordPress/TelemetryTestSuite.php index 60cf1493e2..f5987743dd 100644 --- a/tests/Integrations/WordPress/TelemetryTestSuite.php +++ b/tests/Integrations/WordPress/TelemetryTestSuite.php @@ -21,7 +21,7 @@ protected static function getEnvs() ]); } - private function readEndpointsTelemetry($response) + protected function readEndpointsTelemetry($response) { $telemetryPayloads = []; foreach ($response as $request) { @@ -38,6 +38,28 @@ private function readEndpointsTelemetry($response) return $telemetryPayloads; } + protected function expectedEndpoints() { + return [ + [ + "method" => "GET", + "operation_name" => "http.request", + "path" => "/?page_id=2", + "resource_name" => "GET /?page_id=2", + ], + [ + "method" => "GET", + "operation_name" => "http.request", + "path" => "/?p=1", + "resource_name" => "GET /?p=1", + ], + [ + "method" => "GET", + "operation_name" => "http.request", + "path" => "/?p=5", + "resource_name" => "GET /?p=5", + ] + ]; + } public function testAppEndpointsAreSent() { $this->call( @@ -58,22 +80,13 @@ public function testAppEndpointsAreSent() $endpoints = $this->readEndpointsTelemetry($response); $endpoints = isset($endpoints[0]) ? $endpoints[0] : []; - $this->assertCount(2, $endpoints); - $first_endpoint = $endpoints[0]; - $second_endpoint = $endpoints[1]; - if ($first_endpoint['path'] !== '/?p=1') { - $first_endpoint = $endpoints[1]; - $second_endpoint = $endpoints[0]; - } + $expected_endpoints = $this->expectedEndpoints(); - $this->assertSame('/?p=1', $first_endpoint['path']); - $this->assertSame('GET', $first_endpoint['method']); - $this->assertSame('http.request', $first_endpoint['operation_name']); - $this->assertSame('GET /?p=1', $first_endpoint['resource_name']); - $this->assertSame('/?page_id=2', $second_endpoint['path']); - $this->assertSame('GET', $second_endpoint['method']); - $this->assertSame('http.request', $second_endpoint['operation_name']); - $this->assertSame('GET /?page_id=2', $second_endpoint['resource_name']); + $this->assertCount(count($expected_endpoints), $endpoints); + + foreach ($expected_endpoints as $expected_endpoint) { + $this->assertContains($expected_endpoint, $endpoints); + } } } diff --git a/tests/Integrations/WordPress/V4_8/TelemetryTest.php b/tests/Integrations/WordPress/V4_8/TelemetryTest.php index 49684fd4f7..bf40bea842 100644 --- a/tests/Integrations/WordPress/V4_8/TelemetryTest.php +++ b/tests/Integrations/WordPress/V4_8/TelemetryTest.php @@ -2,6 +2,7 @@ namespace DDTrace\Tests\Integrations\WordPress\V4_8; +use DDTrace\Tests\Frameworks\Util\Request\GetSpec; use DDTrace\Tests\Integrations\WordPress\TelemetryTestSuite; /** @@ -19,4 +20,21 @@ public static function getAppIndexScript() protected function databaseDump() { return file_get_contents(__DIR__ . '/../../../Frameworks/WordPress/Version_4_8/wp_2019-10-01.sql'); } + + protected function expectedEndpoints() { + return [ + [ + "method" => "GET", + "operation_name" => "http.request", + "path" => "/?p=1", + "resource_name" => "GET /?p=1", + ], + [ + "method" => "GET", + "operation_name" => "http.request", + "path" => "/?page_id=2", + "resource_name" => "GET /?page_id=2", + ] + ]; + } }