opentelemetry::proto::collector::metrics::v1::ExportMetricsServiceRequest convert()

in prod/native/libphpbridge/code/OtlpExporter/MetricConverter.h [47:83]


    opentelemetry::proto::collector::metrics::v1::ExportMetricsServiceRequest convert(AutoZval const &metrics) {
        if (!metrics.isArray()) {
            throw std::runtime_error("Invalid iterable passed to MetricsConverter");
        }

        opentelemetry::proto::collector::metrics::v1::ExportMetricsServiceRequest request;

        std::unordered_map<std::string, opentelemetry::proto::metrics::v1::ResourceMetrics *> resourceMetricsMap;
        std::unordered_map<std::string, opentelemetry::proto::metrics::v1::ScopeMetrics *> scopeMetricsMap;

        for (auto const &metric : metrics) {
            auto resource = metric.readProperty("resource");
            auto scope = metric.readProperty("instrumentationScope");

            std::string resourceId = ConverterHelpers::getResourceId(resource);
            std::string scopeId = ConverterHelpers::getScopeId(scope);

            auto *resourceMetrics = resourceMetricsMap[resourceId];
            if (!resourceMetrics) {
                resourceMetrics = request.add_resource_metrics();
                convertResourceMetrics(resource, resourceMetrics);
                resourceMetricsMap[resourceId] = resourceMetrics;
            }

            std::string key = resourceId + '|' + scopeId;
            auto *scopeMetrics = scopeMetricsMap[key];
            if (!scopeMetrics) {
                scopeMetrics = resourceMetrics->add_scope_metrics();
                convertScopeMetrics(scope, scopeMetrics);
                scopeMetricsMap[key] = scopeMetrics;
            }

            convertMetric(metric, scopeMetrics->add_metrics());
        }

        return request;
    }