diff --git a/appsec/tests/integration/build.gradle b/appsec/tests/integration/build.gradle index 7b0d3406a3..bb4060747c 100644 --- a/appsec/tests/integration/build.gradle +++ b/appsec/tests/integration/build.gradle @@ -438,6 +438,7 @@ task loadCaches(type: Exec) { commandLine 'docker', 'run', '--rm', '-v', 'php-tracer-cargo-cache:/caches/php-tracer-cargo-cache', + '-v', 'php-tracer-cargo-cache-git:/caches/php-tracer-cargo-cache-git', '-v', 'php-appsec-hunter-cache:/caches/php-appsec-hunter-cache', '-v', "${project.buildDir}:/build", 'busybox', diff --git a/appsec/tests/integration/gradle/images.gradle b/appsec/tests/integration/gradle/images.gradle index 4b6e82041b..d6823c473c 100644 --- a/appsec/tests/integration/gradle/images.gradle +++ b/appsec/tests/integration/gradle/images.gradle @@ -234,6 +234,7 @@ task saveCaches(type: Exec) { commandLine 'docker', 'run', '--rm', '-e', "UUID=${uuid}", '-v', 'php-tracer-cargo-cache:/caches/php-tracer-cargo-cache', + '-v', 'php-tracer-cargo-cache-git:/caches/php-tracer-cargo-cache-git', '-v', 'php-appsec-hunter-cache:/caches/php-appsec-hunter-cache', '-v', "${project.buildDir}:/build", 'busybox', diff --git a/appsec/tests/integration/src/docker/php/build_dev_php.sh b/appsec/tests/integration/src/docker/php/build_dev_php.sh index 55742f0dc7..c7688f2af2 100755 --- a/appsec/tests/integration/src/docker/php/build_dev_php.sh +++ b/appsec/tests/integration/src/docker/php/build_dev_php.sh @@ -504,7 +504,7 @@ fi if [[ -d /opt/homebrew/lib ]]; then export LDFLAGS="${LDFLAGS:-} -L/opt/homebrew/lib" - export CPPFLAGS="${CPPFLAGS:-} -I/opt/homebrew/include" + export CPPFLAGS="${CPPFLAGS:-} -idirafter /opt/homebrew/include" fi export CXXFLAGS="${CXXFLAGS:-} -std=c++11" export CFLAGS="${CFLAGS:-} -Wno-implicit-function-declaration" 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 5af8b25a9e..98b6cae496 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 @@ -6,7 +6,6 @@ import com.datadog.appsec.php.docker.InspectContainerHelper import com.datadog.appsec.php.model.Span import com.datadog.appsec.php.model.Trace import org.junit.jupiter.api.MethodOrderer -import org.junit.jupiter.api.Order import org.junit.jupiter.api.Test import org.junit.jupiter.api.TestMethodOrder import org.junit.jupiter.api.condition.EnabledIf @@ -45,12 +44,6 @@ class Symfony62Tests { www: 'symfony62', ) - @Test - @Order(1) - void 'reported telemetry integrations are not repeated'() { - - } - @Test void 'login success automated event'() { //The user ciuser@example.com is already on the DB @@ -115,4 +108,30 @@ class Symfony62Tests { assert span.meta."appsec.blocked" == "true" assert span.meta."http.route" == '/dynamic-path/{param01}' } + + @Test + void 'symfony http route disabled'() { + try { + def res = CONTAINER.execInContainer( + 'bash', '-c', + '''echo export DD_TRACE_SYMFONY_HTTP_ROUTE=false >> /etc/apache2/envvars; + service apache2 restart''') + assert res.exitCode == 0 + + HttpRequest req = container.buildReq('/dynamic-path/someValue').GET().build() + def trace = container.traceFromRequest(req, ofString()) { HttpResponse re -> + assert re.statusCode() == 200 + assert re.body().contains('Hi someValue!') + } + + Span span = trace.first() + assert span.meta."http.route" != '/dynamic-path/{param01}' + } finally { + def res = CONTAINER.execInContainer( + 'bash', '-c', + '''sed -i '/export DD_TRACE_SYMFONY_HTTP_ROUTE=/d' /etc/apache2/envvars; + service apache2 restart''') + assert res.exitCode == 0 + } + } } diff --git a/ext/configuration.h b/ext/configuration.h index 970b97f212..5520a1e3fd 100644 --- a/ext/configuration.h +++ b/ext/configuration.h @@ -141,6 +141,7 @@ enum ddtrace_sampling_rules_format { CONFIG(BOOL, DD_TRACE_LARAVEL_QUEUE_DISTRIBUTED_TRACING, "true") \ CONFIG(BOOL, DD_TRACE_SYMFONY_MESSENGER_DISTRIBUTED_TRACING, "true") \ CONFIG(BOOL, DD_TRACE_SYMFONY_MESSENGER_MIDDLEWARES, "false") \ + CONFIG(BOOL, DD_TRACE_SYMFONY_HTTP_ROUTE, "true") \ CONFIG(BOOL, DD_TRACE_REMOVE_ROOT_SPAN_LARAVEL_QUEUE, "true") \ CONFIG(BOOL, DD_TRACE_REMOVE_ROOT_SPAN_SYMFONY_MESSENGER, "true") \ CONFIG(BOOL, DD_APPSEC_RASP_ENABLED , "false") \ diff --git a/src/DDTrace/Integrations/Symfony/SymfonyIntegration.php b/src/DDTrace/Integrations/Symfony/SymfonyIntegration.php index 63cf605206..40fff04fcd 100644 --- a/src/DDTrace/Integrations/Symfony/SymfonyIntegration.php +++ b/src/DDTrace/Integrations/Symfony/SymfonyIntegration.php @@ -388,88 +388,90 @@ function () use ($integration) { } ); - $handle_http_route = function($route_name, $request, $rootSpan) use ($integration) { - if ($integration->kernel === null) { - return; - } - /** @var ContainerInterface $container */ - $container = $integration->kernel->getContainer(); - try { - $cache = $container->get('cache.app'); - } catch (\Exception $e) { - return; - } + if (\dd_trace_env_config('DD_TRACE_SYMFONY_HTTP_ROUTE')) { + $handle_http_route = function($route_name, $request, $rootSpan) use ($integration) { + if ($integration->kernel === null) { + return; + } + /** @var ContainerInterface $container */ + $container = $integration->kernel->getContainer(); + try { + $cache = $container->get('cache.app'); + } catch (\Exception $e) { + return; + } - /** @var \Symfony\Bundle\FrameworkBundle\Routing\Router $router */ - $router = $container->get('router'); - if (!\method_exists($cache, 'getItem')) { - return; - } - $itemName = "_datadog.route.path.$route_name"; - $locale = $request->get('_locale'); - if ($locale !== null) { - $itemName .= ".$locale"; - } - $item = $cache->getItem($itemName); - if ($item->isHit()) { - $route = $item->get(); - } else { - $routeCollection = $router->getRouteCollection(); - $route = $routeCollection->get($route_name); - if ($route == null && ($locale = $request->get('_locale')) !== null) { - $route = $routeCollection->get($route_name . '.' . $locale); - } - $item->set($route); - $item->expiresAfter(3600); - $cache->save($item); - } - if (isset($route)) { - $rootSpan->meta[Tag::HTTP_ROUTE] = $route->getPath(); - } - }; + /** @var \Symfony\Bundle\FrameworkBundle\Routing\Router $router */ + $router = $container->get('router'); + if (!\method_exists($cache, 'getItem')) { + return; + } + $itemName = "_datadog.route.path.$route_name"; + $locale = $request->get('_locale'); + if ($locale !== null) { + $itemName .= ".$locale"; + } + $item = $cache->getItem($itemName); + if ($item->isHit()) { + $route = $item->get(); + } else { + $routeCollection = $router->getRouteCollection(); + $route = $routeCollection->get($route_name); + if ($route == null && ($locale = $request->get('_locale')) !== null) { + $route = $routeCollection->get($route_name . '.' . $locale); + } + $item->set($route); + $item->expiresAfter(3600); + $cache->save($item); + } + if (isset($route)) { + $rootSpan->meta[Tag::HTTP_ROUTE] = $route->getPath(); + } + }; - \DDTrace\trace_method( - 'Symfony\Component\HttpKernel\HttpKernel', - 'handle', - function (SpanData $span, $args, $response) use ($integration, $handle_http_route) { - /** @var Request $request */ - list($request) = $args; + \DDTrace\trace_method( + 'Symfony\Component\HttpKernel\HttpKernel', + 'handle', + function (SpanData $span, $args, $response) use ($integration, $handle_http_route) { + /** @var Request $request */ + list($request) = $args; - $span->name = 'symfony.kernel.handle'; - $span->service = \ddtrace_config_app_name($integration->frameworkPrefix); - $span->type = Type::WEB_SERVLET; - $span->meta[Tag::COMPONENT] = SymfonyIntegration::NAME; + $span->name = 'symfony.kernel.handle'; + $span->service = \ddtrace_config_app_name($integration->frameworkPrefix); + $span->type = Type::WEB_SERVLET; + $span->meta[Tag::COMPONENT] = SymfonyIntegration::NAME; - $rootSpan = \DDTrace\root_span(); - $rootSpan->meta[Tag::HTTP_METHOD] = $request->getMethod(); - $rootSpan->meta[Tag::COMPONENT] = $integration->frameworkPrefix; - $rootSpan->meta[Tag::SPAN_KIND] = 'server'; - $integration->addTraceAnalyticsIfEnabled($rootSpan); + $rootSpan = \DDTrace\root_span(); + $rootSpan->meta[Tag::HTTP_METHOD] = $request->getMethod(); + $rootSpan->meta[Tag::COMPONENT] = $integration->frameworkPrefix; + $rootSpan->meta[Tag::SPAN_KIND] = 'server'; + $integration->addTraceAnalyticsIfEnabled($rootSpan); - if (!array_key_exists(Tag::HTTP_URL, $rootSpan->meta)) { - $rootSpan->meta[Tag::HTTP_URL] = Normalizer::urlSanitize($request->getUri()); - } - if (isset($response)) { - $rootSpan->meta[Tag::HTTP_STATUS_CODE] = $response->getStatusCode(); - } + if (!array_key_exists(Tag::HTTP_URL, $rootSpan->meta)) { + $rootSpan->meta[Tag::HTTP_URL] = Normalizer::urlSanitize($request->getUri()); + } + if (isset($response)) { + $rootSpan->meta[Tag::HTTP_STATUS_CODE] = $response->getStatusCode(); + } - $route_name = $request->get('_route'); - if ($route_name !== null) { - if (dd_trace_env_config("DD_HTTP_SERVER_ROUTE_BASED_NAMING")) { - $rootSpan->resource = $route_name; + $route_name = $request->get('_route'); + if ($route_name !== null) { + if (dd_trace_env_config("DD_HTTP_SERVER_ROUTE_BASED_NAMING")) { + $rootSpan->resource = $route_name; + } + $rootSpan->meta['symfony.route.name'] = $route_name; + $handle_http_route($route_name, $request, $rootSpan); } - $rootSpan->meta['symfony.route.name'] = $route_name; - $handle_http_route($route_name, $request, $rootSpan); - } - $parameters = $request->get('_route_params'); - if (!empty($parameters) && - is_array($parameters) && - function_exists('datadog\appsec\push_address')) { - \datadog\appsec\push_address("server.request.path_params", $parameters); + $parameters = $request->get('_route_params'); + if (!empty($parameters) && + is_array($parameters) && + function_exists('datadog\appsec\push_address')) { + \datadog\appsec\push_address("server.request.path_params", $parameters); + } } - } - ); + ); + } /* * EventDispatcher v4.3 introduced an arg hack that mutates the arguments.