Skip to content

Commit 526137f

Browse files
authored
Add more attribute advice tests to show interaction with views (#7143)
1 parent 7b732c8 commit 526137f

File tree

1 file changed

+86
-23
lines changed

1 file changed

+86
-23
lines changed

sdk/metrics/src/testIncubating/java/io/opentelemetry/sdk/metrics/AttributesAdviceTest.java

Lines changed: 86 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
import static java.util.Arrays.asList;
1212
import static org.junit.jupiter.params.provider.Arguments.arguments;
1313

14-
import com.google.common.util.concurrent.AtomicDouble;
14+
import io.opentelemetry.api.baggage.Baggage;
1515
import io.opentelemetry.api.common.AttributeKey;
1616
import io.opentelemetry.api.common.Attributes;
1717
import io.opentelemetry.api.incubator.metrics.ExtendedDoubleCounterBuilder;
@@ -24,27 +24,29 @@
2424
import io.opentelemetry.api.incubator.metrics.ExtendedLongUpDownCounterBuilder;
2525
import io.opentelemetry.api.metrics.DoubleCounter;
2626
import io.opentelemetry.api.metrics.DoubleCounterBuilder;
27+
import io.opentelemetry.api.metrics.DoubleGauge;
2728
import io.opentelemetry.api.metrics.DoubleGaugeBuilder;
2829
import io.opentelemetry.api.metrics.DoubleHistogram;
2930
import io.opentelemetry.api.metrics.DoubleHistogramBuilder;
3031
import io.opentelemetry.api.metrics.DoubleUpDownCounter;
3132
import io.opentelemetry.api.metrics.DoubleUpDownCounterBuilder;
3233
import io.opentelemetry.api.metrics.LongCounter;
3334
import io.opentelemetry.api.metrics.LongCounterBuilder;
35+
import io.opentelemetry.api.metrics.LongGauge;
3436
import io.opentelemetry.api.metrics.LongGaugeBuilder;
3537
import io.opentelemetry.api.metrics.LongHistogram;
3638
import io.opentelemetry.api.metrics.LongHistogramBuilder;
3739
import io.opentelemetry.api.metrics.LongUpDownCounter;
3840
import io.opentelemetry.api.metrics.LongUpDownCounterBuilder;
41+
import io.opentelemetry.context.Scope;
42+
import io.opentelemetry.sdk.metrics.internal.SdkMeterProviderUtil;
3943
import io.opentelemetry.sdk.testing.assertj.AbstractPointAssert;
4044
import io.opentelemetry.sdk.testing.assertj.DoublePointAssert;
4145
import io.opentelemetry.sdk.testing.assertj.HistogramPointAssert;
4246
import io.opentelemetry.sdk.testing.assertj.LongPointAssert;
4347
import io.opentelemetry.sdk.testing.assertj.MetricAssert;
4448
import io.opentelemetry.sdk.testing.exporter.InMemoryMetricReader;
4549
import java.util.List;
46-
import java.util.concurrent.atomic.AtomicLong;
47-
import java.util.concurrent.atomic.AtomicReference;
4850
import java.util.function.Consumer;
4951
import java.util.stream.Stream;
5052
import javax.annotation.Nullable;
@@ -140,6 +142,81 @@ void instrumentWithAdviceAndViews(
140142
equalTo(stringKey("key2"), "2"), equalTo(stringKey("key3"), "3"))));
141143
}
142144

