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;
}