Skip to content

Commit f3e3b50

Browse files
committed
Simplify dynamic meter config mechanics
1 parent 7ab9b3a commit f3e3b50

11 files changed

Lines changed: 386 additions & 321 deletions

File tree

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
Comparing source compatibility of opentelemetry-sdk-metrics-1.51.0-SNAPSHOT.jar against opentelemetry-sdk-metrics-1.50.0.jar
1+
Comparing source compatibility of opentelemetry-sdk-metrics-1.51.0-SNAPSHOT.jar against opentelemetry-sdk-metrics-1.51.0.jar
22
No changes.

sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkMeter.java

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -123,21 +123,22 @@ InstrumentationScopeInfo getInstrumentationScopeInfo() {
123123

124124
/** Collect all metrics for the meter. */
125125
Collection<MetricData> collectAll(RegisteredReader registeredReader, long epochNanos) {
126-
// Short circuit collection process if meter is disabled
127-
if (!meterEnabled) {
128-
return Collections.emptyList();
129-
}
130126
List<CallbackRegistration> currentRegisteredCallbacks;
131127
synchronized (callbackLock) {
132128
currentRegisteredCallbacks = new ArrayList<>(callbackRegistrations);
133129
}
134130
// Collections across all readers are sequential
135131
synchronized (collectLock) {
136-
for (CallbackRegistration callbackRegistration : currentRegisteredCallbacks) {
137-
callbackRegistration.invokeCallback(
138-
registeredReader, meterProviderSharedState.getStartEpochNanos(), epochNanos);
132+
// Only invoke callbacks if meter is enabled
133+
if (meterEnabled) {
134+
for (CallbackRegistration callbackRegistration : currentRegisteredCallbacks) {
135+
callbackRegistration.invokeCallback(
136+
registeredReader, meterProviderSharedState.getStartEpochNanos(), epochNanos);
137+
}
139138
}
140139

140+
// Collect even if meter is disabled. Storage is responsible for managing state and returning
141+
// empty metric if disabled.
141142
Collection<MetricStorage> storages =
142143
Objects.requireNonNull(readerStorageRegistries.get(registeredReader)).getStorages();
143144
List<MetricData> result = new ArrayList<>(storages.size());
@@ -288,7 +289,8 @@ WriteableMetricStorage registerSynchronousMetricStorage(InstrumentDescriptor ins
288289
reader,
289290
registeredView,
290291
instrument,
291-
meterProviderSharedState.getExemplarFilter())));
292+
meterProviderSharedState.getExemplarFilter(),
293+
meterEnabled)));
292294
}
293295
}
294296

