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