diff --git a/src/Integrations/Integrations/CakePHP/CakePHPIntegration.php b/src/Integrations/Integrations/CakePHP/CakePHPIntegration.php index 86a0151e973..0b9b08a7a8c 100644 --- a/src/Integrations/Integrations/CakePHP/CakePHPIntegration.php +++ b/src/Integrations/Integrations/CakePHP/CakePHPIntegration.php @@ -5,6 +5,7 @@ use DDTrace\Integrations\Integration; use DDTrace\Integrations\CakePHP\V2\CakePHPIntegrationLoader as CakePHPIntegrationLoaderV2; use DDTrace\Integrations\CakePHP\V3\CakePHPIntegrationLoader as CakePHPIntegrationLoaderV3; +use DDTrace\Tag; class CakePHPIntegration extends Integration { @@ -29,6 +30,52 @@ public function init() $integration = $this; + $integration->setRootSpanInfoFn = function () use ($integration) { + $rootSpan = \DDTrace\root_span(); + if ($rootSpan === null) { + return; + } + + $integration->appName = \ddtrace_config_app_name(CakePHPIntegration::NAME); + $integration->addTraceAnalyticsIfEnabled($rootSpan); + $rootSpan->service = $integration->appName; + if ('cli' === PHP_SAPI) { + $rootSpan->name = 'cakephp.console'; + $rootSpan->resource = !empty($_SERVER['argv'][1]) + ? 'cake_console ' . $_SERVER['argv'][1] + : 'cake_console'; + } else { + $rootSpan->name = 'cakephp.request'; + $rootSpan->meta[Tag::SPAN_KIND] = 'server'; + } + $rootSpan->meta[Tag::COMPONENT] = CakePHPIntegration::NAME; + }; + + $integration->handleExceptionFn = function ($This, $scope, $args) use ($integration) { + $rootSpan = \DDTrace\root_span(); + if ($rootSpan !== null) { + $integration->setError($rootSpan, $args[0]); + } + }; + + $integration->setStatusCodeFn = function ($This, $scope, $args, $retval) use ($integration) { + $rootSpan = \DDTrace\root_span(); + if ($rootSpan) { + $rootSpan->meta[Tag::HTTP_STATUS_CODE] = $retval; + } + }; + + $integration->parseRouteFn = function ($app, $appClass, $args, $retval) use ($integration) { + if (!$retval) { + return; + } + + $rootSpan = \DDTrace\root_span(); + if ($rootSpan !== null) { + $rootSpan->meta[Tag::HTTP_ROUTE] = $app->template; + } + }; + $loader = class_exists('Cake\Http\Server') // Only exists in V3+ ? new CakePHPIntegrationLoaderV3() : new CakePHPIntegrationLoaderV2(); diff --git a/src/Integrations/Integrations/CakePHP/V2/CakePHPIntegrationLoader.php b/src/Integrations/Integrations/CakePHP/V2/CakePHPIntegrationLoader.php index 6b134216edd..872789af6ec 100644 --- a/src/Integrations/Integrations/CakePHP/V2/CakePHPIntegrationLoader.php +++ b/src/Integrations/Integrations/CakePHP/V2/CakePHPIntegrationLoader.php @@ -21,29 +21,8 @@ public function load($integration) return Integration::NOT_AVAILABLE; } - $setRootSpanInfoFn = function () use ($integration) { - $rootSpan = \DDTrace\root_span(); - if ($rootSpan === null) { - return; - } - - $integration->appName = \ddtrace_config_app_name(CakePHPIntegration::NAME); - $integration->addTraceAnalyticsIfEnabled($rootSpan); - $rootSpan->service = $integration->appName; - if ('cli' === PHP_SAPI) { - $rootSpan->name = 'cakephp.console'; - $rootSpan->resource = !empty($_SERVER['argv'][1]) - ? 'cake_console ' . $_SERVER['argv'][1] - : 'cake_console'; - } else { - $rootSpan->name = 'cakephp.request'; - $rootSpan->meta[Tag::SPAN_KIND] = 'server'; - } - $rootSpan->meta[Tag::COMPONENT] = CakePHPIntegration::NAME; - }; - - \DDTrace\hook_method('App', 'init', $setRootSpanInfoFn); - \DDTrace\hook_method('Dispatcher', '__construct', $setRootSpanInfoFn); + \DDTrace\hook_method('App', 'init', $integration->setRootSpanInfoFn); + \DDTrace\hook_method('Dispatcher', '__construct', $integration->setRootSpanInfoFn); \DDTrace\trace_method( 'Controller', @@ -88,24 +67,14 @@ function (SpanData $span, array $args) use ($integration) { \DDTrace\hook_method( 'ExceptionRenderer', '__construct', - function ($This, $scope, $args) use ($integration) { - $rootSpan = \DDTrace\root_span(); - if ($rootSpan !== null) { - $integration->setError($rootSpan, $args[0]); - } - } + $integration->handleExceptionFn ); \DDTrace\hook_method( 'CakeResponse', 'statusCode', null, - function ($This, $scope, $args, $retval) use ($integration) { - $rootSpan = \DDTrace\root_span(); - if ($rootSpan !== null) { - $rootSpan->meta[Tag::HTTP_STATUS_CODE] = $retval; - } - } + $integration->setStatusCodeFn ); // Create a trace span for every template rendered @@ -123,16 +92,7 @@ function ($This, $scope, $args, $retval) use ($integration) { 'CakeRoute', 'parse', null, - function ($app, $appClass, $args, $retval) use ($integration) { - if (!$retval) { - return; - } - - $rootSpan = \DDTrace\root_span(); - if ($rootSpan !== null) { - $rootSpan->meta[Tag::HTTP_ROUTE] = $app->template; - } - } + $integration->parseRouteFn ); return Integration::LOADED; diff --git a/src/Integrations/Integrations/CakePHP/V3/CakePHPIntegrationLoader.php b/src/Integrations/Integrations/CakePHP/V3/CakePHPIntegrationLoader.php index 45340096c8b..baa62d29564 100644 --- a/src/Integrations/Integrations/CakePHP/V3/CakePHPIntegrationLoader.php +++ b/src/Integrations/Integrations/CakePHP/V3/CakePHPIntegrationLoader.php @@ -17,29 +17,8 @@ class CakePHPIntegrationLoader { public function load($integration) { - $setRootSpanInfoFn = function () use ($integration) { - $rootSpan = \DDTrace\root_span(); - if ($rootSpan === null) { - return; - } - - $integration->appName = \ddtrace_config_app_name(CakePHPIntegration::NAME); - $integration->addTraceAnalyticsIfEnabled($rootSpan); - $rootSpan->service = $integration->appName; - if ('cli' === PHP_SAPI) { - $rootSpan->name = 'cakephp.console'; - $rootSpan->resource = !empty($_SERVER['argv'][1]) - ? 'cake_console ' . $_SERVER['argv'][1] - : 'cake_console'; - } else { - $rootSpan->name = 'cakephp.request'; - $rootSpan->meta[Tag::SPAN_KIND] = 'server'; - } - $rootSpan->meta[Tag::COMPONENT] = CakePHPIntegration::NAME; - }; - - \DDTrace\hook_method('App\Application', '__construct', $setRootSpanInfoFn); - \DDTrace\hook_method('Cake\Http\Server', '__construct', $setRootSpanInfoFn); + \DDTrace\hook_method('App\Application', '__construct', $integration->setRootSpanInfoFn); + \DDTrace\hook_method('Cake\Http\Server', '__construct', $integration->setRootSpanInfoFn); \DDTrace\trace_method( 'Cake\Controller\Controller', @@ -79,23 +58,14 @@ function (SpanData $span) use ($integration) { \DDTrace\hook_method( 'Cake\Error\Middleware\ErrorHandlerMiddleware', 'handleException', - function ($This, $scope, $args) use ($integration) { - $rootSpan = \DDTrace\root_span(); - if ($rootSpan !== null) { - $integration->setError($rootSpan, $args[0]); - } - }); + $integration->handleExceptionFn + ); \DDTrace\hook_method( 'Cake\Http\Response', 'getStatusCode', null, - function ($This, $scope, $args, $retval) use ($integration) { - $rootSpan = \DDTrace\root_span(); - if ($rootSpan) { - $rootSpan->meta[Tag::HTTP_STATUS_CODE] = $retval; - } - } + $integration->setStatusCodeFn ); // Create a trace span for every template rendered @@ -147,16 +117,7 @@ function (HookData $hook) use ($renderHook) { 'Cake\Routing\Route\Route', 'parseRequest', null, - function ($app, $appClass, $args, $retval) use ($integration) { - if (!$retval) { - return; - } - - $rootSpan = \DDTrace\root_span(); - if ($rootSpan) { - $rootSpan->meta[Tag::HTTP_ROUTE] = $app->template; - } - } + $integration->parseRouteFn ); return Integration::LOADED;