55
66package org .opensearch .dataprepper .plugins .source .otelmetrics ;
77
8+ import org .apache .commons .lang3 .tuple .Pair ;
89import com .linecorp .armeria .server .ServiceRequestContext ;
910import io .grpc .stub .StreamObserver ;
1011import io .micrometer .core .instrument .Counter ;
4445import java .util .Collections ;
4546import java .util .List ;
4647import java .util .Map ;
48+ import java .util .Set ;
4749import java .util .concurrent .TimeoutException ;
4850import java .util .stream .Stream ;
4951
@@ -85,6 +87,10 @@ public class OTelMetricsGrpcServiceTest {
8587 private static final int TEST_RESOURCE_DROPPED_ATTRIBUTES_COUNT = 11 ;
8688 private static final int TEST_SCOPE_DROPPED_ATTRIBUTES_COUNT = 22 ;
8789
90+ private static final String SERVICE_NAME_KEY ="service.name" ;
91+ private static final String TEST_SERVICE_NAME1 ="testService1" ;
92+ private static final String TEST_SERVICE_NAME2 ="testService2" ;
93+
8894 private static final String IS_SCOPE_NAME ="testISScopeName" ;
8995 private static final String IS_SCOPE_VERSION ="testISScopeVersion" ;
9096 private static final String IS_SCOPE_ATTR_KEY ="scope.attr" ;
@@ -167,6 +173,9 @@ public class OTelMetricsGrpcServiceTest {
167173 @ Captor
168174 private ArgumentCaptor <Collection <Record >> recordCaptor ;
169175
176+ @ Captor
177+ private ArgumentCaptor <byte []> byteBufferRecordCaptor ;
178+
170179 @ Captor
171180 ArgumentCaptor <byte []> bytesCaptor ;
172181
@@ -195,8 +204,12 @@ public void setup() {
195204
196205 }
197206
207+ OTelMetricsGrpcService createObjectUnderTestWithKeys (final OTelProtoCodec .OTelProtoDecoder decoder , final Set <String > keys ) {
208+ return new OTelMetricsGrpcService (bufferWriteTimeoutInMillis , decoder , buffer , keys , mockPluginMetrics , null );
209+ }
210+
198211 OTelMetricsGrpcService createObjectUnderTest (OTelProtoCodec .OTelProtoDecoder decoder ) {
199- return new OTelMetricsGrpcService (bufferWriteTimeoutInMillis , decoder , buffer , mockPluginMetrics , null );
212+ return new OTelMetricsGrpcService (bufferWriteTimeoutInMillis , decoder , buffer , null , mockPluginMetrics , null );
200213 }
201214
202215 @ ParameterizedTest
@@ -273,6 +286,43 @@ public void export_BufferTimeout_responseObserverOnError(OTelProtoCodec.OTelProt
273286 verify (requestProcessDuration , times (1 )).record (ArgumentMatchers .<Runnable >any ());
274287 }
275288
289+ @ Test
290+ public void test_MetricsSource_output_with_PartitionKeyName () throws Exception {
291+ final ExportMetricsServiceRequest METRIC_REQUEST = createMetricsRequest ();
292+ final OTelProtoStandardCodec .OTelProtoDecoder decoder = new OTelProtoStandardCodec .OTelProtoDecoder ();
293+ when (buffer .isByteBuffer ()).thenReturn (true );
294+
295+ sut = createObjectUnderTestWithKeys (decoder , Set .of ("name" ));
296+ try (MockedStatic <ServiceRequestContext > mockedStatic = mockStatic (ServiceRequestContext .class )) {
297+ mockedStatic .when (ServiceRequestContext ::current ).thenReturn (serviceRequestContext );
298+ sut .export (METRIC_REQUEST , responseObserver );
299+ }
300+ verify (buffer , times (1 )).writeBytes (byteBufferRecordCaptor .capture (), eq (TEST_GAUGE_METRIC_NAME ), anyInt ());
301+ verify (buffer , times (1 )).writeBytes (byteBufferRecordCaptor .capture (), eq (TEST_SUM_METRIC_NAME ), anyInt ());
302+ verify (buffer , times (1 )).writeBytes (byteBufferRecordCaptor .capture (), eq (TEST_SUMMARY_METRIC_NAME ), anyInt ());
303+ verify (buffer , times (1 )).writeBytes (byteBufferRecordCaptor .capture (), eq (TEST_HISTOGRAM_METRIC_NAME ), anyInt ());
304+ verify (buffer , times (1 )).writeBytes (byteBufferRecordCaptor .capture (), eq (TEST_EXPONENTIAL_HISTOGRAM_METRIC_NAME ), anyInt ());
305+ }
306+
307+
308+ @ Test
309+ public void test_MetricsSource_output_with_PartitionKeysNameAndServiceName () throws Exception {
310+ final ExportMetricsServiceRequest METRIC_REQUEST = createMetricsRequestWithTwoServices ();
311+ final OTelProtoStandardCodec .OTelProtoDecoder decoder = new OTelProtoStandardCodec .OTelProtoDecoder ();
312+ when (buffer .isByteBuffer ()).thenReturn (true );
313+
314+ sut = createObjectUnderTestWithKeys (decoder , Set .of ("name" , "service_name" ));
315+ try (MockedStatic <ServiceRequestContext > mockedStatic = mockStatic (ServiceRequestContext .class )) {
316+ mockedStatic .when (ServiceRequestContext ::current ).thenReturn (serviceRequestContext );
317+ sut .export (METRIC_REQUEST , responseObserver );
318+ }
319+ verify (buffer , times (1 )).writeBytes (byteBufferRecordCaptor .capture (), eq (TEST_SERVICE_NAME1 +":" +TEST_GAUGE_METRIC_NAME ), anyInt ());
320+ verify (buffer , times (1 )).writeBytes (byteBufferRecordCaptor .capture (), eq (TEST_SERVICE_NAME1 +":" +TEST_SUM_METRIC_NAME ), anyInt ());
321+ verify (buffer , times (1 )).writeBytes (byteBufferRecordCaptor .capture (), eq (TEST_SERVICE_NAME2 +":" +TEST_SUMMARY_METRIC_NAME ), anyInt ());
322+ verify (buffer , times (1 )).writeBytes (byteBufferRecordCaptor .capture (), eq (TEST_SERVICE_NAME2 +":" +TEST_HISTOGRAM_METRIC_NAME ), anyInt ());
323+ verify (buffer , times (1 )).writeBytes (byteBufferRecordCaptor .capture (), eq (TEST_SERVICE_NAME2 +":" +TEST_EXPONENTIAL_HISTOGRAM_METRIC_NAME ), anyInt ());
324+ }
325+
276326 @ Test
277327 public void test_MetricsSource_output_with_OpensearchFormat () throws Exception {
278328 final ExportMetricsServiceRequest METRIC_REQUEST = createMetricsRequest ();
@@ -336,19 +386,12 @@ private static Stream<Arguments> getDecoderArguments() {
336386 );
337387 }
338388
339- private ExportMetricsServiceRequest createMetricsRequest () {
389+ private Pair < ScopeMetrics , ScopeMetrics > createScopeMetrics () {
340390 Instant currentTime = Instant .now ();
341391 startTime = currentTime .toString ();
342392 final long currentUnixTimeNano = ((long )currentTime .getEpochSecond () * 1000_000_000L ) + currentTime .getNano ();
343393 final long endUnixTimeNano = currentUnixTimeNano + (TIME_DELTA *1000_000_000L );
344394 endTime = currentTime .plusSeconds (TIME_DELTA ).toString ();
345- final Resource resource = Resource .newBuilder ()
346- .setDroppedAttributesCount (TEST_RESOURCE_DROPPED_ATTRIBUTES_COUNT )
347- .addAttributes (KeyValue .newBuilder ()
348- .setKey (TEST_RESOURCE_ATTR_KEY )
349- .setValue (AnyValue .newBuilder ().setStringValue (TEST_RESOURCE_ATTR_VALUE ).build ())
350- ).build ();
351-
352395 final InstrumentationScope instrumentationScope = InstrumentationScope .newBuilder ()
353396 .setName (IS_SCOPE_NAME )
354397 .setVersion (IS_SCOPE_VERSION )
@@ -357,7 +400,7 @@ private ExportMetricsServiceRequest createMetricsRequest() {
357400 .setKey (IS_SCOPE_ATTR_KEY )
358401 .setValue (AnyValue .newBuilder ().setStringValue (IS_SCOPE_ATTR_VALUE ).build ())
359402 ).build ();
360- ScopeMetrics scopeMetrics = ScopeMetrics .newBuilder ()
403+ ScopeMetrics scopeMetrics1 = ScopeMetrics .newBuilder ()
361404 .setScope (instrumentationScope )
362405 .setSchemaUrl (TEST_SCHEMA_URL )
363406 .addMetrics (io .opentelemetry .proto .metrics .v1 .Metric .newBuilder ()
@@ -395,6 +438,11 @@ private ExportMetricsServiceRequest createMetricsRequest() {
395438 .setAggregationTemporality (io .opentelemetry .proto .metrics .v1 .AggregationTemporality .AGGREGATION_TEMPORALITY_CUMULATIVE )
396439 .build ())
397440 .build ())
441+ .build ();
442+
443+ ScopeMetrics scopeMetrics2 = ScopeMetrics .newBuilder ()
444+ .setScope (instrumentationScope )
445+ .setSchemaUrl (TEST_SCHEMA_URL )
398446 .addMetrics (io .opentelemetry .proto .metrics .v1 .Metric .newBuilder ()
399447 .setName (TEST_EXPONENTIAL_HISTOGRAM_METRIC_NAME )
400448 .setDescription (TEST_EXPONENTIAL_HISTOGRAM_DESCRIPTION )
@@ -473,14 +521,63 @@ private ExportMetricsServiceRequest createMetricsRequest() {
473521 .build ())
474522 .build ())
475523 .build ();
524+ return Pair .of (scopeMetrics1 , scopeMetrics2 );
525+ }
476526
527+ private ExportMetricsServiceRequest createMetricsRequest () {
528+ final Resource resource = Resource .newBuilder ()
529+ .setDroppedAttributesCount (TEST_RESOURCE_DROPPED_ATTRIBUTES_COUNT )
530+ .addAttributes (KeyValue .newBuilder ()
531+ .setKey (TEST_RESOURCE_ATTR_KEY )
532+ .setValue (AnyValue .newBuilder ().setStringValue (TEST_RESOURCE_ATTR_VALUE ).build ())
533+ ).build ();
534+
535+ Pair <ScopeMetrics , ScopeMetrics > scopeMetrics = createScopeMetrics ();
477536 ResourceMetrics resourceMetrics = ResourceMetrics .newBuilder ()
478537 .setResource (resource )
479- .addScopeMetrics (scopeMetrics )
538+ .addScopeMetrics (scopeMetrics .getLeft ())
539+ .addScopeMetrics (scopeMetrics .getRight ())
480540 .build ();
481541
482542 return ExportMetricsServiceRequest .newBuilder ()
483543 .addResourceMetrics (resourceMetrics )
484544 .build ();
485545 }
546+
547+ private ExportMetricsServiceRequest createMetricsRequestWithTwoServices () {
548+ Instant currentTime = Instant .now ();
549+ startTime = currentTime .toString ();
550+ final long currentUnixTimeNano = ((long )currentTime .getEpochSecond () * 1000_000_000L ) + currentTime .getNano ();
551+ final long endUnixTimeNano = currentUnixTimeNano + (TIME_DELTA *1000_000_000L );
552+ endTime = currentTime .plusSeconds (TIME_DELTA ).toString ();
553+ final Resource resource1 = Resource .newBuilder ()
554+ .setDroppedAttributesCount (TEST_RESOURCE_DROPPED_ATTRIBUTES_COUNT )
555+ .addAttributes (KeyValue .newBuilder ()
556+ .setKey (SERVICE_NAME_KEY )
557+ .setValue (AnyValue .newBuilder ().setStringValue (TEST_SERVICE_NAME1 ).build ())
558+ ).build ();
559+ final Resource resource2 = Resource .newBuilder ()
560+ .setDroppedAttributesCount (TEST_RESOURCE_DROPPED_ATTRIBUTES_COUNT )
561+ .addAttributes (KeyValue .newBuilder ()
562+ .setKey (SERVICE_NAME_KEY )
563+ .setValue (AnyValue .newBuilder ().setStringValue (TEST_SERVICE_NAME2 ).build ())
564+ ).build ();
565+
566+ Pair <ScopeMetrics , ScopeMetrics > scopeMetrics = createScopeMetrics ();
567+
568+ ResourceMetrics resourceMetrics1 = ResourceMetrics .newBuilder ()
569+ .setResource (resource1 )
570+ .addScopeMetrics (scopeMetrics .getLeft ())
571+ .build ();
572+
573+ ResourceMetrics resourceMetrics2 = ResourceMetrics .newBuilder ()
574+ .setResource (resource2 )
575+ .addScopeMetrics (scopeMetrics .getRight ())
576+ .build ();
577+
578+ return ExportMetricsServiceRequest .newBuilder ()
579+ .addResourceMetrics (resourceMetrics1 )
580+ .addResourceMetrics (resourceMetrics2 )
581+ .build ();
582+ }
486583}
0 commit comments