Skip to content

Commit c7861e8

Browse files
authored
introducing view (open-telemetry#2956)
* introducing view * code review
1 parent 02ca7c2 commit c7861e8

7 files changed

Lines changed: 97 additions & 38 deletions

File tree

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ static <T> Aggregator<T> getAggregator(
2525
return meterProviderSharedState
2626
.getViewRegistry()
2727
.findView(descriptor)
28+
.getAggregatorFactory()
2829
.create(
2930
meterProviderSharedState.getResource(),
3031
meterSharedState.getInstrumentationLibraryInfo(),

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

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,10 @@
99
import io.opentelemetry.api.metrics.MeterProvider;
1010
import io.opentelemetry.sdk.common.Clock;
1111
import io.opentelemetry.sdk.internal.ComponentRegistry;
12-
import io.opentelemetry.sdk.metrics.aggregator.AggregatorFactory;
1312
import io.opentelemetry.sdk.metrics.data.MetricData;
1413
import io.opentelemetry.sdk.metrics.export.MetricProducer;
1514
import io.opentelemetry.sdk.metrics.view.InstrumentSelector;
15+
import io.opentelemetry.sdk.metrics.view.View;
1616
import io.opentelemetry.sdk.resources.Resource;
1717
import java.util.ArrayList;
1818
import java.util.Collection;
@@ -95,13 +95,14 @@ public static SdkMeterProviderBuilder builder() {
9595
* .buildInstrument();
9696
*
9797
* // create a specification of how you want the metrics aggregated:
98-
* AggregationFactory aggregationFactory = AggregationFactory.minMaxSumCount();
98+
* AggregatorFactory aggregatorFactory = AggregatorFactory.minMaxSumCount();
9999
*
100100
* //register the view with the MeterSdkProvider
101-
* meterProvider.registerView(instrumentSelector, aggregationFactory);
101+
* meterProvider.registerView(instrumentSelector, View.builder()
102+
* .setAggregatorFactory(aggregatorFactory).build());
102103
* }</pre>
103104
*/
104-
public void registerView(InstrumentSelector selector, AggregatorFactory aggregatorFactory) {
105-
sharedState.getViewRegistry().registerView(selector, aggregatorFactory);
105+
public void registerView(InstrumentSelector selector, View view) {
106+
sharedState.getViewRegistry().registerView(selector, view);
106107
}
107108
}

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

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import io.opentelemetry.sdk.metrics.common.InstrumentDescriptor;
1010
import io.opentelemetry.sdk.metrics.common.InstrumentType;
1111
import io.opentelemetry.sdk.metrics.view.InstrumentSelector;
12+
import io.opentelemetry.sdk.metrics.view.View;
1213
import java.util.EnumMap;
1314
import java.util.LinkedHashMap;
1415
import java.util.Map;
@@ -23,15 +24,17 @@
2324
* never blocked.
2425
*/
2526
final class ViewRegistry {
26-
private static final LinkedHashMap<Pattern, AggregatorFactory> EMPTY_CONFIG =
27-
new LinkedHashMap<>();
28-
static final AggregatorFactory CUMULATIVE_SUM = AggregatorFactory.sum(true);
29-
static final AggregatorFactory SUMMARY = AggregatorFactory.minMaxSumCount();
30-
static final AggregatorFactory LAST_VALUE = AggregatorFactory.lastValue();
27+
private static final LinkedHashMap<Pattern, View> EMPTY_CONFIG = new LinkedHashMap<>();
28+
static final View CUMULATIVE_SUM =
29+
View.builder().setAggregatorFactory(AggregatorFactory.sum(true)).build();
30+
static final View SUMMARY =
31+
View.builder().setAggregatorFactory(AggregatorFactory.minMaxSumCount()).build();
32+
static final View LAST_VALUE =
33+
View.builder().setAggregatorFactory(AggregatorFactory.lastValue()).build();
3134

3235
// The lock is used to ensure only one updated to the configuration happens at any moment.
3336
private final ReentrantLock lock = new ReentrantLock();
34-
private volatile EnumMap<InstrumentType, LinkedHashMap<Pattern, AggregatorFactory>> configuration;
37+
private volatile EnumMap<InstrumentType, LinkedHashMap<Pattern, View>> configuration;
3538

3639
ViewRegistry() {
3740
this.configuration = new EnumMap<>(InstrumentType.class);
@@ -43,27 +46,26 @@ final class ViewRegistry {
4346
configuration.put(InstrumentType.VALUE_OBSERVER, EMPTY_CONFIG);
4447
}
4548

46-
void registerView(InstrumentSelector selector, AggregatorFactory aggregatorFactory) {
49+
void registerView(InstrumentSelector selector, View view) {
4750
lock.lock();
4851
try {
49-
EnumMap<InstrumentType, LinkedHashMap<Pattern, AggregatorFactory>> newConfiguration =
52+
EnumMap<InstrumentType, LinkedHashMap<Pattern, View>> newConfiguration =
5053
new EnumMap<>(configuration);
5154
newConfiguration.put(
5255
selector.getInstrumentType(),
5356
newLinkedHashMap(
5457
selector.getInstrumentNamePattern(),
55-
aggregatorFactory,
58+
view,
5659
newConfiguration.get(selector.getInstrumentType())));
5760
configuration = newConfiguration;
5861
} finally {
5962
lock.unlock();
6063
}
6164
}
6265

63-
AggregatorFactory findView(InstrumentDescriptor descriptor) {
64-
LinkedHashMap<Pattern, AggregatorFactory> configPerType =
65-
configuration.get(descriptor.getType());
66-
for (Map.Entry<Pattern, AggregatorFactory> entry : configPerType.entrySet()) {
66+
View findView(InstrumentDescriptor descriptor) {
67+
LinkedHashMap<Pattern, View> configPerType = configuration.get(descriptor.getType());
68+
for (Map.Entry<Pattern, View> entry : configPerType.entrySet()) {
6769
if (entry.getKey().matcher(descriptor.getName()).matches()) {
6870
return entry.getValue();
6971
}
@@ -72,7 +74,7 @@ AggregatorFactory findView(InstrumentDescriptor descriptor) {
7274
return getDefaultSpecification(descriptor);
7375
}
7476

75-
private static AggregatorFactory getDefaultSpecification(InstrumentDescriptor descriptor) {
77+
private static View getDefaultSpecification(InstrumentDescriptor descriptor) {
7678
switch (descriptor.getType()) {
7779
case COUNTER:
7880
case UP_DOWN_COUNTER:
@@ -87,12 +89,10 @@ private static AggregatorFactory getDefaultSpecification(InstrumentDescriptor de
8789
throw new IllegalArgumentException("Unknown descriptor type: " + descriptor.getType());
8890
}
8991

90-
private static LinkedHashMap<Pattern, AggregatorFactory> newLinkedHashMap(
91-
Pattern pattern,
92-
AggregatorFactory aggregatorFactory,
93-
LinkedHashMap<Pattern, AggregatorFactory> parentConfiguration) {
94-
LinkedHashMap<Pattern, AggregatorFactory> result = new LinkedHashMap<>();
95-
result.put(pattern, aggregatorFactory);
92+
private static LinkedHashMap<Pattern, View> newLinkedHashMap(
93+
Pattern pattern, View view, LinkedHashMap<Pattern, View> parentConfiguration) {
94+
LinkedHashMap<Pattern, View> result = new LinkedHashMap<>();
95+
result.put(pattern, view);
9696
result.putAll(parentConfiguration);
9797
return result;
9898
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.sdk.metrics.view;
7+
8+
import com.google.auto.value.AutoValue;
9+
import io.opentelemetry.sdk.metrics.aggregator.AggregatorFactory;
10+
import javax.annotation.concurrent.Immutable;
11+
12+
/** TODO: javadoc. */
13+
@AutoValue
14+
@Immutable
15+
public abstract class View {
16+
public abstract AggregatorFactory getAggregatorFactory();
17+
18+
public static ViewBuilder builder() {
19+
return new ViewBuilder();
20+
}
21+
22+
static View create(AggregatorFactory aggregatorFactory) {
23+
return new AutoValue_View(aggregatorFactory);
24+
}
25+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.sdk.metrics.view;
7+
8+
import io.opentelemetry.sdk.metrics.aggregator.AggregatorFactory;
9+
import java.util.Objects;
10+
11+
public final class ViewBuilder {
12+
private AggregatorFactory aggregatorFactory;
13+
14+
ViewBuilder() {}
15+
16+
public ViewBuilder setAggregatorFactory(AggregatorFactory aggregatorFactory) {
17+
this.aggregatorFactory = Objects.requireNonNull(aggregatorFactory, "aggregatorFactory");
18+
return this;
19+
}
20+
21+
public View build() {
22+
return View.create(this.aggregatorFactory);
23+
}
24+
}

sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/SdkMeterProviderTest.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import io.opentelemetry.sdk.metrics.data.MetricData;
3333
import io.opentelemetry.sdk.metrics.data.ValueAtPercentile;
3434
import io.opentelemetry.sdk.metrics.view.InstrumentSelector;
35+
import io.opentelemetry.sdk.metrics.view.View;
3536
import io.opentelemetry.sdk.resources.Resource;
3637
import java.util.Arrays;
3738
import java.util.Collections;
@@ -161,7 +162,7 @@ void collectAllSyncInstruments() {
161162
void collectAllSyncInstruments_OverwriteTemporality() {
162163
sdkMeterProvider.registerView(
163164
InstrumentSelector.builder().setInstrumentType(InstrumentType.COUNTER).build(),
164-
AggregatorFactory.sum(false));
165+
View.builder().setAggregatorFactory(AggregatorFactory.sum(false)).build());
165166

166167
LongCounter longCounter = sdkMeter.longCounterBuilder("testLongCounter").build();
167168
longCounter.add(10, Labels.empty());
@@ -671,7 +672,8 @@ private static void registerViewForAllTypes(
671672
SdkMeterProvider meterProvider, AggregatorFactory factory) {
672673
for (InstrumentType instrumentType : InstrumentType.values()) {
673674
meterProvider.registerView(
674-
InstrumentSelector.builder().setInstrumentType(instrumentType).build(), factory);
675+
InstrumentSelector.builder().setInstrumentType(instrumentType).build(),
676+
View.builder().setAggregatorFactory(factory).build());
675677
}
676678
}
677679
}

sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/ViewRegistryTest.java

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,25 +12,27 @@
1212
import io.opentelemetry.sdk.metrics.common.InstrumentType;
1313
import io.opentelemetry.sdk.metrics.common.InstrumentValueType;
1414
import io.opentelemetry.sdk.metrics.view.InstrumentSelector;
15+
import io.opentelemetry.sdk.metrics.view.View;
1516
import org.junit.jupiter.api.Test;
1617

1718
class ViewRegistryTest {
1819
@Test
1920
void selection_onType() {
2021
AggregatorFactory factory = AggregatorFactory.lastValue();
22+
View view = View.builder().setAggregatorFactory(factory).build();
2123

2224
ViewRegistry viewRegistry = new ViewRegistry();
2325
viewRegistry.registerView(
2426
InstrumentSelector.builder()
2527
.setInstrumentType(InstrumentType.COUNTER)
2628
.setInstrumentNameRegex(".*")
2729
.build(),
28-
factory);
30+
view);
2931
assertThat(
3032
viewRegistry.findView(
3133
InstrumentDescriptor.create(
3234
"", "", "", InstrumentType.COUNTER, InstrumentValueType.LONG)))
33-
.isEqualTo(factory);
35+
.isEqualTo(view);
3436
// this one hasn't been configured, so it gets the default still.
3537
assertThat(
3638
viewRegistry.findView(
@@ -42,19 +44,20 @@ void selection_onType() {
4244
@Test
4345
void selection_onName() {
4446
AggregatorFactory factory = AggregatorFactory.lastValue();
47+
View view = View.builder().setAggregatorFactory(factory).build();
4548

4649
ViewRegistry viewRegistry = new ViewRegistry();
4750
viewRegistry.registerView(
4851
InstrumentSelector.builder()
4952
.setInstrumentType(InstrumentType.COUNTER)
5053
.setInstrumentNameRegex("overridden")
5154
.build(),
52-
factory);
55+
view);
5356
assertThat(
5457
viewRegistry.findView(
5558
InstrumentDescriptor.create(
5659
"overridden", "", "", InstrumentType.COUNTER, InstrumentValueType.LONG)))
57-
.isSameAs(factory);
60+
.isSameAs(view);
5861
// this one hasn't been configured, so it gets the default still.
5962
assertThat(
6063
viewRegistry.findView(
@@ -66,56 +69,59 @@ void selection_onName() {
6669
@Test
6770
void selection_LastAddedViewWins() {
6871
AggregatorFactory factory1 = AggregatorFactory.lastValue();
72+
View view1 = View.builder().setAggregatorFactory(factory1).build();
6973
AggregatorFactory factory2 = AggregatorFactory.minMaxSumCount();
74+
View view2 = View.builder().setAggregatorFactory(factory2).build();
7075

7176
ViewRegistry viewRegistry = new ViewRegistry();
7277
viewRegistry.registerView(
7378
InstrumentSelector.builder()
7479
.setInstrumentType(InstrumentType.COUNTER)
7580
.setInstrumentNameRegex(".*")
7681
.build(),
77-
factory1);
82+
view1);
7883
viewRegistry.registerView(
7984
InstrumentSelector.builder()
8085
.setInstrumentType(InstrumentType.COUNTER)
8186
.setInstrumentNameRegex("overridden")
8287
.build(),
83-
factory2);
88+
view2);
8489

8590
assertThat(
8691
viewRegistry.findView(
8792
InstrumentDescriptor.create(
8893
"overridden", "", "", InstrumentType.COUNTER, InstrumentValueType.LONG)))
89-
.isEqualTo(factory2);
94+
.isEqualTo(view2);
9095
assertThat(
9196
viewRegistry.findView(
9297
InstrumentDescriptor.create(
9398
"default", "", "", InstrumentType.COUNTER, InstrumentValueType.LONG)))
94-
.isEqualTo(factory1);
99+
.isEqualTo(view1);
95100
}
96101

97102
@Test
98103
void selection_regex() {
99104
AggregatorFactory factory = AggregatorFactory.lastValue();
105+
View view = View.builder().setAggregatorFactory(factory).build();
100106

101107
ViewRegistry viewRegistry = new ViewRegistry();
102108
viewRegistry.registerView(
103109
InstrumentSelector.builder()
104110
.setInstrumentNameRegex("overrid(es|den)")
105111
.setInstrumentType(InstrumentType.COUNTER)
106112
.build(),
107-
factory);
113+
view);
108114

109115
assertThat(
110116
viewRegistry.findView(
111117
InstrumentDescriptor.create(
112118
"overridden", "", "", InstrumentType.COUNTER, InstrumentValueType.LONG)))
113-
.isEqualTo(factory);
119+
.isEqualTo(view);
114120
assertThat(
115121
viewRegistry.findView(
116122
InstrumentDescriptor.create(
117123
"overrides", "", "", InstrumentType.COUNTER, InstrumentValueType.LONG)))
118-
.isEqualTo(factory);
124+
.isEqualTo(view);
119125
// this one hasn't been configured, so it gets the default still..
120126
assertThat(
121127
viewRegistry.findView(

0 commit comments

Comments
 (0)