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']); $quote = round(8.90 * $numberOfItems, 2); $childSpan->setAttribute('app.quote.items.count', $numberOfItems); $childSpan->setAttribute('app.quote.cost.total', $quote); $childSpan->addEvent('Quote calculated, returning its value'); } catch (\Exception $exception) { $childSpan->recordException($exception); } finally { $childSpan->end(); return $quote; } } return function (App $app) { $app->post('/getquote', function (Request $request, Response $response) { $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 ]); return $response ->withHeader('Content-Type', 'application/json'); }); };