Przeglądaj źródła

Adds spring-data test verifying error spans on JPA repository query failures (#8857)

Steven Swartz 1 rok temu
rodzic
commit
15337549e3

+ 6 - 0
instrumentation/spring/spring-data/spring-data-1.8/javaagent/src/test/java/SprintJpaTest.java

@@ -4,6 +4,7 @@
  */
 
 import java.util.List;
+import java.util.Optional;
 import org.springframework.context.annotation.AnnotationConfigApplicationContext;
 import spring.jpa.JpaCustomer;
 import spring.jpa.JpaCustomerRepository;
@@ -52,4 +53,9 @@ public class SprintJpaTest extends AbstractSpringJpaTest<JpaCustomer, JpaCustome
   List<JpaCustomer> findSpecialCustomers(JpaCustomerRepository repository) {
     return repository.findSpecialCustomers();
   }
+
+  @Override
+  Optional<JpaCustomer> findOneByLastName(JpaCustomerRepository repository, String lastName) {
+    return repository.findOneByLastName(lastName);
+  }
 }

+ 3 - 0
instrumentation/spring/spring-data/spring-data-1.8/javaagent/src/test/java/spring/jpa/JpaCustomerRepository.java

@@ -6,9 +6,12 @@
 package spring.jpa;
 
 import java.util.List;
+import java.util.Optional;
 import org.springframework.data.jpa.repository.JpaRepository;
 
 public interface JpaCustomerRepository
     extends JpaRepository<JpaCustomer, Long>, JpaCustomerRepositoryCustom {
   List<JpaCustomer> findByLastName(String lastName);
+
+  Optional<JpaCustomer> findOneByLastName(String lastName);
 }

+ 6 - 0
instrumentation/spring/spring-data/spring-data-3.0/testing/src/test/java/SpringJpaTest.java

@@ -4,6 +4,7 @@
  */
 
 import java.util.List;
+import java.util.Optional;
 import org.springframework.context.annotation.AnnotationConfigApplicationContext;
 import spring.jpa.JpaCustomer;
 import spring.jpa.JpaCustomerRepository;
@@ -52,4 +53,9 @@ public class SpringJpaTest extends AbstractSpringJpaTest<JpaCustomer, JpaCustome
   List<JpaCustomer> findSpecialCustomers(JpaCustomerRepository repository) {
     return repository.findSpecialCustomers();
   }
+
+  @Override
+  Optional<JpaCustomer> findOneByLastName(JpaCustomerRepository repository, String lastName) {
+    return repository.findOneByLastName(lastName);
+  }
 }

+ 3 - 0
instrumentation/spring/spring-data/spring-data-3.0/testing/src/test/java/spring/jpa/JpaCustomerRepository.java

@@ -6,9 +6,12 @@
 package spring.jpa;
 
 import java.util.List;
+import java.util.Optional;
 import org.springframework.data.jpa.repository.JpaRepository;
 
 public interface JpaCustomerRepository
     extends JpaRepository<JpaCustomer, Long>, JpaCustomerRepositoryCustom {
   List<JpaCustomer> findByLastName(String lastName);
+
+  Optional<JpaCustomer> findOneByLastName(String lastName);
 }

+ 54 - 0
instrumentation/spring/spring-data/spring-data-common/testing/src/main/java/AbstractSpringJpaTest.java

@@ -5,6 +5,7 @@
 
 import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo;
 import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies;
+import static org.assertj.core.api.Assertions.catchThrowableOfType;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
@@ -15,11 +16,14 @@ import io.opentelemetry.api.trace.SpanKind;
 import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension;
 import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension;
 import io.opentelemetry.sdk.testing.assertj.TraceAssert;
+import io.opentelemetry.sdk.trace.data.StatusData;
 import io.opentelemetry.semconv.trace.attributes.SemanticAttributes;
 import java.util.List;
+import java.util.Optional;
 import org.hibernate.Version;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.RegisterExtension;
+import org.springframework.dao.IncorrectResultSizeDataAccessException;
 import org.springframework.data.jpa.repository.JpaRepository;
 
 public abstract class AbstractSpringJpaTest<
@@ -42,6 +46,8 @@ public abstract class AbstractSpringJpaTest<
 
   abstract List<ENTITY> findSpecialCustomers(REPOSITORY repository);
 
+  abstract Optional<ENTITY> findOneByLastName(REPOSITORY repository, String lastName);
+
   void clearData() {
     testing.clearData();
   }
@@ -319,4 +325,52 @@ public abstract class AbstractSpringJpaTest<
                                 equalTo(SemanticAttributes.DB_OPERATION, "SELECT"),
                                 equalTo(SemanticAttributes.DB_SQL_TABLE, "JpaCustomer"))));
   }
+
+  @Test
+  void testFailedRepositoryMethod() {
+    // given
+    REPOSITORY repo = repository();
+    String repoClassName = repositoryClass().getName();
+
+    String commonLastName = "Smith";
+    repo.save(newCustomer("Alice", commonLastName));
+    repo.save(newCustomer("Bob", commonLastName));
+    clearData();
+
+    // when
+    IncorrectResultSizeDataAccessException expectedException =
+        catchThrowableOfType(
+            () -> findOneByLastName(repo, commonLastName),
+            IncorrectResultSizeDataAccessException.class);
+
+    // then
+    assertNotNull(expectedException);
+    testing.waitAndAssertTraces(
+        trace ->
+            trace
+                .hasSize(2)
+                .hasSpansSatisfyingExactly(
+                    span ->
+                        span.hasName("JpaCustomerRepository.findOneByLastName")
+                            .hasKind(SpanKind.INTERNAL)
+                            .hasStatus(StatusData.error())
+                            .hasException(expectedException)
+                            .hasAttributesSatisfyingExactly(
+                                equalTo(SemanticAttributes.CODE_NAMESPACE, repoClassName),
+                                equalTo(SemanticAttributes.CODE_FUNCTION, "findOneByLastName")),
+                    span ->
+                        span.hasName("SELECT test.JpaCustomer")
+                            .hasKind(SpanKind.CLIENT)
+                            .hasParent(trace.getSpan(0))
+                            .hasAttributesSatisfyingExactly(
+                                equalTo(SemanticAttributes.DB_SYSTEM, "hsqldb"),
+                                equalTo(SemanticAttributes.DB_NAME, "test"),
+                                equalTo(SemanticAttributes.DB_USER, "sa"),
+                                equalTo(SemanticAttributes.DB_CONNECTION_STRING, "hsqldb:mem:"),
+                                satisfies(
+                                    SemanticAttributes.DB_STATEMENT,
+                                    val -> val.startsWith("select ")),
+                                equalTo(SemanticAttributes.DB_OPERATION, "SELECT"),
+                                equalTo(SemanticAttributes.DB_SQL_TABLE, "JpaCustomer"))));
+  }
 }