Skip to content

Commit d84b144

Browse files
authored
Hibernate metadata (#14584)
1 parent 701529d commit d84b144

File tree

22 files changed

+395
-282
lines changed

22 files changed

+395
-282
lines changed

docs/instrumentation-list.yaml

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3455,27 +3455,84 @@ libraries:
34553455
type: STRING
34563456
hibernate:
34573457
- name: hibernate-3.3
3458+
description: |
3459+
This instrumentation enables the generation of INTERNAL spans for Hibernate operations, including session methods (e.g., `save`, `update`, `delete`), transaction commits, and query executions.
34583460
source_path: instrumentation/hibernate/hibernate-3.3
34593461
scope:
34603462
name: io.opentelemetry.hibernate-3.3
34613463
target_versions:
34623464
javaagent:
34633465
- org.hibernate:hibernate-core:[3.3.0.GA,4.0.0.Final)
3466+
configurations:
3467+
- name: otel.instrumentation.hibernate.experimental-span-attributes
3468+
description: Enables the addition of the experimental `hibernate.session_id`
3469+
span attribute.
3470+
type: boolean
3471+
default: false
3472+
telemetry:
3473+
- when: default
3474+
spans:
3475+
- span_kind: INTERNAL
3476+
attributes: []
3477+
- when: otel.instrumentation.hibernate.experimental-span-attributes=true
3478+
spans:
3479+
- span_kind: INTERNAL
3480+
attributes:
3481+
- name: hibernate.session_id
3482+
type: STRING
34643483
- name: hibernate-4.0
3484+
description: |
3485+
This instrumentation enables the generation of INTERNAL spans for Hibernate operations, including session methods (e.g., `save`, `update`, `delete`), transaction commits, and query executions.
34653486
source_path: instrumentation/hibernate/hibernate-4.0
34663487
scope:
34673488
name: io.opentelemetry.hibernate-4.0
34683489
target_versions:
34693490
javaagent:
34703491
- org.hibernate:hibernate-core:[4.0.0.Final,6)
3492+
configurations:
3493+
- name: otel.instrumentation.hibernate.experimental-span-attributes
3494+
description: Enables the addition of the experimental `hibernate.session_id`
3495+
span attribute.
3496+
type: boolean
3497+
default: false
3498+
telemetry:
3499+
- when: default
3500+
spans:
3501+
- span_kind: INTERNAL
3502+
attributes: []
3503+
- when: otel.instrumentation.hibernate.experimental-span-attributes=true
3504+
spans:
3505+
- span_kind: INTERNAL
3506+
attributes:
3507+
- name: hibernate.session_id
3508+
type: STRING
34713509
- name: hibernate-6.0
3510+
description: |
3511+
This instrumentation enables the generation of INTERNAL spans for Hibernate operations, including session methods (e.g., `save`, `update`, `delete`), transaction commits, and query executions.
34723512
source_path: instrumentation/hibernate/hibernate-6.0
34733513
minimum_java_version: 11
34743514
scope:
34753515
name: io.opentelemetry.hibernate-6.0
34763516
target_versions:
34773517
javaagent:
34783518
- org.hibernate:hibernate-core:[6.0.0.Final,)
3519+
configurations:
3520+
- name: otel.instrumentation.hibernate.experimental-span-attributes
3521+
description: Enables the addition of the experimental `hibernate.session_id`
3522+
span attribute.
3523+
type: boolean
3524+
default: false
3525+
telemetry:
3526+
- when: default
3527+
spans:
3528+
- span_kind: INTERNAL
3529+
attributes: []
3530+
- when: otel.instrumentation.hibernate.experimental-span-attributes=true
3531+
spans:
3532+
- span_kind: INTERNAL
3533+
attributes:
3534+
- name: hibernate.session_id
3535+
type: STRING
34793536
- name: hibernate-procedure-call-4.3
34803537
source_path: instrumentation/hibernate/hibernate-procedure-call-4.3
34813538
scope:

instrumentation-docs/instrumentations.sh

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,12 @@ readonly INSTRUMENTATIONS=(
143143
"graphql-java:graphql-java-20.0:javaagent:testDataFetcher"
144144
"grpc-1.6:javaagent:test"
145145
"grpc-1.6:javaagent:testExperimental"
146+
"hibernate:hibernate-3.3:javaagent:test"
147+
"hibernate:hibernate-3.3:javaagent:testExperimental"
148+
"hibernate:hibernate-4.0:javaagent:test"
149+
"hibernate:hibernate-4.0:javaagent:testExperimental"
150+
"hibernate:hibernate-6.0:javaagent:test"
151+
"hibernate:hibernate-6.0:javaagent:testExperimental"
146152
)
147153

148154
# Some instrumentation test suites don't run ARM, so we use colima to run them in an x86_64

instrumentation/hibernate/hibernate-3.3/javaagent/build.gradle.kts

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ dependencies {
3535
testImplementation("com.sun.xml.bind:jaxb-core:2.2.11")
3636
testImplementation("com.sun.xml.bind:jaxb-impl:2.2.11")
3737
testImplementation("javax.activation:activation:1.1.1")
38+
testImplementation(project(":instrumentation:hibernate:testing"))
3839

3940
latestDepTestLibrary("org.hibernate:hibernate-core:3.+") // see hibernate-4.0 module
4041
}
@@ -50,11 +51,19 @@ if (findProperty("testLatestDeps") as Boolean) {
5051

5152
tasks {
5253
withType<Test>().configureEach {
53-
// TODO run tests both with and without experimental span attributes
54-
jvmArgs("-Dotel.instrumentation.hibernate.experimental-span-attributes=true")
5554
// required on jdk17
5655
jvmArgs("--add-opens=java.base/java.lang=ALL-UNNAMED")
5756
jvmArgs("-XX:+IgnoreUnrecognizedVMOptions")
57+
58+
systemProperty("collectMetadata", findProperty("collectMetadata")?.toString() ?: "false")
59+
}
60+
61+
val testExperimental by registering(Test::class) {
62+
testClassesDirs = sourceSets.test.get().output.classesDirs
63+
classpath = sourceSets.test.get().runtimeClasspath
64+
65+
jvmArgs("-Dotel.instrumentation.hibernate.experimental-span-attributes=true")
66+
systemProperty("metadataConfig", "otel.instrumentation.hibernate.experimental-span-attributes=true")
5867
}
5968

6069
val testStableSemconv by registering(Test::class) {
@@ -65,6 +74,6 @@ tasks {
6574
}
6675

6776
check {
68-
dependsOn(testStableSemconv)
77+
dependsOn(testStableSemconv, testExperimental)
6978
}
7079
}

instrumentation/hibernate/hibernate-3.3/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/hibernate/v3_3/AbstractHibernateTest.java

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@
88
import static io.opentelemetry.instrumentation.api.internal.SemconvStability.emitStableDatabaseSemconv;
99
import static io.opentelemetry.instrumentation.testing.junit.db.SemconvStabilityUtil.maybeStable;
1010
import static io.opentelemetry.instrumentation.testing.junit.db.SemconvStabilityUtil.maybeStableDbSystemName;
11+
import static io.opentelemetry.javaagent.instrumentation.hibernate.ExperimentalTestHelper.HIBERNATE_SESSION_ID;
12+
import static io.opentelemetry.javaagent.instrumentation.hibernate.ExperimentalTestHelper.experimental;
13+
import static io.opentelemetry.javaagent.instrumentation.hibernate.ExperimentalTestHelper.experimentalSatisfies;
1114
import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo;
1215
import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies;
1316
import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_CONNECTION_STRING;
@@ -17,8 +20,8 @@
1720
import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_STATEMENT;
1821
import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SYSTEM;
1922
import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_USER;
23+
import static org.assertj.core.api.Assertions.assertThat;
2024

21-
import io.opentelemetry.api.common.AttributeKey;
2225
import io.opentelemetry.api.trace.SpanKind;
2326
import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension;
2427
import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension;
@@ -35,7 +38,6 @@
3538
import org.junit.jupiter.api.extension.RegisterExtension;
3639

3740
abstract class AbstractHibernateTest {
38-
3941
@RegisterExtension
4042
protected static final InstrumentationExtension testing = AgentInstrumentationExtension.create();
4143

@@ -66,8 +68,8 @@ static void cleanUp() {
6668
}
6769

6870
@SuppressWarnings("deprecation") // TODO DB_CONNECTION_STRING deprecation
69-
static SpanDataAssert assertClientSpan(SpanDataAssert span, SpanData parent) {
70-
return span.hasKind(SpanKind.CLIENT)
71+
static void assertClientSpan(SpanDataAssert span, SpanData parent) {
72+
span.hasKind(SpanKind.CLIENT)
7173
.hasParent(parent)
7274
.hasAttributesSatisfyingExactly(
7375
equalTo(maybeStable(DB_SYSTEM), maybeStableDbSystemName("h2")),
@@ -80,8 +82,8 @@ static SpanDataAssert assertClientSpan(SpanDataAssert span, SpanData parent) {
8082
}
8183

8284
@SuppressWarnings("deprecation") // TODO DB_CONNECTION_STRING deprecation
83-
static SpanDataAssert assertClientSpan(SpanDataAssert span, SpanData parent, String verb) {
84-
return span.hasName(verb.concat(" db1.Value"))
85+
static void assertClientSpan(SpanDataAssert span, SpanData parent, String verb) {
86+
span.hasName(verb.concat(" db1.Value"))
8587
.hasKind(SpanKind.CLIENT)
8688
.hasParent(parent)
8789
.hasAttributesSatisfyingExactly(
@@ -101,17 +103,15 @@ static SpanDataAssert assertSessionSpan(SpanDataAssert span, SpanData parent, St
101103
.hasKind(SpanKind.INTERNAL)
102104
.hasParent(parent)
103105
.hasAttributesSatisfyingExactly(
104-
satisfies(
105-
AttributeKey.stringKey("hibernate.session_id"),
106-
val -> val.isInstanceOf(String.class)));
106+
experimentalSatisfies(
107+
HIBERNATE_SESSION_ID, val -> assertThat(val).isInstanceOf(String.class)));
107108
}
108109

109-
static SpanDataAssert assertSpanWithSessionId(
110+
static void assertSpanWithSessionId(
110111
SpanDataAssert span, SpanData parent, String spanName, String sessionId) {
111-
return span.hasName(spanName)
112+
span.hasName(spanName)
112113
.hasKind(SpanKind.INTERNAL)
113114
.hasParent(parent)
114-
.hasAttributesSatisfyingExactly(
115-
equalTo(AttributeKey.stringKey("hibernate.session_id"), sessionId));
115+
.hasAttributesSatisfyingExactly(equalTo(HIBERNATE_SESSION_ID, experimental(sessionId)));
116116
}
117117
}

instrumentation/hibernate/hibernate-3.3/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/hibernate/v3_3/CriteriaTest.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@
55

66
package io.opentelemetry.javaagent.instrumentation.hibernate.v3_3;
77

8-
import io.opentelemetry.api.common.AttributeKey;
8+
import static io.opentelemetry.javaagent.instrumentation.hibernate.ExperimentalTestHelper.HIBERNATE_SESSION_ID;
9+
import static io.opentelemetry.javaagent.instrumentation.hibernate.ExperimentalTestHelper.experimental;
10+
911
import io.opentelemetry.api.trace.SpanKind;
1012
import java.util.function.Consumer;
1113
import java.util.stream.Stream;
@@ -55,10 +57,7 @@ void testCriteria(String methodName, Consumer<Criteria> interaction) {
5557
span,
5658
trace.getSpan(0),
5759
"Transaction.commit",
58-
trace
59-
.getSpan(1)
60-
.getAttributes()
61-
.get(AttributeKey.stringKey("hibernate.session_id")))));
60+
experimental(trace.getSpan(1).getAttributes().get(HIBERNATE_SESSION_ID)))));
6261
}
6362

6463
private static Stream<Arguments> provideArguments() {

instrumentation/hibernate/hibernate-3.3/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/hibernate/v3_3/QueryTest.java

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@
55

66
package io.opentelemetry.javaagent.instrumentation.hibernate.v3_3;
77

8+
import static io.opentelemetry.javaagent.instrumentation.hibernate.ExperimentalTestHelper.HIBERNATE_SESSION_ID;
89
import static org.junit.jupiter.api.Named.named;
910

10-
import io.opentelemetry.api.common.AttributeKey;
1111
import io.opentelemetry.api.trace.SpanKind;
1212
import java.util.function.Consumer;
1313
import java.util.stream.Stream;
@@ -58,10 +58,7 @@ void testHibernateQuery(Parameter parameters) {
5858
span,
5959
trace.getSpan(0),
6060
"Transaction.commit",
61-
trace
62-
.getSpan(1)
63-
.getAttributes()
64-
.get(AttributeKey.stringKey("hibernate.session_id"))));
61+
trace.getSpan(1).getAttributes().get(HIBERNATE_SESSION_ID)));
6562
} else {
6663
// Without Transaction
6764
trace.hasSpansSatisfyingExactly(

instrumentation/hibernate/hibernate-3.3/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/hibernate/v3_3/SessionTest.java

Lines changed: 9 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,14 @@
55

66
package io.opentelemetry.javaagent.instrumentation.hibernate.v3_3;
77

8+
import static io.opentelemetry.javaagent.instrumentation.hibernate.ExperimentalTestHelper.HIBERNATE_SESSION_ID;
89
import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo;
910
import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies;
1011
import static io.opentelemetry.semconv.ExceptionAttributes.EXCEPTION_MESSAGE;
1112
import static io.opentelemetry.semconv.ExceptionAttributes.EXCEPTION_STACKTRACE;
1213
import static io.opentelemetry.semconv.ExceptionAttributes.EXCEPTION_TYPE;
1314
import static org.junit.jupiter.api.Named.named;
1415

15-
import io.opentelemetry.api.common.AttributeKey;
1616
import io.opentelemetry.api.trace.SpanKind;
1717
import io.opentelemetry.sdk.testing.assertj.TraceAssert;
1818
import java.util.function.BiConsumer;
@@ -92,10 +92,7 @@ void testHibernateStatelessAction(Parameter parameter) {
9292
span,
9393
trace.getSpan(0),
9494
"Transaction.commit",
95-
trace
96-
.getSpan(1)
97-
.getAttributes()
98-
.get(AttributeKey.stringKey("hibernate.session_id"))),
95+
trace.getSpan(1).getAttributes().get(HIBERNATE_SESSION_ID)),
9996
span -> assertClientSpan(span, trace.getSpan(2))));
10097
}
10198

