-
Notifications
You must be signed in to change notification settings - Fork 771
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Low allocation OTLP metrics marshaler (#6422)
- Loading branch information
Showing
24 changed files
with
1,897 additions
and
79 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
93 changes: 93 additions & 0 deletions
93
...main/java/io/opentelemetry/exporter/internal/otlp/metrics/ExemplarStatelessMarshaler.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,93 @@ | ||
/* | ||
* Copyright The OpenTelemetry Authors | ||
* SPDX-License-Identifier: Apache-2.0 | ||
*/ | ||
|
||
package io.opentelemetry.exporter.internal.otlp.metrics; | ||
|
||
import static io.opentelemetry.exporter.internal.otlp.metrics.ExemplarMarshaler.toProtoExemplarValueType; | ||
|
||
import io.opentelemetry.api.trace.SpanContext; | ||
import io.opentelemetry.exporter.internal.marshal.MarshalerContext; | ||
import io.opentelemetry.exporter.internal.marshal.MarshalerUtil; | ||
import io.opentelemetry.exporter.internal.marshal.ProtoFieldInfo; | ||
import io.opentelemetry.exporter.internal.marshal.Serializer; | ||
import io.opentelemetry.exporter.internal.marshal.StatelessMarshaler; | ||
import io.opentelemetry.exporter.internal.marshal.StatelessMarshalerUtil; | ||
import io.opentelemetry.exporter.internal.otlp.KeyValueStatelessMarshaler; | ||
import io.opentelemetry.sdk.metrics.data.DoubleExemplarData; | ||
import io.opentelemetry.sdk.metrics.data.ExemplarData; | ||
import io.opentelemetry.sdk.metrics.data.LongExemplarData; | ||
import java.io.IOException; | ||
|
||
/** See {@link ExemplarMarshaler}. */ | ||
final class ExemplarStatelessMarshaler implements StatelessMarshaler<ExemplarData> { | ||
static final ExemplarStatelessMarshaler INSTANCE = new ExemplarStatelessMarshaler(); | ||
|
||
private ExemplarStatelessMarshaler() {} | ||
|
||
@Override | ||
public void writeTo(Serializer output, ExemplarData exemplar, MarshalerContext context) | ||
throws IOException { | ||
output.serializeFixed64( | ||
io.opentelemetry.proto.metrics.v1.internal.Exemplar.TIME_UNIX_NANO, | ||
exemplar.getEpochNanos()); | ||
ProtoFieldInfo valueField = toProtoExemplarValueType(exemplar); | ||
if (valueField == io.opentelemetry.proto.metrics.v1.internal.Exemplar.AS_INT) { | ||
output.serializeFixed64Optional(valueField, ((LongExemplarData) exemplar).getValue()); | ||
} else { | ||
output.serializeDoubleOptional(valueField, ((DoubleExemplarData) exemplar).getValue()); | ||
} | ||
SpanContext spanContext = exemplar.getSpanContext(); | ||
if (spanContext.isValid()) { | ||
output.serializeSpanId( | ||
io.opentelemetry.proto.metrics.v1.internal.Exemplar.SPAN_ID, | ||
spanContext.getSpanId(), | ||
context); | ||
output.serializeTraceId( | ||
io.opentelemetry.proto.metrics.v1.internal.Exemplar.TRACE_ID, | ||
spanContext.getTraceId(), | ||
context); | ||
} | ||
output.serializeRepeatedMessageWithContext( | ||
io.opentelemetry.proto.metrics.v1.internal.Exemplar.FILTERED_ATTRIBUTES, | ||
exemplar.getFilteredAttributes(), | ||
KeyValueStatelessMarshaler.INSTANCE, | ||
context); | ||
} | ||
|
||
@Override | ||
public int getBinarySerializedSize(ExemplarData exemplar, MarshalerContext context) { | ||
int size = 0; | ||
size += | ||
MarshalerUtil.sizeFixed64( | ||
io.opentelemetry.proto.metrics.v1.internal.Exemplar.TIME_UNIX_NANO, | ||
exemplar.getEpochNanos()); | ||
ProtoFieldInfo valueField = toProtoExemplarValueType(exemplar); | ||
if (valueField == io.opentelemetry.proto.metrics.v1.internal.Exemplar.AS_INT) { | ||
size += | ||
MarshalerUtil.sizeFixed64Optional(valueField, ((LongExemplarData) exemplar).getValue()); | ||
} else { | ||
size += | ||
MarshalerUtil.sizeDoubleOptional(valueField, ((DoubleExemplarData) exemplar).getValue()); | ||
} | ||
SpanContext spanContext = exemplar.getSpanContext(); | ||
if (spanContext.isValid()) { | ||
size += | ||
MarshalerUtil.sizeSpanId( | ||
io.opentelemetry.proto.metrics.v1.internal.Exemplar.SPAN_ID, spanContext.getSpanId()); | ||
size += | ||
MarshalerUtil.sizeTraceId( | ||
io.opentelemetry.proto.metrics.v1.internal.Exemplar.TRACE_ID, | ||
spanContext.getTraceId()); | ||
} | ||
size += | ||
StatelessMarshalerUtil.sizeRepeatedMessageWithContext( | ||
io.opentelemetry.proto.metrics.v1.internal.Exemplar.FILTERED_ATTRIBUTES, | ||
exemplar.getFilteredAttributes(), | ||
KeyValueStatelessMarshaler.INSTANCE, | ||
context); | ||
|
||
return size; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
47 changes: 47 additions & 0 deletions
47
...lemetry/exporter/internal/otlp/metrics/ExponentialHistogramBucketsStatelessMarshaler.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,47 @@ | ||
/* | ||
* Copyright The OpenTelemetry Authors | ||
* SPDX-License-Identifier: Apache-2.0 | ||
*/ | ||
|
||
package io.opentelemetry.exporter.internal.otlp.metrics; | ||
|
||
import io.opentelemetry.exporter.internal.marshal.MarshalerContext; | ||
import io.opentelemetry.exporter.internal.marshal.Serializer; | ||
import io.opentelemetry.exporter.internal.marshal.StatelessMarshaler; | ||
import io.opentelemetry.proto.metrics.v1.internal.ExponentialHistogramDataPoint; | ||
import io.opentelemetry.sdk.internal.DynamicPrimitiveLongList; | ||
import io.opentelemetry.sdk.internal.PrimitiveLongList; | ||
import io.opentelemetry.sdk.metrics.data.ExponentialHistogramBuckets; | ||
import java.io.IOException; | ||
import java.util.List; | ||
|
||
/** See {@link ExponentialHistogramBucketsMarshaler}. */ | ||
final class ExponentialHistogramBucketsStatelessMarshaler | ||
implements StatelessMarshaler<ExponentialHistogramBuckets> { | ||
static final ExponentialHistogramBucketsStatelessMarshaler INSTANCE = | ||
new ExponentialHistogramBucketsStatelessMarshaler(); | ||
|
||
private ExponentialHistogramBucketsStatelessMarshaler() {} | ||
|
||
@Override | ||
public void writeTo( | ||
Serializer output, ExponentialHistogramBuckets buckets, MarshalerContext context) | ||
throws IOException { | ||
output.serializeSInt32(ExponentialHistogramDataPoint.Buckets.OFFSET, buckets.getOffset()); | ||
List<Long> counts = buckets.getBucketCounts(); | ||
if (counts instanceof DynamicPrimitiveLongList) { | ||
output.serializeRepeatedUInt64( | ||
ExponentialHistogramDataPoint.Buckets.BUCKET_COUNTS, (DynamicPrimitiveLongList) counts); | ||
} else { | ||
output.serializeRepeatedUInt64( | ||
ExponentialHistogramDataPoint.Buckets.BUCKET_COUNTS, PrimitiveLongList.toArray(counts)); | ||
} | ||
} | ||
|
||
@Override | ||
public int getBinarySerializedSize( | ||
ExponentialHistogramBuckets buckets, MarshalerContext context) { | ||
return ExponentialHistogramBucketsMarshaler.calculateSize( | ||
buckets.getOffset(), buckets.getBucketCounts()); | ||
} | ||
} |
113 changes: 113 additions & 0 deletions
113
...metry/exporter/internal/otlp/metrics/ExponentialHistogramDataPointStatelessMarshaler.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,113 @@ | ||
/* | ||
* Copyright The OpenTelemetry Authors | ||
* SPDX-License-Identifier: Apache-2.0 | ||
*/ | ||
|
||
package io.opentelemetry.exporter.internal.otlp.metrics; | ||
|
||
import io.opentelemetry.exporter.internal.marshal.MarshalerContext; | ||
import io.opentelemetry.exporter.internal.marshal.MarshalerUtil; | ||
import io.opentelemetry.exporter.internal.marshal.Serializer; | ||
import io.opentelemetry.exporter.internal.marshal.StatelessMarshaler; | ||
import io.opentelemetry.exporter.internal.marshal.StatelessMarshalerUtil; | ||
import io.opentelemetry.exporter.internal.otlp.KeyValueStatelessMarshaler; | ||
import io.opentelemetry.proto.metrics.v1.internal.ExponentialHistogramDataPoint; | ||
import io.opentelemetry.sdk.metrics.data.ExponentialHistogramPointData; | ||
import java.io.IOException; | ||
|
||
/** See {@link ExponentialHistogramDataPointMarshaler}. */ | ||
final class ExponentialHistogramDataPointStatelessMarshaler | ||
implements StatelessMarshaler<ExponentialHistogramPointData> { | ||
static final ExponentialHistogramDataPointStatelessMarshaler INSTANCE = | ||
new ExponentialHistogramDataPointStatelessMarshaler(); | ||
|
||
private ExponentialHistogramDataPointStatelessMarshaler() {} | ||
|
||
@Override | ||
public void writeTo( | ||
Serializer output, ExponentialHistogramPointData point, MarshalerContext context) | ||
throws IOException { | ||
output.serializeFixed64( | ||
ExponentialHistogramDataPoint.START_TIME_UNIX_NANO, point.getStartEpochNanos()); | ||
output.serializeFixed64(ExponentialHistogramDataPoint.TIME_UNIX_NANO, point.getEpochNanos()); | ||
output.serializeFixed64(ExponentialHistogramDataPoint.COUNT, point.getCount()); | ||
output.serializeDouble(ExponentialHistogramDataPoint.SUM, point.getSum()); | ||
if (point.hasMin()) { | ||
output.serializeDoubleOptional(ExponentialHistogramDataPoint.MIN, point.getMin()); | ||
} | ||
if (point.hasMax()) { | ||
output.serializeDoubleOptional(ExponentialHistogramDataPoint.MAX, point.getMax()); | ||
} | ||
output.serializeSInt32(ExponentialHistogramDataPoint.SCALE, point.getScale()); | ||
output.serializeFixed64(ExponentialHistogramDataPoint.ZERO_COUNT, point.getZeroCount()); | ||
output.serializeMessageWithContext( | ||
ExponentialHistogramDataPoint.POSITIVE, | ||
point.getPositiveBuckets(), | ||
ExponentialHistogramBucketsStatelessMarshaler.INSTANCE, | ||
context); | ||
output.serializeMessageWithContext( | ||
ExponentialHistogramDataPoint.NEGATIVE, | ||
point.getNegativeBuckets(), | ||
ExponentialHistogramBucketsStatelessMarshaler.INSTANCE, | ||
context); | ||
output.serializeRepeatedMessageWithContext( | ||
ExponentialHistogramDataPoint.EXEMPLARS, | ||
point.getExemplars(), | ||
ExemplarStatelessMarshaler.INSTANCE, | ||
context); | ||
output.serializeRepeatedMessageWithContext( | ||
ExponentialHistogramDataPoint.ATTRIBUTES, | ||
point.getAttributes(), | ||
KeyValueStatelessMarshaler.INSTANCE, | ||
context); | ||
} | ||
|
||
@Override | ||
public int getBinarySerializedSize( | ||
ExponentialHistogramPointData point, MarshalerContext context) { | ||
int size = 0; | ||
size += | ||
MarshalerUtil.sizeFixed64( | ||
ExponentialHistogramDataPoint.START_TIME_UNIX_NANO, point.getStartEpochNanos()); | ||
size += | ||
MarshalerUtil.sizeFixed64( | ||
ExponentialHistogramDataPoint.TIME_UNIX_NANO, point.getEpochNanos()); | ||
size += MarshalerUtil.sizeFixed64(ExponentialHistogramDataPoint.COUNT, point.getCount()); | ||
size += MarshalerUtil.sizeDouble(ExponentialHistogramDataPoint.SUM, point.getSum()); | ||
if (point.hasMin()) { | ||
size += MarshalerUtil.sizeDoubleOptional(ExponentialHistogramDataPoint.MIN, point.getMin()); | ||
} | ||
if (point.hasMax()) { | ||
size += MarshalerUtil.sizeDoubleOptional(ExponentialHistogramDataPoint.MAX, point.getMax()); | ||
} | ||
size += MarshalerUtil.sizeSInt32(ExponentialHistogramDataPoint.SCALE, point.getScale()); | ||
size += | ||
MarshalerUtil.sizeFixed64(ExponentialHistogramDataPoint.ZERO_COUNT, point.getZeroCount()); | ||
size += | ||
StatelessMarshalerUtil.sizeMessageWithContext( | ||
ExponentialHistogramDataPoint.POSITIVE, | ||
point.getPositiveBuckets(), | ||
ExponentialHistogramBucketsStatelessMarshaler.INSTANCE, | ||
context); | ||
size += | ||
StatelessMarshalerUtil.sizeMessageWithContext( | ||
ExponentialHistogramDataPoint.NEGATIVE, | ||
point.getNegativeBuckets(), | ||
ExponentialHistogramBucketsStatelessMarshaler.INSTANCE, | ||
context); | ||
size += | ||
StatelessMarshalerUtil.sizeRepeatedMessageWithContext( | ||
ExponentialHistogramDataPoint.EXEMPLARS, | ||
point.getExemplars(), | ||
ExemplarStatelessMarshaler.INSTANCE, | ||
context); | ||
size += | ||
StatelessMarshalerUtil.sizeRepeatedMessageWithContext( | ||
ExponentialHistogramDataPoint.ATTRIBUTES, | ||
point.getAttributes(), | ||
KeyValueStatelessMarshaler.INSTANCE, | ||
context); | ||
|
||
return size; | ||
} | ||
} |
Oops, something went wrong.