private function shouldReduceFrame()

in prod/php/ElasticOTel/InferredSpans/InferredSpans.php [255:299]


    private function shouldReduceFrame(int $index, int $oldFramesCount, int &$previousFrameStackTraceId, bool &$forceParentChangeFailed): bool
    {
        $frameStackTraceId = $this->lastStackTrace[$index][self::METADATA_STACKTRACE_ID];

        $dropSpan = $previousFrameStackTraceId == $frameStackTraceId; // if frame came from same stackTrace (interval) - we're dropping all spans above as they have same timing

        $previousFrameStackTraceId = $frameStackTraceId;

        if (!$dropSpan) { // if span should not be dropped, search for spans with same traceId and get parent from last one
            // find last span with same stackTraceId
            $lastSpanParent = null;
            for ($i = $index + 1; $i < $oldFramesCount; $i++) {
                if ($this->lastStackTrace[$i][self::METADATA_STACKTRACE_ID] != $frameStackTraceId) {
                    break;
                }

                $span = $this->lastStackTrace[$i][self::METADATA_SPAN]->get();
                if (!$span instanceof Span) {
                    break;
                }

                $lastSpanParent = $span->getParentContext();
            }

            if ($lastSpanParent) {
                $span = $this->lastStackTrace[$index][self::METADATA_SPAN]->get();
                if (!$span instanceof Span) {
                    return false;
                }

                self::logDebug(
                    "Changing parent of span: '" . $span->getName() . "'",
                    ['new', $lastSpanParent, 'old', $span->getParentContext()]
                );

                $forceParentChangeFailed = !force_set_object_property_value($span, "parentSpanContext", $lastSpanParent);
            }
        }

        if ($forceParentChangeFailed && $dropSpan) {
            $dropSpan = false;
        }

        return $dropSpan;
    }