Skip to content

Commit 04884ce

Browse files
committed
Add option to disable http.route in symfony
1 parent 7010b37 commit 04884ce

File tree

6 files changed

+105
-81
lines changed

6 files changed

+105
-81
lines changed

appsec/tests/integration/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -438,6 +438,7 @@ task loadCaches(type: Exec) {
438438

439439
commandLine 'docker', 'run', '--rm',
440440
'-v', 'php-tracer-cargo-cache:/caches/php-tracer-cargo-cache',
441+
'-v', 'php-tracer-cargo-cache-git:/caches/php-tracer-cargo-cache-git',
441442
'-v', 'php-appsec-hunter-cache:/caches/php-appsec-hunter-cache',
442443
'-v', "${project.buildDir}:/build",
443444
'busybox',

appsec/tests/integration/gradle/images.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,7 @@ task saveCaches(type: Exec) {
234234
commandLine 'docker', 'run', '--rm',
235235
'-e', "UUID=${uuid}",
236236
'-v', 'php-tracer-cargo-cache:/caches/php-tracer-cargo-cache',
237+
'-v', 'php-tracer-cargo-cache-git:/caches/php-tracer-cargo-cache-git',
237238
'-v', 'php-appsec-hunter-cache:/caches/php-appsec-hunter-cache',
238239
'-v', "${project.buildDir}:/build",
239240
'busybox',

appsec/tests/integration/src/docker/php/build_dev_php.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -504,7 +504,7 @@ fi
504504

505505
if [[ -d /opt/homebrew/lib ]]; then
506506
export LDFLAGS="${LDFLAGS:-} -L/opt/homebrew/lib"
507-
export CPPFLAGS="${CPPFLAGS:-} -I/opt/homebrew/include"
507+
export CPPFLAGS="${CPPFLAGS:-} -idirafter /opt/homebrew/include"
508508
fi
509509
export CXXFLAGS="${CXXFLAGS:-} -std=c++11"
510510
export CFLAGS="${CFLAGS:-} -Wno-implicit-function-declaration"

appsec/tests/integration/src/test/groovy/com/datadog/appsec/php/integration/Symfony62Tests.groovy

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import com.datadog.appsec.php.docker.InspectContainerHelper
66
import com.datadog.appsec.php.model.Span
77
import com.datadog.appsec.php.model.Trace
88
import org.junit.jupiter.api.MethodOrderer
9-
import org.junit.jupiter.api.Order
109
import org.junit.jupiter.api.Test
1110
import org.junit.jupiter.api.TestMethodOrder
1211
import org.junit.jupiter.api.condition.EnabledIf
@@ -45,12 +44,6 @@ class Symfony62Tests {
4544
www: 'symfony62',
4645
)
4746

48-
@Test
49-
@Order(1)
50-
void 'reported telemetry integrations are not repeated'() {
51-
52-
}
53-
5447
@Test
5548
void 'login success automated event'() {
5649
//The user [email protected] is already on the DB
@@ -115,4 +108,30 @@ class Symfony62Tests {
115108
assert span.meta."appsec.blocked" == "true"
116109
assert span.meta."http.route" == '/dynamic-path/{param01}'
117110
}
111+
112+
@Test
113+
void 'symfony http route disabled'() {
114+
try {
115+
def res = CONTAINER.execInContainer(
116+
'bash', '-c',
117+
'''echo export DD_TRACE_SYMFONY_HTTP_ROUTE=false >> /etc/apache2/envvars;
118+
service apache2 restart''')
119+
assert res.exitCode == 0
120+
121+
HttpRequest req = container.buildReq('/dynamic-path/someValue').GET().build()
122+
def trace = container.traceFromRequest(req, ofString()) { HttpResponse<String> re ->
123+
assert re.statusCode() == 200
124+
assert re.body().contains('Hi someValue!')
125+
}
126+
127+
Span span = trace.first()
128+
assert span.meta."http.route" != '/dynamic-path/{param01}'
129+
} finally {
130+
def res = CONTAINER.execInContainer(
131+
'bash', '-c',
132+
'''sed -i '/export DD_TRACE_SYMFONY_HTTP_ROUTE=/d' /etc/apache2/envvars;
133+
service apache2 restart''')
134+
assert res.exitCode == 0
135+
}
136+
}
118137
}

ext/configuration.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,7 @@ enum ddtrace_sampling_rules_format {
141141
CONFIG(BOOL, DD_TRACE_LARAVEL_QUEUE_DISTRIBUTED_TRACING, "true") \
142142
CONFIG(BOOL, DD_TRACE_SYMFONY_MESSENGER_DISTRIBUTED_TRACING, "true") \
143143
CONFIG(BOOL, DD_TRACE_SYMFONY_MESSENGER_MIDDLEWARES, "false") \
144+
CONFIG(BOOL, DD_TRACE_SYMFONY_HTTP_ROUTE, "true") \
144145
CONFIG(BOOL, DD_TRACE_REMOVE_ROOT_SPAN_LARAVEL_QUEUE, "true") \
145146
CONFIG(BOOL, DD_TRACE_REMOVE_ROOT_SPAN_SYMFONY_MESSENGER, "true") \
146147
CONFIG(BOOL, DD_APPSEC_RASP_ENABLED , "false") \

src/DDTrace/Integrations/Symfony/SymfonyIntegration.php

Lines changed: 75 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -388,88 +388,90 @@ function () use ($integration) {
388388
}
389389
);
390390

391-
$handle_http_route = function($route_name, $request, $rootSpan) use ($integration) {
392-
if ($integration->kernel === null) {
393-
return;
394-
}
395-
/** @var ContainerInterface $container */
396-
$container = $integration->kernel->getContainer();
397-
try {
398-
$cache = $container->get('cache.app');
399-
} catch (\Exception $e) {
400-
return;
401-
}
391+
if (\dd_trace_env_config('DD_TRACE_SYMFONY_HTTP_ROUTE')) {
392+
$handle_http_route = function($route_name, $request, $rootSpan) use ($integration) {
393+
if ($integration->kernel === null) {
394+
return;
395+
}
396+
/** @var ContainerInterface $container */
397+
$container = $integration->kernel->getContainer();
398+
try {
399+
$cache = $container->get('cache.app');
400+
} catch (\Exception $e) {
401+
return;
402+
}
402403

403-
/** @var \Symfony\Bundle\FrameworkBundle\Routing\Router $router */
404-
$router = $container->get('router');
405-
if (!\method_exists($cache, 'getItem')) {
406-
return;
407-
}
408-
$itemName = "_datadog.route.path.$route_name";
409-
$locale = $request->get('_locale');
410-
if ($locale !== null) {
411-
$itemName .= ".$locale";
412-
}
413-
$item = $cache->getItem($itemName);
414-
if ($item->isHit()) {
415-
$route = $item->get();
416-
} else {
417-
$routeCollection = $router->getRouteCollection();
418-
$route = $routeCollection->get($route_name);
419-
if ($route == null && ($locale = $request->get('_locale')) !== null) {
420-
$route = $routeCollection->get($route_name . '.' . $locale);
421-
}
422-
$item->set($route);
423-
$item->expiresAfter(3600);
424-
$cache->save($item);
425-
}
426-
if (isset($route)) {
427-
$rootSpan->meta[Tag::HTTP_ROUTE] = $route->getPath();
428-
}
429-
};
404+
/** @var \Symfony\Bundle\FrameworkBundle\Routing\Router $router */
405+
$router = $container->get('router');
406+
if (!\method_exists($cache, 'getItem')) {
407+
return;
408+
}
409+
$itemName = "_datadog.route.path.$route_name";
410+
$locale = $request->get('_locale');
411+
if ($locale !== null) {
412+
$itemName .= ".$locale";
413+
}
414+
$item = $cache->getItem($itemName);
415+
if ($item->isHit()) {
416+
$route = $item->get();
417+
} else {
418+
$routeCollection = $router->getRouteCollection();
419+
$route = $routeCollection->get($route_name);
420+
if ($route == null && ($locale = $request->get('_locale')) !== null) {
421+
$route = $routeCollection->get($route_name . '.' . $locale);
422+
}
423+
$item->set($route);
424+
$item->expiresAfter(3600);
425+
$cache->save($item);
426+
}
427+
if (isset($route)) {
428+
$rootSpan->meta[Tag::HTTP_ROUTE] = $route->getPath();
429+
}
430+
};
430431

431-
\DDTrace\trace_method(
432-
'Symfony\Component\HttpKernel\HttpKernel',
433-
'handle',
434-
function (SpanData $span, $args, $response) use ($integration, $handle_http_route) {
435-
/** @var Request $request */
436-
list($request) = $args;
432+
\DDTrace\trace_method(
433+
'Symfony\Component\HttpKernel\HttpKernel',
434+
'handle',
435+
function (SpanData $span, $args, $response) use ($integration, $handle_http_route) {
436+
/** @var Request $request */
437+
list($request) = $args;
437438

438-
$span->name = 'symfony.kernel.handle';
439-
$span->service = \ddtrace_config_app_name($integration->frameworkPrefix);
440-
$span->type = Type::WEB_SERVLET;
441-
$span->meta[Tag::COMPONENT] = SymfonyIntegration::NAME;
439+
$span->name = 'symfony.kernel.handle';
440+
$span->service = \ddtrace_config_app_name($integration->frameworkPrefix);
441+
$span->type = Type::WEB_SERVLET;
442+
$span->meta[Tag::COMPONENT] = SymfonyIntegration::NAME;
442443

443-
$rootSpan = \DDTrace\root_span();
444-
$rootSpan->meta[Tag::HTTP_METHOD] = $request->getMethod();
445-
$rootSpan->meta[Tag::COMPONENT] = $integration->frameworkPrefix;
446-
$rootSpan->meta[Tag::SPAN_KIND] = 'server';
447-
$integration->addTraceAnalyticsIfEnabled($rootSpan);
444+
$rootSpan = \DDTrace\root_span();
445+
$rootSpan->meta[Tag::HTTP_METHOD] = $request->getMethod();
446+
$rootSpan->meta[Tag::COMPONENT] = $integration->frameworkPrefix;
447+
$rootSpan->meta[Tag::SPAN_KIND] = 'server';
448+
$integration->addTraceAnalyticsIfEnabled($rootSpan);
448449

449-
if (!array_key_exists(Tag::HTTP_URL, $rootSpan->meta)) {
450-
$rootSpan->meta[Tag::HTTP_URL] = Normalizer::urlSanitize($request->getUri());
451-
}
452-
if (isset($response)) {
453-
$rootSpan->meta[Tag::HTTP_STATUS_CODE] = $response->getStatusCode();
454-
}
450+
if (!array_key_exists(Tag::HTTP_URL, $rootSpan->meta)) {
451+
$rootSpan->meta[Tag::HTTP_URL] = Normalizer::urlSanitize($request->getUri());
452+
}
453+
if (isset($response)) {
454+
$rootSpan->meta[Tag::HTTP_STATUS_CODE] = $response->getStatusCode();
455+
}
455456

456-
$route_name = $request->get('_route');
457-
if ($route_name !== null) {
458-
if (dd_trace_env_config("DD_HTTP_SERVER_ROUTE_BASED_NAMING")) {
459-
$rootSpan->resource = $route_name;
457+
$route_name = $request->get('_route');
458+
if ($route_name !== null) {
459+
if (dd_trace_env_config("DD_HTTP_SERVER_ROUTE_BASED_NAMING")) {
460+
$rootSpan->resource = $route_name;
461+
}
462+
$rootSpan->meta['symfony.route.name'] = $route_name;
463+
$handle_http_route($route_name, $request, $rootSpan);
460464
}
461-
$rootSpan->meta['symfony.route.name'] = $route_name;
462-
$handle_http_route($route_name, $request, $rootSpan);
463-
}
464465

465-
$parameters = $request->get('_route_params');
466-
if (!empty($parameters) &&
467-
is_array($parameters) &&
468-
function_exists('datadog\appsec\push_address')) {
469-
\datadog\appsec\push_address("server.request.path_params", $parameters);
466+
$parameters = $request->get('_route_params');
467+
if (!empty($parameters) &&
468+
is_array($parameters) &&
469+
function_exists('datadog\appsec\push_address')) {
470+
\datadog\appsec\push_address("server.request.path_params", $parameters);
471+
}
470472
}
471-
}
472-
);
473+
);
474+
}
473475

474476
/*
475477
* EventDispatcher v4.3 introduced an arg hack that mutates the arguments.

0 commit comments

Comments
 (0)