18
18
import io .opentelemetry .sdk .metrics .internal .data .MutableDoublePointData ;
19
19
import io .opentelemetry .sdk .metrics .internal .descriptor .MetricDescriptor ;
20
20
import io .opentelemetry .sdk .metrics .internal .exemplar .ExemplarReservoir ;
21
- import io .opentelemetry .sdk .metrics .internal .state .Measurement ;
22
21
import io .opentelemetry .sdk .resources .Resource ;
23
22
import java .util .Collection ;
24
23
import java .util .List ;
25
24
import java .util .Objects ;
25
+ import java .util .concurrent .atomic .AtomicLong ;
26
26
import java .util .concurrent .atomic .AtomicReference ;
27
27
import java .util .function .Supplier ;
28
28
import javax .annotation .Nullable ;
@@ -66,25 +66,6 @@ public void diffInPlace(DoublePointData previousReusable, DoublePointData curren
66
66
((MutableDoublePointData ) previousReusable ).set (current );
67
67
}
68
68
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
-
88
69
@ Override
89
70
public DoublePointData createReusablePoint () {
90
71
return new MutableDoublePointData ();
@@ -114,8 +95,8 @@ public MetricData toMetricData(
114
95
}
115
96
116
97
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 ( );
119
100
120
101
// Only used when memoryMode is REUSABLE_DATA
121
102
@ Nullable private final MutableDoublePointData reusablePoint ;
@@ -136,20 +117,22 @@ protected DoublePointData doAggregateThenMaybeReset(
136
117
Attributes attributes ,
137
118
List <DoubleExemplarData > exemplars ,
138
119
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 ());
140
123
if (reusablePoint != null ) {
141
- reusablePoint .set (
142
- startEpochNanos , epochNanos , attributes , Objects .requireNonNull (value ), exemplars );
124
+ reusablePoint .set (startEpochNanos , epochNanos , attributes , value , exemplars );
143
125
return reusablePoint ;
144
126
} else {
145
127
return ImmutableDoublePointData .create (
146
- startEpochNanos , epochNanos , attributes , Objects . requireNonNull ( value ) , exemplars );
128
+ startEpochNanos , epochNanos , attributes , value , exemplars );
147
129
}
148
130
}
149
131
150
132
@ Override
151
133
protected void doRecordDouble (double value ) {
152
- current .set (value );
134
+ valueBits .set (Double .doubleToLongBits (value ));
135
+ current .compareAndSet (null , valueBits );
153
136
}
154
137
}
155
138
}
0 commit comments