From 0c6136ae085629a584f575f01d60f0966f0f0492 Mon Sep 17 00:00:00 2001 From: gechetspr Date: Fri, 20 Dec 2024 14:43:46 +0200 Subject: [PATCH 1/3] Improved error processing and service naming --- .../SprykerInstrumentationBootstrap.php | 17 ++++++- .../Opentelemetry/OpentelemetryService.php | 23 +++++++++ .../OpentelemetryServiceFactory.php | 10 ++++ .../OpentelemetryServiceInterface.php | 25 ++++++++++ ...OpentelemetryMonitoringExtensionPlugin.php | 25 +++++----- .../Storage/CustomParameterStorage.php | 5 ++ .../CustomParameterStorageInterface.php | 8 ++++ .../Storage/ExceptionStorage.php | 48 +++++++++++++++++++ .../Storage/ExceptionStorageInterface.php | 25 ++++++++++ 9 files changed, 172 insertions(+), 14 deletions(-) create mode 100644 src/Spryker/Service/Opentelemetry/Storage/ExceptionStorage.php create mode 100644 src/Spryker/Service/Opentelemetry/Storage/ExceptionStorageInterface.php diff --git a/src/Spryker/Service/Opentelemetry/Instrumentation/SprykerInstrumentationBootstrap.php b/src/Spryker/Service/Opentelemetry/Instrumentation/SprykerInstrumentationBootstrap.php index 1d7c71c..58f1f8a 100644 --- a/src/Spryker/Service/Opentelemetry/Instrumentation/SprykerInstrumentationBootstrap.php +++ b/src/Spryker/Service/Opentelemetry/Instrumentation/SprykerInstrumentationBootstrap.php @@ -12,6 +12,7 @@ use OpenTelemetry\API\Trace\Propagation\TraceContextPropagator; use OpenTelemetry\API\Trace\SpanInterface; use OpenTelemetry\API\Trace\SpanKind; +use OpenTelemetry\API\Trace\StatusCode; use OpenTelemetry\Context\Context; use OpenTelemetry\Contrib\Grpc\GrpcTransportFactory; use OpenTelemetry\Contrib\Otlp\OtlpUtil; @@ -33,7 +34,9 @@ use Spryker\Service\Opentelemetry\Instrumentation\SpanProcessor\PostFilterBatchSpanProcessor; use Spryker\Service\Opentelemetry\Instrumentation\Tracer\TracerProvider; use Spryker\Service\Opentelemetry\OpentelemetryInstrumentationConfig; +use Spryker\Service\Opentelemetry\Plugin\OpentelemetryMonitoringExtensionPlugin; use Spryker\Service\Opentelemetry\Storage\CustomParameterStorage; +use Spryker\Service\Opentelemetry\Storage\ExceptionStorage; use Spryker\Service\Opentelemetry\Storage\ResourceNameStorage; use Spryker\Service\Opentelemetry\Storage\RootSpanNameStorage; use Spryker\Shared\Opentelemetry\Instrumentation\CachedInstrumentation; @@ -295,20 +298,32 @@ protected static function formatSpanName(Request $request): string public static function shutdownHandler(): void { $resourceName = ResourceNameStorage::getInstance()->getName(); + $customParamsStorage = CustomParameterStorage::getInstance(); if ($resourceName) { + if ($customParamsStorage->getAttribute(OpentelemetryMonitoringExtensionPlugin::ATTRIBUTE_IS_CONSOLE_COMMAND)) { + $resourceName = 'CLI ' . $resourceName ; + } static::$resourceInfo->setServiceName($resourceName); } $scope = Context::storage()->scope(); if (!$scope) { return; } + $scope->detach(); $span = static::$rootSpan; $name = RootSpanNameStorage::getInstance()->getName(); if ($name) { $span->updateName($name); } - $customParamsStorage = CustomParameterStorage::getInstance(); + + $exceptions = ExceptionStorage::getInstance()->getExceptions(); + foreach ($exceptions as $exception) { + $span->recordException($exception); + } + + $span->setStatus($exceptions ? StatusCode::STATUS_ERROR : StatusCode::STATUS_OK); + $span->setAttributes($customParamsStorage->getAttributes()); $span->end(); } diff --git a/src/Spryker/Service/Opentelemetry/OpentelemetryService.php b/src/Spryker/Service/Opentelemetry/OpentelemetryService.php index 8b78ab4..f8701a7 100644 --- a/src/Spryker/Service/Opentelemetry/OpentelemetryService.php +++ b/src/Spryker/Service/Opentelemetry/OpentelemetryService.php @@ -31,6 +31,10 @@ public function setCustomParameter(string $key, $value): void } /** + * {@inheritDoc} + * + * @api + * * @param string $name * * @return void @@ -41,6 +45,10 @@ public function setRootSpanName(string $name): void } /** + * {@inheritDoc} + * + * @api + * * @param string $name * * @return void @@ -49,4 +57,19 @@ public function setResourceName(string $name): void { $this->getFactory()->createResourceNameStorage()->setName($name); } + + /** + * {@inheritDoc} + * + * @api + * + * @param string $message + * @param \Throwable $exception + * + * @return void + */ + public function setError(string $message, \Throwable $exception): void + { + $this->getFactory()->createExceptionStorage()->addException($exception); + } } diff --git a/src/Spryker/Service/Opentelemetry/OpentelemetryServiceFactory.php b/src/Spryker/Service/Opentelemetry/OpentelemetryServiceFactory.php index 788c351..dc4ee3c 100644 --- a/src/Spryker/Service/Opentelemetry/OpentelemetryServiceFactory.php +++ b/src/Spryker/Service/Opentelemetry/OpentelemetryServiceFactory.php @@ -10,6 +10,8 @@ use Spryker\Service\Kernel\AbstractServiceFactory; use Spryker\Service\Opentelemetry\Storage\CustomParameterStorage; use Spryker\Service\Opentelemetry\Storage\CustomParameterStorageInterface; +use Spryker\Service\Opentelemetry\Storage\ExceptionStorage; +use Spryker\Service\Opentelemetry\Storage\ExceptionStorageInterface; use Spryker\Service\Opentelemetry\Storage\ResourceNameStorage; use Spryker\Service\Opentelemetry\Storage\RootSpanNameStorage; use Spryker\Service\Opentelemetry\Storage\RootSpanNameStorageInterface; @@ -39,4 +41,12 @@ public function createResourceNameStorage(): ResourceNameStorage { return ResourceNameStorage::getInstance(); } + + /** + * @return \Spryker\Service\Opentelemetry\Storage\ExceptionStorageInterface + */ + public function createExceptionStorage(): ExceptionStorageInterface + { + return ExceptionStorage::getInstance(); + } } diff --git a/src/Spryker/Service/Opentelemetry/OpentelemetryServiceInterface.php b/src/Spryker/Service/Opentelemetry/OpentelemetryServiceInterface.php index 4b55fb7..d01e096 100644 --- a/src/Spryker/Service/Opentelemetry/OpentelemetryServiceInterface.php +++ b/src/Spryker/Service/Opentelemetry/OpentelemetryServiceInterface.php @@ -34,4 +34,29 @@ public function setCustomParameter(string $key, $value): void; * @return void */ public function setRootSpanName(string $name): void; + + /** + * Specification: + * - Sets service name to the root span. + * + * @api + * + * @param string $name + * + * @return void + */ + public function setResourceName(string $name): void; + + /** + * Specification: + * - Adds error event to the root span. + * + * @api + * + * @param string $message + * @param \Throwable $exception + * + * @return void + */ + public function setError(string $message, \Throwable $exception): void; } diff --git a/src/Spryker/Service/Opentelemetry/Plugin/OpentelemetryMonitoringExtensionPlugin.php b/src/Spryker/Service/Opentelemetry/Plugin/OpentelemetryMonitoringExtensionPlugin.php index d241d8e..3f4c4a7 100644 --- a/src/Spryker/Service/Opentelemetry/Plugin/OpentelemetryMonitoringExtensionPlugin.php +++ b/src/Spryker/Service/Opentelemetry/Plugin/OpentelemetryMonitoringExtensionPlugin.php @@ -7,16 +7,19 @@ namespace Spryker\Service\Opentelemetry\Plugin; -use OpenTelemetry\Context\Context; use Spryker\Service\Kernel\AbstractPlugin; use Spryker\Service\MonitoringExtension\Dependency\Plugin\MonitoringExtensionPluginInterface; -use Spryker\Service\Opentelemetry\Instrumentation\Span\Span; /** - * @method \Spryker\Service\Opentelemetry\OpentelemetryService getService() + * @method \Spryker\Service\Opentelemetry\OpentelemetryServiceInterface getService() */ class OpentelemetryMonitoringExtensionPlugin extends AbstractPlugin implements MonitoringExtensionPluginInterface { + /** + * @var string + */ + public const ATTRIBUTE_IS_CONSOLE_COMMAND = 'is_console_command'; + /** * Specification: * - Adds error to the current active span. @@ -30,13 +33,7 @@ class OpentelemetryMonitoringExtensionPlugin extends AbstractPlugin implements M */ public function setError(string $message, $exception): void { - $scope = Context::storage()->scope(); - if (!$scope) { - return; - } - - $span = Span::fromContext($scope->context()); - $span->recordException($exception); + $this->getService()->setError($message, $exception); } /** @@ -53,7 +50,8 @@ public function setError(string $message, $exception): void */ public function setApplicationName(?string $application = null, ?string $store = null, ?string $environment = null): void { - $this->getService()->setResourceName(sprintf('%s-%s (%s)', $application ?? '', $store ?? '', $environment ?? '')); + $storeRegion = $store ?? (defined('APPLICATION_REGION') ? APPLICATION_REGION : ''); + $this->getService()->setResourceName(sprintf('%s-%s (%s)', $application ?? '', $storeRegion, $environment ?? '')); } /** @@ -112,7 +110,8 @@ public function markIgnoreTransaction(): void /** * Specification: - * - Opentelemetry has no attributes to specify background jobs. Service name already defined for CLI commands. + * - Adds custom param that will be added to root span. + * - Adds CLI prefix to the service name. * * @api * @@ -120,7 +119,7 @@ public function markIgnoreTransaction(): void */ public function markAsConsoleCommand(): void { - return; + $this->getService()->setCustomParameter(static::ATTRIBUTE_IS_CONSOLE_COMMAND, true); } /** diff --git a/src/Spryker/Service/Opentelemetry/Storage/CustomParameterStorage.php b/src/Spryker/Service/Opentelemetry/Storage/CustomParameterStorage.php index 2a93d13..abcea8d 100644 --- a/src/Spryker/Service/Opentelemetry/Storage/CustomParameterStorage.php +++ b/src/Spryker/Service/Opentelemetry/Storage/CustomParameterStorage.php @@ -1,5 +1,10 @@ + */ + protected array $exceptions = []; + + /** + * @return \Spryker\Service\Opentelemetry\Storage\ExceptionStorageInterface + */ + public static function getInstance(): ExceptionStorageInterface + { + if (static::$instance === null) { + static::$instance = new static(); + } + + return static::$instance; + } + + /** + * @return array<\Throwable> + */ + public function getExceptions(): array + { + return $this->exceptions; + } + + /** + * @param \Throwable $exception + * + * @return void + */ + public function addException(Throwable $exception): void + { + $this->exceptions[] = $exception; + } +} diff --git a/src/Spryker/Service/Opentelemetry/Storage/ExceptionStorageInterface.php b/src/Spryker/Service/Opentelemetry/Storage/ExceptionStorageInterface.php new file mode 100644 index 0000000..59e7216 --- /dev/null +++ b/src/Spryker/Service/Opentelemetry/Storage/ExceptionStorageInterface.php @@ -0,0 +1,25 @@ + + */ + public function getExceptions(): array; + + /** + * @param \Throwable $exception + * + * @return void + */ + public function addException(Throwable $exception): void; +} From dd06aa0bac128e289a8be6971f4fec484001c8dd Mon Sep 17 00:00:00 2001 From: gechetspr Date: Fri, 20 Dec 2024 15:43:38 +0200 Subject: [PATCH 2/3] Fixed after review and removed unused part from hook generator --- .../Instrumentation/SprykerInstrumentationBootstrap.php | 2 +- src/Spryker/Service/Opentelemetry/OpentelemetryService.php | 3 ++- .../Service/Opentelemetry/OpentelemetryServiceInterface.php | 4 +++- .../Generator/ContentCreator/HookContentCreator.php | 6 ++---- 4 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/Spryker/Service/Opentelemetry/Instrumentation/SprykerInstrumentationBootstrap.php b/src/Spryker/Service/Opentelemetry/Instrumentation/SprykerInstrumentationBootstrap.php index 58f1f8a..684b650 100644 --- a/src/Spryker/Service/Opentelemetry/Instrumentation/SprykerInstrumentationBootstrap.php +++ b/src/Spryker/Service/Opentelemetry/Instrumentation/SprykerInstrumentationBootstrap.php @@ -301,7 +301,7 @@ public static function shutdownHandler(): void $customParamsStorage = CustomParameterStorage::getInstance(); if ($resourceName) { if ($customParamsStorage->getAttribute(OpentelemetryMonitoringExtensionPlugin::ATTRIBUTE_IS_CONSOLE_COMMAND)) { - $resourceName = 'CLI ' . $resourceName ; + $resourceName = sprintf('CLI %s', $resourceName); } static::$resourceInfo->setServiceName($resourceName); } diff --git a/src/Spryker/Service/Opentelemetry/OpentelemetryService.php b/src/Spryker/Service/Opentelemetry/OpentelemetryService.php index f8701a7..df82177 100644 --- a/src/Spryker/Service/Opentelemetry/OpentelemetryService.php +++ b/src/Spryker/Service/Opentelemetry/OpentelemetryService.php @@ -9,6 +9,7 @@ use Spryker\Service\Kernel\AbstractService; use Spryker\Service\Opentelemetry\Storage\ResourceNameStorage; +use Throwable; /** * @method \Spryker\Service\Opentelemetry\OpentelemetryServiceFactory getFactory() @@ -68,7 +69,7 @@ public function setResourceName(string $name): void * * @return void */ - public function setError(string $message, \Throwable $exception): void + public function setError(string $message, Throwable $exception): void { $this->getFactory()->createExceptionStorage()->addException($exception); } diff --git a/src/Spryker/Service/Opentelemetry/OpentelemetryServiceInterface.php b/src/Spryker/Service/Opentelemetry/OpentelemetryServiceInterface.php index d01e096..499b4b2 100644 --- a/src/Spryker/Service/Opentelemetry/OpentelemetryServiceInterface.php +++ b/src/Spryker/Service/Opentelemetry/OpentelemetryServiceInterface.php @@ -7,6 +7,8 @@ namespace Spryker\Service\Opentelemetry; +use Throwable; + interface OpentelemetryServiceInterface { /** @@ -58,5 +60,5 @@ public function setResourceName(string $name): void; * * @return void */ - public function setError(string $message, \Throwable $exception): void; + public function setError(string $message, Throwable $exception): void; } diff --git a/src/Spryker/Zed/Opentelemetry/Business/Generator/ContentCreator/HookContentCreator.php b/src/Spryker/Zed/Opentelemetry/Business/Generator/ContentCreator/HookContentCreator.php index 2c83535..3fb8152 100644 --- a/src/Spryker/Zed/Opentelemetry/Business/Generator/ContentCreator/HookContentCreator.php +++ b/src/Spryker/Zed/Opentelemetry/Business/Generator/ContentCreator/HookContentCreator.php @@ -73,8 +73,6 @@ function: \'%s\', $type = $params[1] ?? \\Symfony\\Component\\HttpKernel\\HttpKernelInterface::MAIN_REQUEST; - $request = \\Spryker\\Shared\\OpenTelemetry\\Request\\RequestProcessor::getRequest(); - $span = \\Spryker\\Shared\\OpenTelemetry\\Instrumentation\\CachedInstrumentation::getCachedInstrumentation() ->tracer() ->spanBuilder(\'%s\') @@ -110,8 +108,8 @@ function: \'%s\', if ($exception !== null) { $span->recordException($exception); - $span->setAttribute(\'error_message\', isset($exception) ? $exception->getMessage() : \'\'); - $span->setAttribute(\'error_code\', isset($exception) ? $exception->getCode() : \'\'); + $span->setAttribute(\'error_message\', $exception->getMessage()); + $span->setAttribute(\'error_code\', $exception->getCode()); } $span->setStatus($exception !== null ? \\OpenTelemetry\\API\\Trace\\StatusCode::STATUS_ERROR : \\OpenTelemetry\\API\\Trace\\StatusCode::STATUS_OK); From 63c70f6351a324f570023764ea6ec0c7576476a5 Mon Sep 17 00:00:00 2001 From: gechetspr Date: Fri, 20 Dec 2024 15:46:56 +0200 Subject: [PATCH 3/3] Fixed after review and removed unused part from hook generator --- .../Plugin/OpentelemetryMonitoringExtensionPlugin.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Spryker/Service/Opentelemetry/Plugin/OpentelemetryMonitoringExtensionPlugin.php b/src/Spryker/Service/Opentelemetry/Plugin/OpentelemetryMonitoringExtensionPlugin.php index 3f4c4a7..6350084 100644 --- a/src/Spryker/Service/Opentelemetry/Plugin/OpentelemetryMonitoringExtensionPlugin.php +++ b/src/Spryker/Service/Opentelemetry/Plugin/OpentelemetryMonitoringExtensionPlugin.php @@ -110,8 +110,8 @@ public function markIgnoreTransaction(): void /** * Specification: - * - Adds custom param that will be added to root span. - * - Adds CLI prefix to the service name. + * - Adds custom param into the root span that can be used to show only console commands. + * - Trace service name will be prepended with `CLI` prefix if this param is true. * * @api *