From ab8e68cc98dff7529188e89d4e82884dc6c250f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gustavo=20Andr=C3=A9=20dos=20Santos=20Lopes?= Date: Fri, 24 Jul 2026 16:12:52 +0100 Subject: [PATCH] Fix memory leak on roadrunner/frankenphp/etc due to appsec telemetry --- ext/telemetry.c | 17 ++++++++++++++++- ext/telemetry.h | 1 + tracer/user_request.c | 3 +++ 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/ext/telemetry.c b/ext/telemetry.c index 94757f8c6a6..90623a017db 100644 --- a/ext/telemetry.c +++ b/ext/telemetry.c @@ -194,10 +194,25 @@ DATADOG_PUBLIC bool datadog_metric_add_point(zend_string *name, double value, ze return true; } -static void dd_commit_metrics() { +void datadog_telemetry_commit_user_request_metrics(void) { if (!DATADOG_G(metrics_buffer)) { return; } + + if (!DATADOG_G(sidecar) || !get_global_DD_INSTRUMENTATION_TELEMETRY_ENABLED()) { + ddog_sidecar_telemetry_buffer_drop(DATADOG_G(metrics_buffer)); + DATADOG_G(metrics_buffer) = NULL; + return; + } + + dd_commit_metrics(); +} + +static void dd_commit_metrics(void) { + if (!DATADOG_G(metrics_buffer)) { + return; + } + ddog_sidecar_telemetry_buffer_flush( &DATADOG_G(sidecar), datadog_sidecar_instance_id, &DATADOG_G(sidecar_queue_id), DATADOG_G(metrics_buffer)); DATADOG_G(metrics_buffer) = NULL; diff --git a/ext/telemetry.h b/ext/telemetry.h index 97828859bd2..839e540015c 100644 --- a/ext/telemetry.h +++ b/ext/telemetry.h @@ -28,6 +28,7 @@ const char *ddtrace_telemetry_redact_file(const char *file); void datadog_telemetry_rinit(void); void datadog_telemetry_rshutdown(void); void datadog_telemetry_finalize(void); +void datadog_telemetry_commit_user_request_metrics(void); void datadog_telemetry_lifecycle_end(void); void datadog_telemetry_register_services(ddog_SidecarTransport **sidecar); diff --git a/tracer/user_request.c b/tracer/user_request.c index 5305518f027..db41c214773 100644 --- a/tracer/user_request.c +++ b/tracer/user_request.c @@ -2,6 +2,7 @@ #include
#include "configuration.h" #include "ddtrace.h" +#include #include "span.h" #define NS "DDTrace\\UserRequest\\" @@ -196,6 +197,8 @@ void ddtrace_user_req_notify_finish(ddtrace_span_data *span) ddtrace_user_req_listeners *listener = reg_listeners.listeners[i]; listener->finish_user_req(listener, &span->std); } + + datadog_telemetry_commit_user_request_metrics(); } PHP_FUNCTION(DDTrace_UserRequest_set_blocking_function);