@@ -127,10 +124,7 @@ void testHibernateReplicate(Parameter parameter) {
127124
span,
128125
trace.getSpan(0),
129126
"Transaction.commit",
130-
trace
131-
.getSpan(1)
132-
.getAttributes()
133-
.get(AttributeKey.stringKey("hibernate.session_id"))),
127+
trace.getSpan(1).getAttributes().get(HIBERNATE_SESSION_ID)),
134128
span -> assertClientSpan(span, trace.getSpan(3))));
135129
}
136130

@@ -172,10 +166,7 @@ void testHibernateFailedReplicate() {
172166
span,
173167
trace.getSpan(0),
174168
"Transaction.commit",
175-
trace
176-
.getSpan(1)
177-
.getAttributes()
178-
.get(AttributeKey.stringKey("hibernate.session_id")))));
169+
trace.getSpan(1).getAttributes().get(HIBERNATE_SESSION_ID))));
179170
}
180171

181172
@ParameterizedTest
@@ -205,10 +196,7 @@ void testHibernateCommitAction(Parameter parameter) {
205196
span,
206197
trace.getSpan(0),
207198
"Transaction.commit",
208-
trace
209-
.getSpan(1)
210-
.getAttributes()
211-
.get(AttributeKey.stringKey("hibernate.session_id"))),
199+
trace.getSpan(1).getAttributes().get(HIBERNATE_SESSION_ID)),
212200
span -> assertClientSpan(span, trace.getSpan(2))));
213201
}
214202

