private function startFrameSpan()

in prod/php/ElasticOTel/InferredSpans/InferredSpans.php [361:390]


    private function startFrameSpan(array $frame, int $durationMs, ?ContextInterface $parentContext, int $stackTraceId): array
    {
        $parent = $parentContext ?? Context::getCurrent();

        $spanName = (!empty($frame['class']) ? ($frame['class'] . '::') : '') . (!empty($frame['function']) ? $frame['function'] : '[unknown]');

        $builder = $this->tracer->spanBuilder($spanName)
            ->setParent($parent)
            ->setStartTimestamp($this->getStartTime($durationMs))
            ->setSpanKind(SpanKind::KIND_INTERNAL)
            ->setAttribute(self::IS_INFERRED_ATTRIBUTE_NAME, true);

        self::setAttributeToFrameValue($frame, 'function', $builder, TraceAttributes::CODE_FUNCTION_NAME);
        self::setAttributeToFrameValue($frame, 'class', $builder, TraceAttributes::CODE_NAMESPACE);
        self::setAttributeToFrameValue($frame, 'file', $builder, TraceAttributes::CODE_FILE_PATH);
        self::setAttributeToFrameValue($frame, 'line', $builder, TraceAttributes::CODE_LINE_NUMBER);

        $span = $builder->startSpan(); //OpenTelemetry\API\Trace\SpanInterface
        $context = $span->storeInContext($parent); //OpenTelemetry\Context\ContextInterface
        $scope = Context::storage()->attach($context); //OpenTelemetry\Context\ContextStorageScopeInterface

        $newFrame = $frame;
        $newFrame[self::METADATA_SPAN] = WeakReference::create($span);
        $newFrame[self::METADATA_CONTEXT] = WeakReference::create($context);
        $newFrame[self::METADATA_SCOPE] = WeakReference::create($scope);
        $newFrame[self::METADATA_STACKTRACE_ID] = $stackTraceId;

        self::logDebug("Span started: " . $newFrame['function'] . " parentContext: " . ($parentContext ? "custom" : "default") . " stackTraceId: " . $stackTraceId);
        return $newFrame;
    }