opentelemetry::proto::collector::trace::v1::ExportTraceServiceRequest convert()

in prod/native/libphpbridge/code/OtlpExporter/SpanConverter.h [44:90]


    opentelemetry::proto::collector::trace::v1::ExportTraceServiceRequest convert(AutoZval const &spans) {
        opentelemetry::proto::collector::trace::v1::ExportTraceServiceRequest request;

        std::unordered_map<std::string, opentelemetry::proto::trace::v1::ResourceSpans *> resourceSpansMap;
        std::unordered_map<std::string, opentelemetry::proto::trace::v1::ScopeSpans *> scopeSpansMap;

        if (!spans.isArray()) {
            throw std::runtime_error("Invalid iterable passed to SpanConverter");
        }

        for (auto const &span : spans) {
            // auto internalSpan = span.readProperty("span");
            // auto resourceInfo = internalSpan.readProperty("resource");
            // auto instrumentationScope = internalSpan.readProperty("instrumentationScope");

            auto resourceInfo = span.assertObjectType("OpenTelemetry\\SDK\\Trace\\ImmutableSpan"sv).callMethod("getResource"sv); // ResourceInfo
            auto instrumentationScope = span.callMethod("getInstrumentationScope"sv);                                            // InstrumentationScopeInterface

            std::string resourceId = ConverterHelpers::getResourceId(resourceInfo);
            std::string scopeId = ConverterHelpers::getScopeId(instrumentationScope);

            opentelemetry::proto::trace::v1::ResourceSpans *resourceSpans;
            if (decltype(resourceSpansMap)::iterator resourceSpansIt = resourceSpansMap.find(resourceId); resourceSpansIt == resourceSpansMap.end()) {
                resourceSpans = request.add_resource_spans();
                convertResourceSpans(resourceInfo, resourceSpans);
                resourceSpansMap[resourceId] = resourceSpans;
            } else {
                resourceSpans = resourceSpansIt->second;
            }

            opentelemetry::proto::trace::v1::ScopeSpans *scopeSpans;
            std::string compositeKey = resourceId + "|" + scopeId;
            if (scopeSpansMap.count(compositeKey) == 0) {
                scopeSpans = resourceSpans->add_scope_spans();
                convertScopeSpans(instrumentationScope, scopeSpans);
                scopeSpansMap[compositeKey] = scopeSpans;
            } else {
                scopeSpans = scopeSpansMap[compositeKey];
            }

            opentelemetry::proto::trace::v1::Span *outSpan = scopeSpans->add_spans();

            convertSpan(span, outSpan);
        }

        return request;
    }