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

This commit is contained in:
Steven Swartz 2023-07-05 03:34:22 -04:00 committed by GitHub
parent a410cdeb39
commit 15337549e3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 72 additions and 0 deletions

View File

@ -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);
}
}

View File

@ -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);
}

View File

@ -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);
}
}

View File

@ -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);
}

View File

@ -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"))));
}
}