@@ -249,43 +249,53 @@ public Task PrometheusExporterMiddlewareIntegration_UseOpenMetricsVersionHeader(
249249 }
250250
251251 [ Fact ]
252- public async Task PrometheusExporterMiddlewareIntegration_CanServeOpenMetricsAndPlainFormats ( )
252+ public Task PrometheusExporterMiddlewareIntegration_TextPlainResponse_WithMeterTags ( )
253253 {
254- using var host = await StartTestHostAsync (
255- app => app . UseOpenTelemetryPrometheusScrapingEndpoint ( ) ) ;
256-
257- var tags = new KeyValuePair < string , object ? > [ ]
254+ var meterTags = new KeyValuePair < string , object ? > [ ]
258255 {
259- new ( "key1 " , "value1" ) ,
260- new ( "key2 " , "value2" ) ,
256+ new ( "meterKey1 " , "value1" ) ,
257+ new ( "meterKey2 " , "value2" ) ,
261258 } ;
262259
263- using var meter = new Meter ( MeterName , MeterVersion ) ;
264-
265- var beginTimestamp = DateTimeOffset . Now . ToUnixTimeMilliseconds ( ) ;
260+ return RunPrometheusExporterMiddlewareIntegrationTest (
261+ "/metrics" ,
262+ app => app . UseOpenTelemetryPrometheusScrapingEndpoint ( ) ,
263+ acceptHeader : "text/plain" ,
264+ meterTags : meterTags ) ;
265+ }
266266
267- var counter = meter . CreateCounter < double > ( "counter_double" , unit : "By" ) ;
268- counter . Add ( 100.18D , tags ) ;
269- counter . Add ( 0.99D , tags ) ;
267+ [ Fact ]
268+ public Task PrometheusExporterMiddlewareIntegration_UseOpenMetricsVersionHeader_WithMeterTags ( )
269+ {
270+ var meterTags = new KeyValuePair < string , object ? > [ ]
271+ {
272+ new ( "meterKey1" , "value1" ) ,
273+ new ( "meterKey2" , "value2" ) ,
274+ } ;
270275
271- var testCases = new bool [ ] { true , false , true , true , false } ;
276+ return RunPrometheusExporterMiddlewareIntegrationTest (
277+ "/metrics" ,
278+ app => app . UseOpenTelemetryPrometheusScrapingEndpoint ( ) ,
279+ acceptHeader : "application/openmetrics-text; version=1.0.0" ,
280+ meterTags : meterTags ) ;
281+ }
272282
273- using var client = host . GetTestClient ( ) ;
283+ [ Fact ]
284+ public async Task PrometheusExporterMiddlewareIntegration_CanServeOpenMetricsAndPlainFormats_NoMeterTags ( )
285+ {
286+ await RunPrometheusExporterMiddlewareIntegrationTestWithBothFormats ( ) ;
287+ }
274288
275- foreach ( var testCase in testCases )
289+ [ Fact ]
290+ public async Task PrometheusExporterMiddlewareIntegration_CanServeOpenMetricsAndPlainFormats_WithMeterTags ( )
291+ {
292+ var meterTags = new KeyValuePair < string , object ? > [ ]
276293 {
277- using var request = new HttpRequestMessage
278- {
279- Headers = { { "Accept" , testCase ? "application/openmetrics-text" : "text/plain" } } ,
280- RequestUri = new Uri ( "/metrics" , UriKind . Relative ) ,
281- Method = HttpMethod . Get ,
282- } ;
283- using var response = await client . SendAsync ( request ) ;
284- var endTimestamp = DateTimeOffset . Now . ToUnixTimeMilliseconds ( ) ;
285- await VerifyAsync ( beginTimestamp , endTimestamp , response , testCase ) ;
286- }
294+ new ( "meterKey1" , "value1" ) ,
295+ new ( "meterKey2" , "value2" ) ,
296+ } ;
287297
288- await host . StopAsync ( ) ;
298+ await RunPrometheusExporterMiddlewareIntegrationTestWithBothFormats ( meterTags ) ;
289299 }
290300
291301 [ Fact ]
@@ -312,6 +322,45 @@ public async Task PrometheusExporterMiddlewareIntegration_TestBufferSizeIncrease
312322 await host . StopAsync ( ) ;
313323 }
314324
325+ private static async Task RunPrometheusExporterMiddlewareIntegrationTestWithBothFormats ( KeyValuePair < string , object ? > [ ] ? meterTags = null )
326+ {
327+ using var host = await StartTestHostAsync (
328+ app => app . UseOpenTelemetryPrometheusScrapingEndpoint ( ) ) ;
329+
330+ var counterTags = new KeyValuePair < string , object ? > [ ]
331+ {
332+ new ( "key1" , "value1" ) ,
333+ new ( "key2" , "value2" ) ,
334+ } ;
335+
336+ using var meter = new Meter ( MeterName , MeterVersion , meterTags ) ;
337+
338+ var beginTimestamp = DateTimeOffset . Now . ToUnixTimeMilliseconds ( ) ;
339+
340+ var counter = meter . CreateCounter < double > ( "counter_double" , unit : "By" ) ;
341+ counter . Add ( 100.18D , counterTags ) ;
342+ counter . Add ( 0.99D , counterTags ) ;
343+
344+ var testCases = new bool [ ] { true , false , true , true , false } ;
345+
346+ using var client = host . GetTestClient ( ) ;
347+
348+ foreach ( var testCase in testCases )
349+ {
350+ using var request = new HttpRequestMessage
351+ {
352+ Headers = { { "Accept" , testCase ? "application/openmetrics-text" : "text/plain" } } ,
353+ RequestUri = new Uri ( "/metrics" , UriKind . Relative ) ,
354+ Method = HttpMethod . Get ,
355+ } ;
356+ using var response = await client . SendAsync ( request ) ;
357+ var endTimestamp = DateTimeOffset . Now . ToUnixTimeMilliseconds ( ) ;
358+ await VerifyAsync ( beginTimestamp , endTimestamp , response , testCase , meterTags ) ;
359+ }
360+
361+ await host . StopAsync ( ) ;
362+ }
363+
315364 private static async Task RunPrometheusExporterMiddlewareIntegrationTest (
316365 string path ,
317366 Action < IApplicationBuilder > configure ,
@@ -320,27 +369,28 @@ private static async Task RunPrometheusExporterMiddlewareIntegrationTest(
320369 bool registerMeterProvider = true ,
321370 Action < PrometheusAspNetCoreOptions > ? configureOptions = null ,
322371 bool skipMetrics = false ,
323- string acceptHeader = "application/openmetrics-text" )
372+ string acceptHeader = "application/openmetrics-text" ,
373+ KeyValuePair < string , object ? > [ ] ? meterTags = null )
324374 {
325375 var requestOpenMetrics = acceptHeader . StartsWith ( "application/openmetrics-text" ) ;
326376
327377 using var host = await StartTestHostAsync ( configure , configureServices , registerMeterProvider , configureOptions ) ;
328378
329- var tags = new KeyValuePair < string , object ? > [ ]
379+ var counterTags = new KeyValuePair < string , object ? > [ ]
330380 {
331381 new ( "key1" , "value1" ) ,
332382 new ( "key2" , "value2" ) ,
333383 } ;
334384
335- using var meter = new Meter ( MeterName , MeterVersion ) ;
385+ using var meter = new Meter ( MeterName , MeterVersion , meterTags ) ;
336386
337387 var beginTimestamp = DateTimeOffset . Now . ToUnixTimeMilliseconds ( ) ;
338388
339389 var counter = meter . CreateCounter < double > ( "counter_double" , unit : "By" ) ;
340390 if ( ! skipMetrics )
341391 {
342- counter . Add ( 100.18D , tags ) ;
343- counter . Add ( 0.99D , tags ) ;
392+ counter . Add ( 100.18D , counterTags ) ;
393+ counter . Add ( 0.99D , counterTags ) ;
344394 }
345395
346396 using var client = host . GetTestClient ( ) ;
@@ -356,7 +406,7 @@ private static async Task RunPrometheusExporterMiddlewareIntegrationTest(
356406
357407 if ( ! skipMetrics )
358408 {
359- await VerifyAsync ( beginTimestamp , endTimestamp , response , requestOpenMetrics ) ;
409+ await VerifyAsync ( beginTimestamp , endTimestamp , response , requestOpenMetrics , meterTags ) ;
360410 }
361411 else
362412 {
@@ -368,7 +418,7 @@ private static async Task RunPrometheusExporterMiddlewareIntegrationTest(
368418 await host . StopAsync ( ) ;
369419 }
370420
371- private static async Task VerifyAsync ( long beginTimestamp , long endTimestamp , HttpResponseMessage response , bool requestOpenMetrics )
421+ private static async Task VerifyAsync ( long beginTimestamp , long endTimestamp , HttpResponseMessage response , bool requestOpenMetrics , KeyValuePair < string , object ? > [ ] ? meterTags )
372422 {
373423 Assert . Equal ( HttpStatusCode . OK , response . StatusCode ) ;
374424 Assert . True ( response . Content . Headers . Contains ( "Last-Modified" ) ) ;
@@ -382,6 +432,10 @@ private static async Task VerifyAsync(long beginTimestamp, long endTimestamp, Ht
382432 Assert . Equal ( "text/plain; charset=utf-8; version=0.0.4" , response . Content . Headers . ContentType ! . ToString ( ) ) ;
383433 }
384434
435+ var additionalTags = meterTags != null && meterTags . Any ( )
436+ ? $ "{ string . Join ( "," , meterTags . Select ( x => $ "{ x . Key } =\" { x . Value } \" ") ) } ,"
437+ : string . Empty ;
438+
385439 string content = ( await response . Content . ReadAsStringAsync ( ) ) . ReplaceLineEndings ( ) ;
386440
387441 string expected = requestOpenMetrics
@@ -394,14 +448,14 @@ private static async Task VerifyAsync(long beginTimestamp, long endTimestamp, Ht
394448 otel_scope_info{otel_scope_name="{{ MeterName }} "} 1
395449 # TYPE counter_double_bytes counter
396450 # UNIT counter_double_bytes bytes
397- counter_double_bytes_total{otel_scope_name="{{ MeterName }} ",otel_scope_version="{{ MeterVersion }} ",key1="value1",key2="value2"} 101.17 (\d+\.\d{3})
451+ counter_double_bytes_total{otel_scope_name="{{ MeterName }} ",otel_scope_version="{{ MeterVersion }} ",{{ additionalTags }} key1="value1",key2="value2"} 101.17 (\d+\.\d{3})
398452 # EOF
399453
400454 """ . ReplaceLineEndings ( )
401455 : $$ """
402456 # TYPE counter_double_bytes_total counter
403457 # UNIT counter_double_bytes_total bytes
404- counter_double_bytes_total{otel_scope_name="{{ MeterName }} ",otel_scope_version="{{ MeterVersion }} ",key1="value1",key2="value2"} 101.17 (\d+)
458+ counter_double_bytes_total{otel_scope_name="{{ MeterName }} ",otel_scope_version="{{ MeterVersion }} ",{{ additionalTags }} key1="value1",key2="value2"} 101.17 (\d+)
405459 # EOF
406460
407461 """ . ReplaceLineEndings ( ) ;
0 commit comments