Skip to content

Commit d385f07

Browse files
committed
Prototype support for cardinality limits
1 parent c972bb6 commit d385f07

File tree

7 files changed

+133
-14
lines changed

7 files changed

+133
-14
lines changed

sdk-extensions/incubator/build.gradle.kts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,8 @@ dependencies {
6060
// it was needed after 0.3.0 release because file_format in the examples weren't updated prior to the release tag
6161
// val configurationTag = "0.3.0"
6262
// val configurationRef = "refs/tags/v$configurationTag" // Replace with commit SHA to point to experiment with a specific commit
63-
val configurationRef = "bd511a6a16b321a7bb3135fa783dda1fbd40706f"
64-
val configurationRepoZip = "https://github.com/open-telemetry/opentelemetry-configuration/archive/$configurationRef.zip"
63+
val configurationRef = "f4c0dc7ce058ded98ef2039e07dbfe9bd2320e82"
64+
val configurationRepoZip = "https://github.com/jack-berg/opentelemetry-configuration/archive/$configurationRef.zip"
6565
val buildDirectory = layout.buildDirectory.asFile.get()
6666

6767
val downloadConfigurationSchema by tasks.registering(Download::class) {
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.sdk.extension.incubator.fileconfig;
7+
8+
import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper;
9+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.CardinalityLimitsModel;
10+
import io.opentelemetry.sdk.metrics.export.CardinalityLimitSelector;
11+
import io.opentelemetry.sdk.metrics.internal.state.MetricStorage;
12+
import java.io.Closeable;
13+
import java.util.List;
14+
import javax.annotation.Nullable;
15+
16+
final class CardinalityLimitsFactory
17+
implements Factory<CardinalityLimitsModel, CardinalityLimitSelector> {
18+
19+
private static final CardinalityLimitsFactory INSTANCE = new CardinalityLimitsFactory();
20+
21+
private CardinalityLimitsFactory() {}
22+
23+
static CardinalityLimitsFactory getInstance() {
24+
return INSTANCE;
25+
}
26+
27+
@Override
28+
public CardinalityLimitSelector create(
29+
CardinalityLimitsModel model, SpiHelper spiHelper, List<Closeable> closeables) {
30+
int defaultLimit = getOrDefault(model.getDefault(), MetricStorage.DEFAULT_MAX_CARDINALITY);
31+
int counterLimit = getOrDefault(model.getCounter(), defaultLimit);
32+
int gaugeLimit = getOrDefault(model.getGauge(), defaultLimit);
33+
int histogramLimit = getOrDefault(model.getHistogram(), defaultLimit);
34+
int observableCounterLimit = getOrDefault(model.getObservableCounter(), defaultLimit);
35+
int observableGaugeLimit = getOrDefault(model.getObservableGauge(), defaultLimit);
36+
int observableUpDownCounterLimit =
37+
getOrDefault(model.getObservableUpDownCounter(), defaultLimit);
38+
int upDownCounterLimit = getOrDefault(model.getUpDownCounter(), defaultLimit);
39+
40+
return instrumentType -> {
41+
switch (instrumentType) {
42+
case COUNTER:
43+
return counterLimit;
44+
case UP_DOWN_COUNTER:
45+
return upDownCounterLimit;
46+
case HISTOGRAM:
47+
return histogramLimit;
48+
case OBSERVABLE_COUNTER:
49+
return observableCounterLimit;
50+
case OBSERVABLE_UP_DOWN_COUNTER:
51+
return observableUpDownCounterLimit;
52+
case OBSERVABLE_GAUGE:
53+
return observableGaugeLimit;
54+
case GAUGE:
55+
return gaugeLimit;
56+
}
57+
return defaultLimit;
58+
};
59+
}
60+
61+
private static int getOrDefault(@Nullable Integer value, int defaultValue) {
62+
return value == null ? defaultValue : value;
63+
}
64+
}

sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/MeterProviderFactory.java

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ViewStreamModel;
1616
import io.opentelemetry.sdk.metrics.SdkMeterProvider;
1717
import io.opentelemetry.sdk.metrics.SdkMeterProviderBuilder;
18-
import io.opentelemetry.sdk.metrics.export.MetricReader;
18+
import io.opentelemetry.sdk.metrics.export.CardinalityLimitSelector;
1919
import java.io.Closeable;
2020
import java.util.List;
2121

@@ -38,10 +38,15 @@ public SdkMeterProviderBuilder create(
3838
if (readerModels != null) {
3939
readerModels.forEach(
4040
readerModel -> {
41-
MetricReader metricReader =
41+
MetricReaderAndCardinalityLimits readerAndCardinalityLimits =
4242
MetricReaderFactory.getInstance().create(readerModel, spiHelper, closeables);
43-
if (metricReader != null) {
44-
builder.registerMetricReader(metricReader);
43+
CardinalityLimitSelector cardinalityLimits =
44+
readerAndCardinalityLimits.getCardinalityLimitsSelector();
45+
if (cardinalityLimits == null) {
46+
builder.registerMetricReader(readerAndCardinalityLimits.getMetricReader());
47+
} else {
48+
builder.registerMetricReader(
49+
readerAndCardinalityLimits.getMetricReader(), cardinalityLimits);
4550
}
4651
});
4752
}
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.extension.incubator.fileconfig;
7+
8+
import com.google.auto.value.AutoValue;
9+
import io.opentelemetry.sdk.metrics.export.CardinalityLimitSelector;
10+
import io.opentelemetry.sdk.metrics.export.MetricReader;
11+
import javax.annotation.Nullable;
12+
13+
@AutoValue
14+
abstract class MetricReaderAndCardinalityLimits {
15+
16+
static MetricReaderAndCardinalityLimits create(
17+
MetricReader metricReader, @Nullable CardinalityLimitSelector cardinalityLimitSelector) {
18+
return new AutoValue_MetricReaderAndCardinalityLimits(metricReader, cardinalityLimitSelector);
19+
}
20+
21+
abstract MetricReader getMetricReader();
22+
23+
@Nullable
24+
abstract CardinalityLimitSelector getCardinalityLimitsSelector();
25+
}

sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/MetricReaderFactory.java

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.PullMetricExporterModel;
1616
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.PullMetricReaderModel;
1717
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.PushMetricExporterModel;
18+
import io.opentelemetry.sdk.metrics.export.CardinalityLimitSelector;
1819
import io.opentelemetry.sdk.metrics.export.MetricExporter;
1920
import io.opentelemetry.sdk.metrics.export.MetricReader;
2021
import io.opentelemetry.sdk.metrics.export.PeriodicMetricReader;
@@ -23,7 +24,8 @@
2324
import java.time.Duration;
2425
import java.util.List;
2526

26-
final class MetricReaderFactory implements Factory<MetricReaderModel, MetricReader> {
27+
final class MetricReaderFactory
28+
implements Factory<MetricReaderModel, MetricReaderAndCardinalityLimits> {
2729

2830
private static final MetricReaderFactory INSTANCE = new MetricReaderFactory();
2931

@@ -34,7 +36,7 @@ static MetricReaderFactory getInstance() {
3436
}
3537

3638
@Override
37-
public MetricReader create(
39+
public MetricReaderAndCardinalityLimits create(
3840
MetricReaderModel model, SpiHelper spiHelper, List<Closeable> closeables) {
3941
PeriodicMetricReaderModel periodicModel = model.getPeriodic();
4042
if (periodicModel != null) {
@@ -47,7 +49,15 @@ public MetricReader create(
4749
if (periodicModel.getInterval() != null) {
4850
builder.setInterval(Duration.ofMillis(periodicModel.getInterval()));
4951
}
50-
return FileConfigUtil.addAndReturn(closeables, builder.build());
52+
CardinalityLimitSelector cardinalityLimitSelector = null;
53+
if (periodicModel.getCardinalityLimits() != null) {
54+
cardinalityLimitSelector =
55+
CardinalityLimitsFactory.getInstance()
56+
.create(periodicModel.getCardinalityLimits(), spiHelper, closeables);
57+
}
58+
MetricReaderAndCardinalityLimits readerAndCardinalityLimits =
59+
MetricReaderAndCardinalityLimits.create(builder.build(), cardinalityLimitSelector);
60+
return FileConfigUtil.addAndReturn(closeables, readerAndCardinalityLimits);
5161
}
5262

5363
PullMetricReaderModel pullModel = model.getPull();
@@ -59,7 +69,15 @@ public MetricReader create(
5969
MetricReader metricReader =
6070
FileConfigUtil.loadComponent(
6171
spiHelper, MetricReader.class, "prometheus", prometheusModel);
62-
return FileConfigUtil.addAndReturn(closeables, metricReader);
72+
CardinalityLimitSelector cardinalityLimitSelector = null;
73+
if (pullModel.getCardinalityLimits() != null) {
74+
cardinalityLimitSelector =
75+
CardinalityLimitsFactory.getInstance()
76+
.create(pullModel.getCardinalityLimits(), spiHelper, closeables);
77+
}
78+
MetricReaderAndCardinalityLimits readerAndCardinalityLimits =
79+
MetricReaderAndCardinalityLimits.create(metricReader, cardinalityLimitSelector);
80+
return FileConfigUtil.addAndReturn(closeables, readerAndCardinalityLimits);
6381
}
6482

6583
throw new ConfigurationException("prometheus is the only currently supported pull reader");

sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/ViewFactory.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,9 @@ public View create(ViewStreamModel model, SpiHelper spiHelper, List<Closeable> c
4343
builder.setAggregation(
4444
AggregationFactory.getInstance().create(model.getAggregation(), spiHelper, closeables));
4545
}
46+
if (model.getAggregationCardinalityLimit() != null) {
47+
builder.setCardinalityLimit(model.getAggregationCardinalityLimit());
48+
}
4649
return builder.build();
4750
}
4851

sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/MetricReaderFactoryTest.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,8 @@ void create_PeriodicDefaults() {
7676
new PushMetricExporterModel()
7777
.withOtlpHttp(new OtlpHttpMetricExporterModel()))),
7878
spiHelper,
79-
closeables);
79+
closeables)
80+
.getMetricReader();
8081
cleanup.addCloseable(reader);
8182
cleanup.addCloseables(closeables);
8283

@@ -104,7 +105,8 @@ void create_PeriodicConfigured() {
104105
.withOtlpHttp(new OtlpHttpMetricExporterModel()))
105106
.withInterval(1)),
106107
spiHelper,
107-
closeables);
108+
closeables)
109+
.getMetricReader();
108110
cleanup.addCloseable(reader);
109111
cleanup.addCloseables(closeables);
110112

@@ -131,7 +133,8 @@ void create_PullPrometheusDefault() throws IOException {
131133
.withPrometheus(
132134
new PrometheusMetricExporterModel().withPort(port)))),
133135
spiHelper,
134-
closeables);
136+
closeables)
137+
.getMetricReader();
135138
cleanup.addCloseable(reader);
136139
cleanup.addCloseables(closeables);
137140

@@ -164,7 +167,8 @@ void create_PullPrometheusConfigured() throws IOException {
164167
.withHost("localhost")
165168
.withPort(port)))),
166169
spiHelper,
167-
closeables);
170+
closeables)
171+
.getMetricReader();
168172
cleanup.addCloseable(reader);
169173
cleanup.addCloseables(closeables);
170174

0 commit comments

Comments
 (0)