@@ -237,10 +225,7 @@ void testAttachesStateToQueryCreatedViaQueryMethods(Parameter parameter) {
237225
span,
238226
trace.getSpan(0),
239227
"Transaction.commit",
240-
trace
241-
.getSpan(1)
242-
.getAttributes()
243-
.get(AttributeKey.stringKey("hibernate.session_id")))));
228+
trace.getSpan(1).getAttributes().get(HIBERNATE_SESSION_ID))));
244229
}
245230

246231
@Test
@@ -294,19 +279,13 @@ void testHibernateOverlappingSessions() {
294279
span,
295280
trace.getSpan(0),
296281
"Session.delete io.opentelemetry.javaagent.instrumentation.hibernate.v3_3.Value",
297-
trace
298-
.getSpan(1)
299-
.getAttributes()
300-
.get(AttributeKey.stringKey("hibernate.session_id"))),
282+
trace.getSpan(1).getAttributes().get(HIBERNATE_SESSION_ID)),
301283
span ->
302284
assertSpanWithSessionId(
303285
span,
304286
trace.getSpan(0),
305287
"Transaction.commit",
306-
trace
307-
.getSpan(1)
308-
.getAttributes()
309-
.get(AttributeKey.stringKey("hibernate.session_id"))),
288+
trace.getSpan(1).getAttributes().get(HIBERNATE_SESSION_ID)),
310289
span -> assertClientSpan(span, trace.getSpan(5), "INSERT"),
311290
span -> assertClientSpan(span, trace.getSpan(5), "DELETE")));
312291
}
@@ -606,9 +585,6 @@ static void sessionAssertion(TraceAssert trace, String methodName, String resour
606585
span,
607586
trace.getSpan(0),
608587
"Transaction.commit",
609-
trace
610-
.getSpan(1)
611-
.getAttributes()
612-
.get(AttributeKey.stringKey("hibernate.session_id"))));
588+
trace.getSpan(1).getAttributes().get(HIBERNATE_SESSION_ID)));
613589
}
614590
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
description: >
2+
This instrumentation enables the generation of INTERNAL spans for Hibernate operations, including
3+
session methods (e.g., `save`, `update`, `delete`), transaction commits, and query executions.
4+
configurations:
5+
- name: otel.instrumentation.hibernate.experimental-span-attributes
6+
type: boolean
7+
description: Enables the addition of the experimental `hibernate.session_id` span attribute.
8+
default: false

0 commit comments

Comments
 (0)