opentelemetry::proto::collector::logs::v1::ExportLogsServiceRequest convert()

in prod/native/libphpbridge/code/OtlpExporter/LogsConverter.h [45:85]


    opentelemetry::proto::collector::logs::v1::ExportLogsServiceRequest convert(AutoZval const &logs) {
        opentelemetry::proto::collector::logs::v1::ExportLogsServiceRequest request;

        std::unordered_map<std::string, opentelemetry::proto::logs::v1::ResourceLogs *> resourceLogsMap;
        std::unordered_map<std::string, opentelemetry::proto::logs::v1::ScopeLogs *> scopeLogsMap;

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

        for (auto const &log : logs) {
            auto resourceInfo = log.callMethod("getResource"sv);
            auto instrumentationScope = log.callMethod("getInstrumentationScope"sv);

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

            opentelemetry::proto::logs::v1::ResourceLogs *resourceLogs;
            if (resourceLogsMap.count(resourceId) == 0) {
                resourceLogs = request.add_resource_logs();
                convertResourceLogs(resourceInfo, resourceLogs);
                resourceLogsMap[resourceId] = resourceLogs;
            } else {
                resourceLogs = resourceLogsMap[resourceId];
            }

            opentelemetry::proto::logs::v1::ScopeLogs *scopeLogs;
            std::string compositeKey = resourceId + "|" + scopeId;
            if (scopeLogsMap.count(compositeKey) == 0) {
                scopeLogs = resourceLogs->add_scope_logs();
                convertInstrumentationScope(instrumentationScope, scopeLogs);
                scopeLogsMap[compositeKey] = scopeLogs;
            } else {
                scopeLogs = scopeLogsMap[compositeKey];
            }

            convertLogRecord(log, scopeLogs->add_log_records());
        }

        return request;
    }