diff options
| author | Saumit <justsaumit@protonmail.com> | 2025-09-27 02:14:26 +0530 |
|---|---|---|
| committer | Saumit <justsaumit@protonmail.com> | 2025-09-27 02:14:26 +0530 |
| commit | 82e03978b89938219958032efb1448cc76baa181 (patch) | |
| tree | 626f3e54d52ecd49be0ed3bee30abacc0453d081 /src/quote/app | |
Initial snapshot - OpenTelemetry demo 2.1.3 -f
Diffstat (limited to 'src/quote/app')
| -rw-r--r-- | src/quote/app/dependencies.php | 30 | ||||
| -rw-r--r-- | src/quote/app/routes.php | 74 | ||||
| -rw-r--r-- | src/quote/app/settings.php | 30 |
3 files changed, 134 insertions, 0 deletions
diff --git a/src/quote/app/dependencies.php b/src/quote/app/dependencies.php new file mode 100644 index 0000000..5d9ee1d --- /dev/null +++ b/src/quote/app/dependencies.php @@ -0,0 +1,30 @@ +<?php +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + + + +declare(strict_types=1); + +use App\Application\Settings\SettingsInterface; +use DI\ContainerBuilder; +use OpenTelemetry\API\Globals; +use OpenTelemetry\Contrib\Logs\Monolog\Handler; +use Monolog\Logger; +use Psr\Container\ContainerInterface; +use Psr\Log\LoggerInterface; +use Psr\Log\LogLevel; + +return function (ContainerBuilder $containerBuilder) { + $containerBuilder->addDefinitions([ + LoggerInterface::class => function (ContainerInterface $c) { + $settings = $c->get(SettingsInterface::class); + $loggerSettings = $settings->get('logger'); + $handler = new Handler( + Globals::loggerProvider(), + LogLevel::INFO, + ); + return new Logger($loggerSettings['name'], [$handler]); + }, + ]); +}; diff --git a/src/quote/app/routes.php b/src/quote/app/routes.php new file mode 100644 index 0000000..2c2231a --- /dev/null +++ b/src/quote/app/routes.php @@ -0,0 +1,74 @@ +<?php +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + + + +use OpenTelemetry\API\Globals; +use OpenTelemetry\API\Trace\Span; +use OpenTelemetry\API\Trace\SpanKind; +use Psr\Http\Message\ResponseInterface as Response; +use Psr\Http\Message\ServerRequestInterface as Request; +use Psr\Log\LoggerInterface; +use Slim\App; + +function calculateQuote($jsonObject): float +{ + $quote = 0.0; + $childSpan = Globals::tracerProvider()->getTracer('manual-instrumentation') + ->spanBuilder('calculate-quote') + ->setSpanKind(SpanKind::KIND_INTERNAL) + ->startSpan(); + $childSpan->addEvent('Calculating quote'); + + try { + if (!array_key_exists('numberOfItems', $jsonObject)) { + throw new \InvalidArgumentException('numberOfItems not provided'); + } + $numberOfItems = intval($jsonObject['numberOfItems']); + $costPerItem = rand(400, 1000)/10; + $quote = round($costPerItem * $numberOfItems, 2); + + $childSpan->setAttribute('app.quote.items.count', $numberOfItems); + $childSpan->setAttribute('app.quote.cost.total', $quote); + + $childSpan->addEvent('Quote calculated, returning its value'); + + //manual metrics + static $counter; + $counter ??= Globals::meterProvider() + ->getMeter('quotes') + ->createCounter('quotes', 'quotes', 'number of quotes calculated'); + $counter->add(1, ['number_of_items' => $numberOfItems]); + } catch (\Exception $exception) { + $childSpan->recordException($exception); + } finally { + $childSpan->end(); + return $quote; + } +} + +return function (App $app) { + $app->post('/getquote', function (Request $request, Response $response, LoggerInterface $logger) { + $span = Span::getCurrent(); + $span->addEvent('Received get quote request, processing it'); + + $jsonObject = $request->getParsedBody(); + + $data = calculateQuote($jsonObject); + + $payload = json_encode($data); + $response->getBody()->write($payload); + + $span->addEvent('Quote processed, response sent back', [ + 'app.quote.cost.total' => $data + ]); + //exported as an opentelemetry log (see dependencies.php) + $logger->info('Calculated quote', [ + 'total' => $data, + ]); + + return $response + ->withHeader('Content-Type', 'application/json'); + }); +}; diff --git a/src/quote/app/settings.php b/src/quote/app/settings.php new file mode 100644 index 0000000..dd4774e --- /dev/null +++ b/src/quote/app/settings.php @@ -0,0 +1,30 @@ +<?php +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + + + +declare(strict_types=1); + +use App\Application\Settings\Settings; +use App\Application\Settings\SettingsInterface; +use DI\ContainerBuilder; +use Psr\Log\LogLevel; + +return function (ContainerBuilder $containerBuilder) { + // Global Settings Object + $containerBuilder->addDefinitions([ + SettingsInterface::class => function () { + return new Settings([ + 'displayErrorDetails' => true, // Should be set to false in production + 'logError' => false, + 'logErrorDetails' => false, + 'logger' => [ + 'name' => 'slim-app', + 'path' => 'php://stdout', + 'level' => LogLevel::DEBUG, + ], + ]); + } + ]); +}; |