@@ -314,7 +316,8 @@ SdkObservableMeasurement registerObservableMeasurement(
314316
}
315317
registeredStorages.add(
316318
registry.register(
317-
AsynchronousMetricStorage.create(reader, registeredView, instrumentDescriptor)));
319+
AsynchronousMetricStorage.create(
320+
reader, registeredView, instrumentDescriptor, meterEnabled)));
318321
}
319322
}
320323

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
import io.opentelemetry.sdk.common.InstrumentationScopeInfo;
99
import io.opentelemetry.sdk.metrics.data.AggregationTemporality;
10+
import io.opentelemetry.sdk.metrics.data.DoubleExemplarData;
1011
import io.opentelemetry.sdk.metrics.data.ExemplarData;
1112
import io.opentelemetry.sdk.metrics.data.MetricData;
1213
import io.opentelemetry.sdk.metrics.data.MetricDataType;
@@ -26,9 +27,8 @@
2627
@Immutable
2728
public interface Aggregator<T extends PointData, U extends ExemplarData> {
2829
/** Returns the drop aggregator, an aggregator that drops measurements. */
29-
@SuppressWarnings("unchecked")
30-
static <T extends PointData, U extends ExemplarData> Aggregator<T, U> drop() {
31-
return (Aggregator<T, U>) DropAggregator.INSTANCE;
30+
static Aggregator<?, DoubleExemplarData> drop() {
31+
return DropAggregator.INSTANCE;
3232
}
3333

3434
/**

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

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import io.opentelemetry.api.common.Attributes;
99
import io.opentelemetry.sdk.common.InstrumentationScopeInfo;
1010
import io.opentelemetry.sdk.metrics.data.AggregationTemporality;
11+
import io.opentelemetry.sdk.metrics.data.DoubleExemplarData;
1112
import io.opentelemetry.sdk.metrics.data.ExemplarData;
1213
import io.opentelemetry.sdk.metrics.data.MetricData;
1314
import io.opentelemetry.sdk.metrics.data.PointData;
@@ -24,7 +25,7 @@
2425
* <p>This class is internal and is hence not for public use. Its APIs are unstable and can change
2526
* at any time.
2627
*/
27-
public final class DropAggregator implements Aggregator<PointData, ExemplarData> {
28+
public final class DropAggregator implements Aggregator<PointData, DoubleExemplarData> {
2829

2930
private static final PointData POINT_DATA =
3031
new PointData() {
@@ -49,16 +50,16 @@ public List<? extends ExemplarData> getExemplars() {
4950
}
5051
};
5152

52-
public static final Aggregator<PointData, ExemplarData> INSTANCE = new DropAggregator();
53+
public static final Aggregator<PointData, DoubleExemplarData> INSTANCE = new DropAggregator();
5354

54-
private static final AggregatorHandle<PointData, ExemplarData> HANDLE =
55-
new AggregatorHandle<PointData, ExemplarData>(ExemplarReservoir.anyNoSamples()) {
55+
private static final AggregatorHandle<PointData, DoubleExemplarData> HANDLE =
56+
new AggregatorHandle<PointData, DoubleExemplarData>(ExemplarReservoir.doubleNoSamples()) {
5657
@Override
5758
protected PointData doAggregateThenMaybeReset(
5859
long startEpochNanos,
5960
long epochNanos,
6061
Attributes attributes,
61-
List<ExemplarData> exemplars,
62+
List<DoubleExemplarData> exemplars,
6263
boolean reset) {
6364
return POINT_DATA;
6465
}
@@ -73,7 +74,7 @@ protected void doRecordDouble(double value) {}
7374
private DropAggregator() {}
7475

7576
@Override
76-
public AggregatorHandle<PointData, ExemplarData> createHandle() {
77+
public AggregatorHandle<PointData, DoubleExemplarData> createHandle() {
7778
return HANDLE;
7879
}
7980

sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/internal/exemplar/ExemplarReservoir.java

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -55,11 +55,6 @@ static ExemplarReservoir<LongExemplarData> longNoSamples() {
5555
return NoopExemplarReservoir.LONG_INSTANCE;
5656
}
5757

58-
/** An exemplar reservoir that stores no exemplars. */
59-
static ExemplarReservoir<ExemplarData> anyNoSamples() {
60-
return NoopExemplarReservoir.ANY_INSTANCE;
61-
}
62-
6358
/**
6459
* A double reservoir with fixed size that stores the given number of exemplars.
6560
*

sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/internal/exemplar/NoopExemplarReservoir.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ class NoopExemplarReservoir<T extends ExemplarData> implements ExemplarReservoir
2020
new NoopExemplarReservoir<>();
2121
static final NoopExemplarReservoir<DoubleExemplarData> DOUBLE_INSTANCE =
2222
new NoopExemplarReservoir<>();
23-
static final NoopExemplarReservoir<ExemplarData> ANY_INSTANCE = new NoopExemplarReservoir<>();
2423

2524
private NoopExemplarReservoir() {}
2625

sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/internal/state/AsynchronousMetricStorage.java

Lines changed: 16 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import io.opentelemetry.sdk.metrics.internal.aggregator.Aggregator;
2323
import io.opentelemetry.sdk.metrics.internal.aggregator.AggregatorFactory;
2424
import io.opentelemetry.sdk.metrics.internal.aggregator.AggregatorHandle;
25+
import io.opentelemetry.sdk.metrics.internal.aggregator.EmptyMetricData;
2526
import io.opentelemetry.sdk.metrics.internal.descriptor.InstrumentDescriptor;
2627
import io.opentelemetry.sdk.metrics.internal.descriptor.MetricDescriptor;
2728
import io.opentelemetry.sdk.metrics.internal.exemplar.ExemplarFilter;
@@ -53,11 +54,9 @@ public final class AsynchronousMetricStorage<T extends PointData, U extends Exem
5354
private final RegisteredReader registeredReader;
5455
private final MetricDescriptor metricDescriptor;
5556
private final AggregationTemporality aggregationTemporality;
57+
private final Aggregator<T, U> aggregator;
5658
private final AttributesProcessor attributesProcessor;
5759
private final MemoryMode memoryMode;
58-
private final Aggregator<T, U> originalAggregator;
59-
60-
private Aggregator<T, U> aggregator;
6160

6261
/**
6362
* This field is set to 1 less than the actual intended cardinality limit, allowing the last slot
@@ -88,12 +87,15 @@ public final class AsynchronousMetricStorage<T extends PointData, U extends Exem
8887
private long startEpochNanos;
8988
private long epochNanos;
9089

90+
private boolean enabled;
91+
9192
private AsynchronousMetricStorage(
9293
RegisteredReader registeredReader,
9394
MetricDescriptor metricDescriptor,
9495
Aggregator<T, U> aggregator,
9596
AttributesProcessor attributesProcessor,
96-
int maxCardinality) {
97+
int maxCardinality,
98+
boolean enabled) {
9799
this.registeredReader = registeredReader;
98100
this.metricDescriptor = metricDescriptor;
99101
this.aggregationTemporality =
@@ -102,9 +104,9 @@ private AsynchronousMetricStorage(
102104
.getAggregationTemporality(metricDescriptor.getSourceInstrument().getType());
103105
this.memoryMode = registeredReader.getReader().getMemoryMode();
104106
this.aggregator = aggregator;
105-
this.originalAggregator = aggregator;
106107
this.attributesProcessor = attributesProcessor;
107108
this.maxCardinality = maxCardinality - 1;
109+
this.enabled = enabled;
108110
this.reusablePointsPool = new ObjectPool<>(aggregator::createReusablePoint);
109111
this.reusableHandlesPool = new ObjectPool<>(aggregator::createHandle);
110112
this.handleBuilder = ignored -> reusableHandlesPool.borrowObject();
@@ -128,7 +130,8 @@ private AsynchronousMetricStorage(
128130
AsynchronousMetricStorage<T, U> create(
129131
RegisteredReader registeredReader,
130132
RegisteredView registeredView,
131-
InstrumentDescriptor instrumentDescriptor) {
133+
InstrumentDescriptor instrumentDescriptor,
134+
boolean enabled) {
132135
View view = registeredView.getView();
133136
MetricDescriptor metricDescriptor =
134137
MetricDescriptor.create(view, registeredView.getViewSourceInfo(), instrumentDescriptor);
@@ -143,7 +146,8 @@ AsynchronousMetricStorage<T, U> create(
143146
metricDescriptor,
144147
aggregator,
145148
registeredView.getViewAttributesProcessor(),
146-
registeredView.getCardinalityLimit());
149+
registeredView.getCardinalityLimit(),
150+
enabled);
147151
}
148152

149153
/** Record callback measurement from {@link ObservableLongMeasurement}. */
@@ -210,8 +214,10 @@ public MetricData collect(
210214
aggregatorHandles.forEach(handleReleaser);
211215
aggregatorHandles.clear();
212216

213-
return aggregator.toMetricData(
214-
resource, instrumentationScopeInfo, metricDescriptor, result, aggregationTemporality);
217+
return enabled
218+
? aggregator.toMetricData(
219+
resource, instrumentationScopeInfo, metricDescriptor, result, aggregationTemporality)
220+
: EmptyMetricData.getInstance();
215221
}
216222

217223
private Collection<T> collectWithDeltaAggregationTemporality() {
@@ -314,16 +320,7 @@ private Collection<T> collectWithCumulativeAggregationTemporality() {
314320

315321
@Override
316322
public void setEnabled(boolean enabled) {
317-
if (enabled) {
318-
if (aggregator == Aggregator.drop()) {
319-
aggregator = originalAggregator;
320-
}
321-
} else {
322-
aggregator = Aggregator.drop();
323-
324-
aggregatorHandles.clear();
325-
lastPoints.clear();
326-
}
323+
this.enabled = enabled;
327324
}
328325

329326
@Override

0 commit comments

Comments
 (0)