Skip to content

Commit 4a53c58

Browse files
committed
add option to skip scope_info metric
1 parent 8009415 commit 4a53c58

File tree

8 files changed

+54
-28
lines changed

8 files changed

+54
-28
lines changed

exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/Otel2PrometheusConverter.java

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ final class Otel2PrometheusConverter {
8282
private static final long NANOS_PER_MILLISECOND = TimeUnit.MILLISECONDS.toNanos(1);
8383
static final int MAX_CACHE_SIZE = 10;
8484

85-
private final boolean otelScopeEnabled;
85+
private final OtelScopeMode otelScopeMode;
8686
@Nullable private final Predicate<String> allowedResourceAttributesFilter;
8787

8888
/**
@@ -94,14 +94,14 @@ final class Otel2PrometheusConverter {
9494
/**
9595
* Constructor with feature flag parameter.
9696
*
97-
* @param otelScopeEnabled enable generation of the OpenTelemetry instrumentation scope info
97+
* @param otelScopeMode enable generation of the OpenTelemetry instrumentation scope info
9898
* metric and labels.
9999
* @param allowedResourceAttributesFilter if not {@code null}, resource attributes with keys
100100
* matching this predicate will be added as labels on each exported metric
101101
*/
102102
Otel2PrometheusConverter(
103-
boolean otelScopeEnabled, @Nullable Predicate<String> allowedResourceAttributesFilter) {
104-
this.otelScopeEnabled = otelScopeEnabled;
103+
OtelScopeMode otelScopeMode, @Nullable Predicate<String> allowedResourceAttributesFilter) {
104+
this.otelScopeMode = otelScopeMode;
105105
this.allowedResourceAttributesFilter = allowedResourceAttributesFilter;
106106
this.resourceAttributesToAllowedKeysCache =
107107
allowedResourceAttributesFilter != null
@@ -125,14 +125,14 @@ MetricSnapshots convert(@Nullable Collection<MetricData> metricDataCollection) {
125125
if (resource == null) {
126126
resource = metricData.getResource();
127127
}
128-
if (otelScopeEnabled && !metricData.getInstrumentationScopeInfo().getAttributes().isEmpty()) {
128+
if (otelScopeMode.isEnabled() && !metricData.getInstrumentationScopeInfo().getAttributes().isEmpty()) {
129129
scopes.add(metricData.getInstrumentationScopeInfo());
130130
}
131131
}
132132
if (resource != null) {
133133
putOrMerge(snapshotsByName, makeTargetInfo(resource));
134134
}
135-
if (otelScopeEnabled && !scopes.isEmpty()) {
135+
if (otelScopeMode.isScopeInfoEnabled() && !scopes.isEmpty()) {
136136
putOrMerge(snapshotsByName, makeScopeInfo(scopes));
137137
}
138138
return new MetricSnapshots(snapshotsByName.values());
@@ -457,8 +457,8 @@ private InfoSnapshot makeScopeInfo(Set<InstrumentationScopeInfo> scopes) {
457457
* Convert OpenTelemetry attributes to Prometheus labels.
458458
*
459459
* @param resource optional resource (attributes) to be converted.
460-
* @param scope will be converted to {@code otel_scope_*} labels if {@code otelScopeEnabled} is
461-
* {@code true}.
460+
* @param scope will be converted to {@code otel_scope_*} labels if {@code otelScopeMode} is
461+
* {@link OtelScopeMode#isEnabled()}.
462462
* @param attributes the attributes to be converted.
463463
* @param additionalAttributes optional list of key/value pairs, may be empty.
464464
*/
@@ -485,7 +485,7 @@ private Labels convertAttributes(
485485
requireNonNull(additionalAttributes[i]), additionalAttributes[i + 1]);
486486
}
487487

488-
if (otelScopeEnabled && scope != null) {
488+
if (otelScopeMode.isEnabled() && scope != null) {
489489
labelNameToValue.putIfAbsent(OTEL_SCOPE_NAME, scope.getName());
490490
if (scope.getVersion() != null) {
491491
labelNameToValue.putIfAbsent(OTEL_SCOPE_VERSION, scope.getVersion());
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package io.opentelemetry.exporter.prometheus;
2+
3+
public enum OtelScopeMode {
4+
/** No scope information is exported. */
5+
DISABLED,
6+
/**
7+
* Only the labels of the metrics are exported, but not the scope_info info metrics.
8+
*
9+
* <p>This will eventually be the default mode, but is opt-in for now.
10+
*/
11+
LABELS_ONLY,
12+
/**
13+
* Both labels and scope_info are exported.
14+
*
15+
* <p>This is the default mode.
16+
*/
17+
LABELS_AND_SCOPE_INFO;
18+
19+
boolean isEnabled() {
20+
return this != DISABLED;
21+
}
22+
23+
boolean isScopeInfoEnabled() {
24+
return this == LABELS_AND_SCOPE_INFO;
25+
}
26+
}

exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusHttpServer.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ public static PrometheusHttpServerBuilder builder() {
7272
int port,
7373
@Nullable ExecutorService executor,
7474
PrometheusRegistry prometheusRegistry,
75-
boolean otelScopeEnabled,
75+
OtelScopeMode otelScopeMode,
7676
@Nullable Predicate<String> allowedResourceAttributesFilter,
7777
MemoryMode memoryMode,
7878
@Nullable HttpHandler defaultHandler,
@@ -86,7 +86,7 @@ public static PrometheusHttpServerBuilder builder() {
8686
this.defaultAggregationSelector = defaultAggregationSelector;
8787
this.builder = builder;
8888
this.prometheusMetricReader =
89-
new PrometheusMetricReader(otelScopeEnabled, allowedResourceAttributesFilter);
89+
new PrometheusMetricReader(otelScopeMode, allowedResourceAttributesFilter);
9090
this.prometheusRegistry = prometheusRegistry;
9191
prometheusRegistry.register(prometheusMetricReader);
9292
// When memory mode is REUSABLE_DATA, concurrent reads lead to data corruption. To prevent this,

exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusHttpServerBuilder.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ public final class PrometheusHttpServerBuilder {
3030
private String host = DEFAULT_HOST;
3131
private int port = DEFAULT_PORT;
3232
private PrometheusRegistry prometheusRegistry = new PrometheusRegistry();
33-
private boolean otelScopeEnabled = true;
33+
private OtelScopeMode otelScopeMode = OtelScopeMode.LABELS_AND_SCOPE_INFO;
3434
@Nullable private Predicate<String> allowedResourceAttributesFilter;
3535
@Nullable private ExecutorService executor;
3636
private MemoryMode memoryMode = DEFAULT_MEMORY_MODE;
@@ -45,7 +45,7 @@ public final class PrometheusHttpServerBuilder {
4545
this.host = builder.host;
4646
this.port = builder.port;
4747
this.prometheusRegistry = builder.prometheusRegistry;
48-
this.otelScopeEnabled = builder.otelScopeEnabled;
48+
this.otelScopeMode = builder.otelScopeMode;
4949
this.allowedResourceAttributesFilter = builder.allowedResourceAttributesFilter;
5050
this.executor = builder.executor;
5151
this.memoryMode = builder.memoryMode;
@@ -85,8 +85,8 @@ public PrometheusHttpServerBuilder setPrometheusRegistry(PrometheusRegistry prom
8585

8686
/** Set if the {@code otel_scope_*} attributes are generated. Default is {@code true}. */
8787
@SuppressWarnings("UnusedReturnValue")
88-
public PrometheusHttpServerBuilder setOtelScopeEnabled(boolean otelScopeEnabled) {
89-
this.otelScopeEnabled = otelScopeEnabled;
88+
public PrometheusHttpServerBuilder setOtelScopeMode(OtelScopeMode otelScopeMode) {
89+
this.otelScopeMode = otelScopeMode;
9090
return this;
9191
}
9292

@@ -176,7 +176,7 @@ public PrometheusHttpServer build() {
176176
port,
177177
executor,
178178
prometheusRegistry,
179-
otelScopeEnabled,
179+
otelScopeMode,
180180
allowedResourceAttributesFilter,
181181
memoryMode,
182182
defaultHandler,

exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusMetricReader.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,11 @@ public class PrometheusMetricReader implements MetricReader, MultiCollector {
2929
private final Otel2PrometheusConverter converter;
3030

3131
// TODO: refactor to public static create or builder pattern to align with project style
32-
/** See {@link Otel2PrometheusConverter#Otel2PrometheusConverter(boolean, Predicate)}. */
32+
/** See {@link Otel2PrometheusConverter#Otel2PrometheusConverter(OtelScopeMode, Predicate)}. */
3333
public PrometheusMetricReader(
34-
boolean otelScopeEnabled, @Nullable Predicate<String> allowedResourceAttributesFilter) {
34+
OtelScopeMode otelScopeMode, @Nullable Predicate<String> allowedResourceAttributesFilter) {
3535
this.converter =
36-
new Otel2PrometheusConverter(otelScopeEnabled, allowedResourceAttributesFilter);
36+
new Otel2PrometheusConverter(otelScopeMode, allowedResourceAttributesFilter);
3737
}
3838

3939
@Override

exporters/prometheus/src/test/java/io/opentelemetry/exporter/prometheus/Otel2PrometheusConverterTest.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ class Otel2PrometheusConverterTest {
7171
private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
7272

7373
private final Otel2PrometheusConverter converter =
74-
new Otel2PrometheusConverter(true, /* allowedResourceAttributesFilter= */ null);
74+
new Otel2PrometheusConverter(OtelScopeMode.LABELS_AND_SCOPE_INFO, /* allowedResourceAttributesFilter= */ null);
7575

7676
@ParameterizedTest
7777
@MethodSource("metricMetadataArgs")
@@ -201,7 +201,7 @@ void resourceAttributesAddition(
201201
throws IOException {
202202

203203
Otel2PrometheusConverter converter =
204-
new Otel2PrometheusConverter(true, allowedResourceAttributesFilter);
204+
new Otel2PrometheusConverter(OtelScopeMode.LABELS_AND_SCOPE_INFO, allowedResourceAttributesFilter);
205205

206206
ByteArrayOutputStream out = new ByteArrayOutputStream();
207207
MetricSnapshots snapshots = converter.convert(Collections.singletonList(metricData));
@@ -501,7 +501,7 @@ void validateCacheIsBounded() {
501501
};
502502

503503
Otel2PrometheusConverter otel2PrometheusConverter =
504-
new Otel2PrometheusConverter(true, /* allowedResourceAttributesFilter= */ countPredicate);
504+
new Otel2PrometheusConverter(OtelScopeMode.LABELS_AND_SCOPE_INFO, /* allowedResourceAttributesFilter= */ countPredicate);
505505

506506
// Create 20 different metric data objects with 2 different resource attributes;
507507
Resource resource1 = Resource.builder().put("cluster", "cluster1").build();

exporters/prometheus/src/test/java/io/opentelemetry/exporter/prometheus/PrometheusHttpServerTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -528,7 +528,7 @@ void toBuilder() {
528528
PrometheusHttpServerBuilder builder = PrometheusHttpServer.builder();
529529
builder.setHost("localhost");
530530
builder.setPort(1234);
531-
builder.setOtelScopeEnabled(false);
531+
builder.setOtelScopeMode(OtelScopeMode.DISABLED);
532532

533533
Predicate<String> resourceAttributesFilter = s -> false;
534534
builder.setAllowedResourceAttributesFilter(resourceAttributesFilter);
@@ -555,7 +555,7 @@ public Result authenticate(HttpExchange exchange) {
555555
.isInstanceOf(PrometheusHttpServerBuilder.class)
556556
.hasFieldOrPropertyWithValue("host", "localhost")
557557
.hasFieldOrPropertyWithValue("port", 1234)
558-
.hasFieldOrPropertyWithValue("otelScopeEnabled", false)
558+
.hasFieldOrPropertyWithValue("otelScopeMode", OtelScopeMode.DISABLED)
559559
.hasFieldOrPropertyWithValue("allowedResourceAttributesFilter", resourceAttributesFilter)
560560
.hasFieldOrPropertyWithValue("executor", executor)
561561
.hasFieldOrPropertyWithValue("prometheusRegistry", prometheusRegistry)

exporters/prometheus/src/test/java/io/opentelemetry/exporter/prometheus/PrometheusMetricReaderTest.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ class PrometheusMetricReaderTest {
6161
void setUp() {
6262
this.testClock.setTime(Instant.ofEpochMilli((System.currentTimeMillis() / 100) * 100));
6363
this.createdTimestamp = convertTimestamp(testClock.now());
64-
this.reader = new PrometheusMetricReader(true, /* allowedResourceAttributesFilter= */ null);
64+
this.reader = new PrometheusMetricReader(OtelScopeMode.LABELS_AND_SCOPE_INFO, /* allowedResourceAttributesFilter= */ null);
6565
this.meter =
6666
SdkMeterProvider.builder()
6767
.setClock(testClock)
@@ -776,7 +776,7 @@ void exponentialHistogramBucketConversion() {
776776
int otelScale = random.nextInt(24) - 4;
777777
int prometheusScale = Math.min(otelScale, 8);
778778
PrometheusMetricReader reader =
779-
new PrometheusMetricReader(true, /* allowedResourceAttributesFilter= */ null);
779+
new PrometheusMetricReader(OtelScopeMode.LABELS_AND_SCOPE_INFO, /* allowedResourceAttributesFilter= */ null);
780780
Meter meter =
781781
SdkMeterProvider.builder()
782782
.registerMetricReader(reader)
@@ -1029,7 +1029,7 @@ void otelScopeComplete() throws IOException {
10291029
@Test
10301030
void otelScopeDisabled() throws IOException {
10311031
PrometheusMetricReader reader =
1032-
new PrometheusMetricReader(false, /* allowedResourceAttributesFilter= */ null);
1032+
new PrometheusMetricReader(OtelScopeMode.DISABLED, /* allowedResourceAttributesFilter= */ null);
10331033
Meter meter =
10341034
SdkMeterProvider.builder()
10351035
.setClock(testClock)
@@ -1060,7 +1060,7 @@ void otelScopeDisabled() throws IOException {
10601060
void addResourceAttributesWorks() throws IOException {
10611061
PrometheusMetricReader reader =
10621062
new PrometheusMetricReader(
1063-
true, /* allowedResourceAttributesFilter= */ Predicates.is("cluster"));
1063+
OtelScopeMode.LABELS_AND_SCOPE_INFO, /* allowedResourceAttributesFilter= */ Predicates.is("cluster"));
10641064
Meter meter =
10651065
SdkMeterProvider.builder()
10661066
.setClock(testClock)

0 commit comments

Comments
 (0)