1111import static java .util .Arrays .asList ;
1212import static org .junit .jupiter .params .provider .Arguments .arguments ;
1313
14- import com . google . common . util . concurrent . AtomicDouble ;
14+ import io . opentelemetry . api . baggage . Baggage ;
1515import io .opentelemetry .api .common .AttributeKey ;
1616import io .opentelemetry .api .common .Attributes ;
1717import io .opentelemetry .api .incubator .metrics .ExtendedDoubleCounterBuilder ;
2424import io .opentelemetry .api .incubator .metrics .ExtendedLongUpDownCounterBuilder ;
2525import io .opentelemetry .api .metrics .DoubleCounter ;
2626import io .opentelemetry .api .metrics .DoubleCounterBuilder ;
27+ import io .opentelemetry .api .metrics .DoubleGauge ;
2728import io .opentelemetry .api .metrics .DoubleGaugeBuilder ;
2829import io .opentelemetry .api .metrics .DoubleHistogram ;
2930import io .opentelemetry .api .metrics .DoubleHistogramBuilder ;
3031import io .opentelemetry .api .metrics .DoubleUpDownCounter ;
3132import io .opentelemetry .api .metrics .DoubleUpDownCounterBuilder ;
3233import io .opentelemetry .api .metrics .LongCounter ;
3334import io .opentelemetry .api .metrics .LongCounterBuilder ;
35+ import io .opentelemetry .api .metrics .LongGauge ;
3436import io .opentelemetry .api .metrics .LongGaugeBuilder ;
3537import io .opentelemetry .api .metrics .LongHistogram ;
3638import io .opentelemetry .api .metrics .LongHistogramBuilder ;
3739import io .opentelemetry .api .metrics .LongUpDownCounter ;
3840import io .opentelemetry .api .metrics .LongUpDownCounterBuilder ;
41+ import io .opentelemetry .context .Scope ;
42+ import io .opentelemetry .sdk .metrics .internal .SdkMeterProviderUtil ;
3943import io .opentelemetry .sdk .testing .assertj .AbstractPointAssert ;
4044import io .opentelemetry .sdk .testing .assertj .DoublePointAssert ;
4145import io .opentelemetry .sdk .testing .assertj .HistogramPointAssert ;
4246import io .opentelemetry .sdk .testing .assertj .LongPointAssert ;
4347import io .opentelemetry .sdk .testing .assertj .MetricAssert ;
4448import io .opentelemetry .sdk .testing .exporter .InMemoryMetricReader ;
4549import java .util .List ;
46- import java .util .concurrent .atomic .AtomicLong ;
47- import java .util .concurrent .atomic .AtomicReference ;
4850import java .util .function .Consumer ;
4951import java .util .stream .Stream ;
5052import 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