145+
@ParameterizedTest
146+
@ArgumentsSource(InstrumentsProvider.class)
147+
void instrumentWithAdviceAndDescriptionViews(
148+
InstrumentFactory instrumentFactory, PointsAssert<AbstractPointAssert<?, ?>> pointsAssert) {
149+
InMemoryMetricReader reader = InMemoryMetricReader.create();
150+
// Register a view which sets a description. Since any matching view supersedes any instrument
151+
// advice, the attribute advice is ignored and all attributes are recorded.
152+
meterProvider =
153+
SdkMeterProvider.builder()
154+
.registerMetricReader(reader)
155+
.registerView(
156+
InstrumentSelector.builder().setName("test").build(),
157+
View.builder().setDescription("description").build())
158+
.build();
159+
160+
Instrument instrument =
161+
instrumentFactory.create(
162+
meterProvider, "test", asList(stringKey("key1"), stringKey("key2")));
163+
instrument.record(1, ATTRIBUTES);
164+
165+
assertThat(reader.collectAllMetrics())
166+
.satisfiesExactly(
167+
metric ->
168+
pointsAssert.hasPointSatisfying(
169+
assertThat(metric),
170+
point ->
171+
point.hasAttributesSatisfyingExactly(
172+
equalTo(stringKey("key1"), "1"),
173+
equalTo(stringKey("key2"), "2"),
174+
equalTo(stringKey("key3"), "3"))));
175+
}
176+
177+
@ParameterizedTest
178+
@ArgumentsSource(InstrumentsProvider.class)
179+
void instrumentWithAdviceAndBaggage(
180+
InstrumentFactory instrumentFactory, PointsAssert<AbstractPointAssert<?, ?>> pointsAssert) {
181+
InMemoryMetricReader reader = InMemoryMetricReader.create();
182+
SdkMeterProviderBuilder builder = SdkMeterProvider.builder();
183+
// Register a view which appends a baggage entry. Since any matching view supersedes any
184+
// instrument advice, the attribute advice is ignored and all attributes + the baggage entry are
185+
// recorded.
186+
ViewBuilder viewBuilder = View.builder();
187+
SdkMeterProviderUtil.appendFilteredBaggageAttributes(
188+
viewBuilder, name -> name.equals("baggage1"));
189+
meterProvider =
190+
builder
191+
.registerMetricReader(reader)
192+
.registerView(InstrumentSelector.builder().setName("*").build(), viewBuilder.build())
193+
.build();
194+
195+
Instrument instrument =
196+
instrumentFactory.create(
197+
meterProvider, "test", asList(stringKey("key1"), stringKey("key2")));
198+
try (Scope unused =
199+
Baggage.current().toBuilder()
200+
.put("baggage1", "value1")
201+
.put("baggage2", "value2")
202+
.build()
203+
.makeCurrent()) {
204+
instrument.record(1, ATTRIBUTES);
205+
}
206+
207+
assertThat(reader.collectAllMetrics())
208+
.satisfiesExactly(
209+
metric ->
210+
pointsAssert.hasPointSatisfying(
211+
assertThat(metric),
212+
point ->
213+
point.hasAttributesSatisfyingExactly(
214+
equalTo(stringKey("key1"), "1"),
215+
equalTo(stringKey("key2"), "2"),
216+
equalTo(stringKey("key3"), "3"),
217+
equalTo(stringKey("baggage1"), "value1"))));
218+
}
219+
143220
static final class InstrumentsProvider implements ArgumentsProvider {
144221

145222
@Override
@@ -189,15 +266,8 @@ public Stream<? extends Arguments> provideArguments(ExtensionContext context) {
189266
((ExtendedDoubleGaugeBuilder) doubleGaugeBuilder)
190267
.setAttributesAdvice(attributesAdvice);
191268
}
192-
AtomicDouble valueRef = new AtomicDouble();
193-
AtomicReference<Attributes> attributesRef = new AtomicReference<>();
194-
doubleGaugeBuilder.buildWithCallback(
195-
measurement ->
196-
measurement.record(valueRef.doubleValue(), attributesRef.get()));
197-
return (value, attributes) -> {
198-
valueRef.set((double) value);
199-
attributesRef.set(attributes);
200-
};
269+
DoubleGauge gauge = doubleGaugeBuilder.build();
270+
return gauge::set;
201271
},
202272
(PointsAssert<DoublePointAssert>)
203273
(metricAssert, assertions) ->
@@ -207,21 +277,14 @@ public Stream<? extends Arguments> provideArguments(ExtensionContext context) {
207277
arguments(
208278
(InstrumentFactory)
209279
(meterProvider, name, attributesAdvice) -> {
210-
LongGaugeBuilder doubleGaugeBuilder =
280+
LongGaugeBuilder longGaugeBuilder =
211281
meterProvider.get("meter").gaugeBuilder(name).ofLongs();
212282
if (attributesAdvice != null) {
213-
((ExtendedLongGaugeBuilder) doubleGaugeBuilder)
283+
((ExtendedLongGaugeBuilder) longGaugeBuilder)
214284
.setAttributesAdvice(attributesAdvice);
215285
}
216-
AtomicLong valueRef = new AtomicLong();
217-
AtomicReference<Attributes> attributesRef = new AtomicReference<>();
218-
doubleGaugeBuilder.buildWithCallback(
219-
measurement ->
220-
measurement.record(valueRef.longValue(), attributesRef.get()));
221-
return (value, attributes) -> {
222-
valueRef.set(value);
223-
attributesRef.set(attributes);
224-
};
286+
LongGauge gauge = longGaugeBuilder.build();
287+
return gauge::set;
225288
},
226289
(PointsAssert<LongPointAssert>)
227290
(metricAssert, assertions) ->

0 commit comments

Comments
 (0)