Skip to content

Commit 9da29ca

Browse files
authored
Hibernate 6: don't record NoResultException (#12879)
1 parent 37211a7 commit 9da29ca

File tree

4 files changed

+59
-2
lines changed

4 files changed

+59
-2
lines changed

instrumentation/hibernate/hibernate-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/hibernate/v4_0/EntityManagerTest.java

+28
Original file line numberDiff line numberDiff line change
@@ -19,16 +19,21 @@
1919
import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_STATEMENT;
2020
import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SYSTEM;
2121
import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_USER;
22+
import static java.util.Collections.emptyList;
23+
import static org.assertj.core.api.Assertions.assertThatThrownBy;
2224
import static org.junit.jupiter.api.Named.named;
2325

2426
import io.opentelemetry.api.common.Attributes;
27+
import io.opentelemetry.api.trace.SpanKind;
28+
import io.opentelemetry.sdk.trace.data.StatusData;
2529
import java.util.function.BiConsumer;
2630
import java.util.function.Function;
2731
import java.util.stream.Stream;
2832
import javax.persistence.EntityManager;
2933
import javax.persistence.EntityManagerFactory;
3034
import javax.persistence.EntityTransaction;
3135
import javax.persistence.LockModeType;
36+
import javax.persistence.NoResultException;
3237
import javax.persistence.Persistence;
3338
import javax.persistence.Query;
3439
import org.hibernate.Version;
@@ -324,6 +329,29 @@ void testAttachesStateToQuery(Function<EntityManager, Query> queryBuildMethod) {
324329
.get(stringKey("hibernate.session_id"))))));
325330
}
326331

332+
@Test
333+
void testNoResultExceptionIgnored() {
334+
EntityManager entityManager = entityManagerFactory.createEntityManager();
335+
Query query = entityManager.createQuery("from Value where id = :id");
336+
query.setParameter("id", 1000L);
337+
assertThatThrownBy(query::getSingleResult).isInstanceOf(NoResultException.class);
338+
entityManager.close();
339+
340+
testing.waitAndAssertTraces(
341+
trace ->
342+
trace.hasSpansSatisfyingExactly(
343+
span ->
344+
span.hasName("SELECT Value")
345+
.hasKind(SpanKind.INTERNAL)
346+
.hasNoParent()
347+
.hasStatus(StatusData.unset())
348+
.hasEvents(emptyList()),
349+
span ->
350+
span.hasName("SELECT db1.Value")
351+
.hasKind(SpanKind.CLIENT)
352+
.hasParent(trace.getSpan(0))));
353+
}
354+
327355
private static Stream<Arguments> provideArgumentsAttachesState() {
328356
return Stream.of(
329357
Arguments.of(

instrumentation/hibernate/hibernate-6.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/hibernate/v6_0/QueryInstrumentation.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -45,13 +45,14 @@ public void transform(TypeTransformer transformer) {
4545
transformer.applyAdviceToMethod(
4646
isMethod()
4747
.and(
48+
// not instrumenting getSingleResult as it calls list that is instrumented and
49+
// we don't want to record the NoResultException that it throws
4850
namedOneOf(
4951
"list",
5052
"getResultList",
5153
"stream",
5254
"getResultStream",
5355
"uniqueResult",
54-
"getSingleResult",
5556
"getSingleResultOrNull",
5657
"uniqueResultOptional",
5758
"executeUpdate",

instrumentation/hibernate/hibernate-6.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/hibernate/v6_0/AbstractHibernateTest.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ protected static void setup() {
2929
// Pre-populate the DB, so delete/update can be tested.
3030
Session writer = sessionFactory.openSession();
3131
writer.beginTransaction();
32-
prepopulated = new ArrayList<Value>();
32+
prepopulated = new ArrayList<>();
3333
for (int i = 0; i < 5; i++) {
3434
prepopulated.add(new Value("Hello :) " + i));
3535
writer.persist(prepopulated.get(i));

instrumentation/hibernate/hibernate-6.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/hibernate/v6_0/EntityManagerTest.java

+28
Original file line numberDiff line numberDiff line change
@@ -16,23 +16,28 @@
1616
import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_STATEMENT;
1717
import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SYSTEM;
1818
import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_USER;
19+
import static java.util.Collections.emptyList;
20+
import static org.assertj.core.api.Assertions.assertThatThrownBy;
1921
import static org.junit.jupiter.api.Named.named;
2022

2123
import io.opentelemetry.api.common.AttributeKey;
2224
import io.opentelemetry.api.trace.SpanKind;
2325
import io.opentelemetry.sdk.testing.assertj.SpanDataAssert;
2426
import io.opentelemetry.sdk.trace.data.SpanData;
27+
import io.opentelemetry.sdk.trace.data.StatusData;
2528
import jakarta.persistence.EntityManager;
2629
import jakarta.persistence.EntityManagerFactory;
2730
import jakarta.persistence.EntityTransaction;
2831
import jakarta.persistence.LockModeType;
32+
import jakarta.persistence.NoResultException;
2933
import jakarta.persistence.Persistence;
3034
import jakarta.persistence.Query;
3135
import java.util.Arrays;
3236
import java.util.List;
3337
import java.util.function.BiConsumer;
3438
import java.util.function.Function;
3539
import java.util.stream.Stream;
40+
import org.junit.jupiter.api.Test;
3641
import org.junit.jupiter.params.ParameterizedTest;
3742
import org.junit.jupiter.params.provider.Arguments;
3843
import org.junit.jupiter.params.provider.MethodSource;
@@ -166,6 +171,29 @@ void testAttachesStateToQuery(Parameter parameter) {
166171
.get(AttributeKey.stringKey("hibernate.session_id")))));
167172
}
168173

174+
@Test
175+
void testNoResultExceptionIgnored() {
176+
EntityManager entityManager = entityManagerFactory.createEntityManager();
177+
Query query = entityManager.createQuery("from Value where id = :id");
178+
query.setParameter("id", 1000);
179+
assertThatThrownBy(query::getSingleResult).isInstanceOf(NoResultException.class);
180+
entityManager.close();
181+
182+
testing.waitAndAssertTraces(
183+
trace ->
184+
trace.hasSpansSatisfyingExactly(
185+
span ->
186+
span.hasName("SELECT " + Value.class.getName())
187+
.hasKind(SpanKind.INTERNAL)
188+
.hasNoParent()
189+
.hasStatus(StatusData.unset())
190+
.hasEvents(emptyList()),
191+
span ->
192+
span.hasName("SELECT db1.Value")
193+
.hasKind(SpanKind.CLIENT)
194+
.hasParent(trace.getSpan(0))));
195+
}
196+
169197
private static Stream<Arguments> provideHibernateActionParameters() {
170198
List<BiConsumer<EntityManager, Value>> sessionMethodTests =
171199
Arrays.asList(

0 commit comments

Comments
 (0)