瀏覽代碼

Implement forEach support for aws sqs tracing list (#10062)

Lauri Tulmin 1 年之前
父節點
當前提交
c7fd4d4b1c

+ 8 - 0
instrumentation/aws-sdk/aws-sdk-1.11/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/TracingList.java

@@ -13,6 +13,7 @@ import io.opentelemetry.context.Context;
 import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
 import java.util.Iterator;
 import java.util.List;
+import java.util.function.Consumer;
 
 class TracingList extends SdkInternalList<Message> {
   private static final long serialVersionUID = 1L;
@@ -57,6 +58,13 @@ class TracingList extends SdkInternalList<Message> {
     return it;
   }
 
+  @Override
+  public void forEach(Consumer<? super Message> action) {
+    for (Message message : this) {
+      action.accept(message);
+    }
+  }
+
   private static boolean inAwsClient() {
     for (Class<?> caller : CallerClass.INSTANCE.getClassContext()) {
       if (AmazonSQSClient.class == caller) {

+ 9 - 2
instrumentation/aws-sdk/aws-sdk-1.11/testing/src/main/groovy/io/opentelemetry/instrumentation/awssdk/v1_11/AbstractSqsTracingTest.groovy

@@ -68,8 +68,15 @@ abstract class AbstractSqsTracingTest extends InstrumentationSpecification {
       receiveMessageRequest.withMessageAttributeNames("test-message-header")
     }
     def receiveMessageResult = client.receiveMessage(receiveMessageRequest)
-    receiveMessageResult.messages.each {message ->
-      runWithSpan("process child") {}
+    // test different ways of iterating the messages list
+    if (testCaptureHeaders) {
+      receiveMessageResult.messages.each { message ->
+        runWithSpan("process child") {}
+      }
+    } else {
+      receiveMessageResult.messages.forEach { message ->
+        runWithSpan("process child") {}
+      }
     }
 
     then:

+ 8 - 0
instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/TracingList.java

@@ -10,6 +10,7 @@ import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
+import java.util.function.Consumer;
 import software.amazon.awssdk.core.interceptor.ExecutionAttributes;
 import software.amazon.awssdk.services.sqs.model.Message;
 
@@ -59,4 +60,11 @@ class TracingList extends ArrayList<Message> {
 
     return it;
   }
+
+  @Override
+  public void forEach(Consumer<? super Message> action) {
+    for (Message message : this) {
+      action.accept(message);
+    }
+  }
 }

+ 2 - 1
instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/groovy/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2SqsTracingTest.groovy

@@ -300,7 +300,8 @@ abstract class AbstractAws2SqsTracingTest extends InstrumentationSpecification {
 
     then:
     resp.messages.size() == 1
-    resp.messages.each {message -> runWithSpan("process child") {}}
+    // using forEach instead of each here to test different ways of iterating messages list
+    resp.messages.forEach {message -> runWithSpan("process child") {}}
     assertSqsTraces(false, true)
   }