io.opentelemetry.exporter.internal.otlp.metrics.ResourceMetricsMarshaler Maven / Gradle / Ivy
Show all versions of opentelemetry-exporter-otlp-common Show documentation
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/
package io.opentelemetry.exporter.internal.otlp.metrics;
import io.opentelemetry.exporter.internal.marshal.Marshaler;
import io.opentelemetry.exporter.internal.marshal.MarshalerUtil;
import io.opentelemetry.exporter.internal.marshal.MarshalerWithSize;
import io.opentelemetry.exporter.internal.marshal.Serializer;
import io.opentelemetry.exporter.internal.otlp.InstrumentationScopeMarshaler;
import io.opentelemetry.exporter.internal.otlp.ResourceMarshaler;
import io.opentelemetry.proto.metrics.v1.internal.ResourceMetrics;
import io.opentelemetry.sdk.common.InstrumentationScopeInfo;
import io.opentelemetry.sdk.metrics.data.MetricData;
import io.opentelemetry.sdk.resources.Resource;
import java.io.IOException;
import java.util.Collection;
import java.util.List;
import java.util.Map;
/**
* A Marshaler of ResourceMetrics.
*
* This class is internal and is hence not for public use. Its APIs are unstable and can change
* at any time.
*/
public final class ResourceMetricsMarshaler extends MarshalerWithSize {
private final ResourceMarshaler resourceMarshaler;
private final byte[] schemaUrl;
private final InstrumentationScopeMetricsMarshaler[] instrumentationScopeMetricsMarshalers;
/** Returns Marshalers of ResourceMetrics created by grouping the provided metricData. */
@SuppressWarnings("AvoidObjectArrays")
public static ResourceMetricsMarshaler[] create(Collection metricDataList) {
Map>> resourceAndScopeMap =
groupByResourceAndScope(metricDataList);
ResourceMetricsMarshaler[] resourceMetricsMarshalers =
new ResourceMetricsMarshaler[resourceAndScopeMap.size()];
int posResource = 0;
for (Map.Entry>> entry :
resourceAndScopeMap.entrySet()) {
InstrumentationScopeMetricsMarshaler[] instrumentationLibrarySpansMarshalers =
new InstrumentationScopeMetricsMarshaler[entry.getValue().size()];
int posInstrumentation = 0;
for (Map.Entry> entryIs :
entry.getValue().entrySet()) {
instrumentationLibrarySpansMarshalers[posInstrumentation++] =
new InstrumentationScopeMetricsMarshaler(
InstrumentationScopeMarshaler.create(entryIs.getKey()),
MarshalerUtil.toBytes(entryIs.getKey().getSchemaUrl()),
entryIs.getValue());
}
resourceMetricsMarshalers[posResource++] =
new ResourceMetricsMarshaler(
ResourceMarshaler.create(entry.getKey()),
MarshalerUtil.toBytes(entry.getKey().getSchemaUrl()),
instrumentationLibrarySpansMarshalers);
}
return resourceMetricsMarshalers;
}
ResourceMetricsMarshaler(
ResourceMarshaler resourceMarshaler,
byte[] schemaUrl,
InstrumentationScopeMetricsMarshaler[] instrumentationScopeMetricsMarshalers) {
super(calculateSize(resourceMarshaler, schemaUrl, instrumentationScopeMetricsMarshalers));
this.resourceMarshaler = resourceMarshaler;
this.schemaUrl = schemaUrl;
this.instrumentationScopeMetricsMarshalers = instrumentationScopeMetricsMarshalers;
}
@Override
public void writeTo(Serializer output) throws IOException {
output.serializeMessage(ResourceMetrics.RESOURCE, resourceMarshaler);
output.serializeRepeatedMessage(
ResourceMetrics.SCOPE_METRICS, instrumentationScopeMetricsMarshalers);
output.serializeString(ResourceMetrics.SCHEMA_URL, schemaUrl);
}
private static int calculateSize(
ResourceMarshaler resourceMarshaler,
byte[] schemaUrl,
InstrumentationScopeMetricsMarshaler[] instrumentationScopeMetricsMarshalers) {
int size = 0;
size += MarshalerUtil.sizeMessage(ResourceMetrics.RESOURCE, resourceMarshaler);
size += MarshalerUtil.sizeBytes(ResourceMetrics.SCHEMA_URL, schemaUrl);
size +=
MarshalerUtil.sizeRepeatedMessage(
ResourceMetrics.SCOPE_METRICS, instrumentationScopeMetricsMarshalers);
return size;
}
private static Map>>
groupByResourceAndScope(Collection metricDataList) {
return MarshalerUtil.groupByResourceAndScope(
metricDataList,
// TODO(anuraaga): Replace with an internal SdkData type of interface that exposes these
// two.
MetricData::getResource,
MetricData::getInstrumentationScopeInfo,
MetricMarshaler::create);
}
}