Skip to content

Commit 7cbcdd6

Browse files
fandreuzjack-berg
andauthored
Spatial aggregation for async instruments with filtering views (#7264)
Co-authored-by: jack-berg <[email protected]> Co-authored-by: Jack Berg <[email protected]>
1 parent 4aeb2f7 commit 7cbcdd6

15 files changed

+320
-620
lines changed

sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/internal/aggregator/Aggregator.java

-19
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
import io.opentelemetry.sdk.metrics.data.MetricDataType;
1414
import io.opentelemetry.sdk.metrics.data.PointData;
1515
import io.opentelemetry.sdk.metrics.internal.descriptor.MetricDescriptor;
16-
import io.opentelemetry.sdk.metrics.internal.state.Measurement;
1716
import io.opentelemetry.sdk.resources.Resource;
1817
import java.util.Collection;
1918
import javax.annotation.concurrent.Immutable;
@@ -68,24 +67,6 @@ default void diffInPlace(T previousCumulativeReusable, T currentCumulative) {
6867
throw new UnsupportedOperationException("This aggregator does not support diffInPlace.");
6968
}
7069

71-
/**
72-
* Return a new point representing the measurement.
73-
*
74-
* <p>Aggregators MUST implement diff if it can be used with asynchronous instruments.
75-
*/
76-
default T toPoint(Measurement measurement) {
77-
throw new UnsupportedOperationException("This aggregator does not support toPoint.");
78-
}
79-
80-
/**
81-
* Resets {@code reusablePoint} to represent the {@code measurement}.
82-
*
83-
* <p>Aggregators MUST implement diff if it can be used with asynchronous instruments.
84-
*/
85-
default void toPoint(Measurement measurement, T reusablePoint) {
86-
throw new UnsupportedOperationException("This aggregator does not support toPoint.");
87-
}
88-
8970
/** Creates a new reusable point. */
9071
default T createReusablePoint() {
9172
throw new UnsupportedOperationException(

sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/internal/aggregator/DoubleLastValueAggregator.java

+10-27
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,11 @@
1818
import io.opentelemetry.sdk.metrics.internal.data.MutableDoublePointData;
1919
import io.opentelemetry.sdk.metrics.internal.descriptor.MetricDescriptor;
2020
import io.opentelemetry.sdk.metrics.internal.exemplar.ExemplarReservoir;
21-
import io.opentelemetry.sdk.metrics.internal.state.Measurement;
2221
import io.opentelemetry.sdk.resources.Resource;
2322
import java.util.Collection;
2423
import java.util.List;
2524
import java.util.Objects;
25+
import java.util.concurrent.atomic.AtomicLong;
2626
import java.util.concurrent.atomic.AtomicReference;
2727
import java.util.function.Supplier;
2828
import javax.annotation.Nullable;
@@ -66,25 +66,6 @@ public void diffInPlace(DoublePointData previousReusable, DoublePointData curren
6666
((MutableDoublePointData) previousReusable).set(current);
6767
}
6868

69-
@Override
70-
public DoublePointData toPoint(Measurement measurement) {
71-
return ImmutableDoublePointData.create(
72-
measurement.startEpochNanos(),
73-
measurement.epochNanos(),
74-
measurement.attributes(),
75-
measurement.doubleValue());
76-
}
77-
78-
@Override
79-
public void toPoint(Measurement measurement, DoublePointData reusablePoint) {
80-
((MutableDoublePointData) reusablePoint)
81-
.set(
82-
measurement.startEpochNanos(),
83-
measurement.epochNanos(),
84-
measurement.attributes(),
85-
measurement.doubleValue());
86-
}
87-
8869
@Override
8970
public DoublePointData createReusablePoint() {
9071
return new MutableDoublePointData();
@@ -114,8 +95,8 @@ public MetricData toMetricData(
11495
}
11596

11697
static final class Handle extends AggregatorHandle<DoublePointData, DoubleExemplarData> {
117-
@Nullable private static final Double DEFAULT_VALUE = null;
118-
private final AtomicReference<Double> current = new AtomicReference<>(DEFAULT_VALUE);
98+
private final AtomicReference<AtomicLong> current = new AtomicReference<>(null);
99+
private final AtomicLong valueBits = new AtomicLong();
119100

120101
// Only used when memoryMode is REUSABLE_DATA
121102
@Nullable private final MutableDoublePointData reusablePoint;
@@ -136,20 +117,22 @@ protected DoublePointData doAggregateThenMaybeReset(
136117
Attributes attributes,
137118
List<DoubleExemplarData> exemplars,
138119
boolean reset) {
139-
Double value = reset ? this.current.getAndSet(DEFAULT_VALUE) : this.current.get();
120+
AtomicLong valueBits =
121+
Objects.requireNonNull(reset ? this.current.getAndSet(null) : this.current.get());
122+
double value = Double.longBitsToDouble(valueBits.get());
140123
if (reusablePoint != null) {
141-
reusablePoint.set(
142-
startEpochNanos, epochNanos, attributes, Objects.requireNonNull(value), exemplars);
124+
reusablePoint.set(startEpochNanos, epochNanos, attributes, value, exemplars);
143125
return reusablePoint;
144126
} else {
145127
return ImmutableDoublePointData.create(
146-
startEpochNanos, epochNanos, attributes, Objects.requireNonNull(value), exemplars);
128+
startEpochNanos, epochNanos, attributes, value, exemplars);
147129
}
148130
}
149131

150132
@Override
151133
protected void doRecordDouble(double value) {
152-
current.set(value);
134+
valueBits.set(Double.doubleToLongBits(value));
135+
current.compareAndSet(null, valueBits);
153136
}
154137
}
155138
}

sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/internal/aggregator/DoubleSumAggregator.java

-20
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
import io.opentelemetry.sdk.metrics.internal.descriptor.InstrumentDescriptor;
2222
import io.opentelemetry.sdk.metrics.internal.descriptor.MetricDescriptor;
2323
import io.opentelemetry.sdk.metrics.internal.exemplar.ExemplarReservoir;
24-
import io.opentelemetry.sdk.metrics.internal.state.Measurement;
2524
import io.opentelemetry.sdk.resources.Resource;
2625
import java.util.Collection;
2726
import java.util.List;
@@ -82,25 +81,6 @@ public void diffInPlace(DoublePointData previousReusablePoint, DoublePointData c
8281
currentPoint.getExemplars());
8382
}
8483

85-
@Override
86-
public DoublePointData toPoint(Measurement measurement) {
87-
return ImmutableDoublePointData.create(
88-
measurement.startEpochNanos(),
89-
measurement.epochNanos(),
90-
measurement.attributes(),
91-
measurement.doubleValue());
92-
}
93-
94-
@Override
95-
public void toPoint(Measurement measurement, DoublePointData reusablePoint) {
96-
((MutableDoublePointData) reusablePoint)
97-
.set(
98-
measurement.startEpochNanos(),
99-
measurement.epochNanos(),
100-
measurement.attributes(),
101-
measurement.doubleValue());
102-
}
103-
10484
@Override
10585
public DoublePointData createReusablePoint() {
10686
return new MutableDoublePointData();

sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/internal/aggregator/LongLastValueAggregator.java

-20
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
import io.opentelemetry.sdk.metrics.internal.data.MutableLongPointData;
1919
import io.opentelemetry.sdk.metrics.internal.descriptor.MetricDescriptor;
2020
import io.opentelemetry.sdk.metrics.internal.exemplar.ExemplarReservoir;
21-
import io.opentelemetry.sdk.metrics.internal.state.Measurement;
2221
import io.opentelemetry.sdk.resources.Resource;
2322
import java.util.Collection;
2423
import java.util.List;
@@ -63,25 +62,6 @@ public void diffInPlace(LongPointData previousReusablePoint, LongPointData curre
6362
((MutableLongPointData) previousReusablePoint).set(currentPoint);
6463
}
6564

66-
@Override
67-
public LongPointData toPoint(Measurement measurement) {
68-
return ImmutableLongPointData.create(
69-
measurement.startEpochNanos(),
70-
measurement.epochNanos(),
71-
measurement.attributes(),
72-
measurement.longValue());
73-
}
74-
75-
@Override
76-
public void toPoint(Measurement measurement, LongPointData reusablePoint) {
77-
((MutableLongPointData) reusablePoint)
78-
.set(
79-
measurement.startEpochNanos(),
80-
measurement.epochNanos(),
81-
measurement.attributes(),
82-
measurement.longValue());
83-
}
84-
8565
@Override
8666
public LongPointData createReusablePoint() {
8767
return new MutableLongPointData();

sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/internal/aggregator/LongSumAggregator.java

-20
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
import io.opentelemetry.sdk.metrics.internal.descriptor.InstrumentDescriptor;
2222
import io.opentelemetry.sdk.metrics.internal.descriptor.MetricDescriptor;
2323
import io.opentelemetry.sdk.metrics.internal.exemplar.ExemplarReservoir;
24-
import io.opentelemetry.sdk.metrics.internal.state.Measurement;
2524
import io.opentelemetry.sdk.resources.Resource;
2625
import java.util.Collection;
2726
import java.util.List;
@@ -75,25 +74,6 @@ public void diffInPlace(LongPointData previousReusablePoint, LongPointData curre
7574
currentPoint.getExemplars());
7675
}
7776

78-
@Override
79-
public LongPointData toPoint(Measurement measurement) {
80-
return ImmutableLongPointData.create(
81-
measurement.startEpochNanos(),
82-
measurement.epochNanos(),
83-
measurement.attributes(),
84-
measurement.longValue());
85-
}
86-
87-
@Override
88-
public void toPoint(Measurement measurement, LongPointData reusablePoint) {
89-
((MutableLongPointData) reusablePoint)
90-
.set(
91-
measurement.startEpochNanos(),
92-
measurement.epochNanos(),
93-
measurement.attributes(),
94-
measurement.longValue());
95-
}
96-
9777
@Override
9878
public LongPointData createReusablePoint() {
9979
return new MutableLongPointData();

0 commit comments

Comments
 (0)