Skip to content

Commit cbbdfdf

Browse files
committed
renames
1 parent 2aa9083 commit cbbdfdf

File tree

17 files changed

+212
-30
lines changed

17 files changed

+212
-30
lines changed

instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/DbClientSpanNameExtractor.java

Lines changed: 78 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,70 @@ protected String computeSpanName(
7272
return name.toString();
7373
}
7474

75+
/**
76+
* Computes the span name following stable semconv fallback order.
77+
*
78+
* <p>Fallback order:
79+
*
80+
* <ol>
81+
* <li>{db.query.summary} if available
82+
* <li>{db.operation.name} {target} if operation is available
83+
* <li>{target} if only target is available
84+
* <li>{db.system.name} if nothing else is available
85+
* </ol>
86+
*
87+
* <p>Target fallback order: collection_name → stored_procedure_name → namespace →
88+
* server.address:server.port
89+
*/
90+
protected String computeSpanNameStable(
91+
DbClientAttributesGetter<REQUEST, ?> getter,
92+
REQUEST request,
93+
@Nullable String operation,
94+
@Nullable String collectionName,
95+
@Nullable String storedProcedureName) {
96+
// Determine target following fallback order: collection → stored_procedure → namespace →
97+
// server:port
98+
String target = collectionName;
99+
if (target == null) {
100+
target = storedProcedureName;
101+
}
102+
if (target == null) {
103+
target = getter.getDbNamespace(request);
104+
}
105+
if (target == null) {
106+
String serverAddress = getter.getServerAddress(request);
107+
if (serverAddress != null) {
108+
Integer serverPort = getter.getServerPort(request);
109+
if (serverPort != null) {
110+
target = serverAddress + ":" + serverPort;
111+
} else {
112+
target = serverAddress;
113+
}
114+
}
115+
}
116+
117+
// Build span name
118+
if (operation != null) {
119+
if (target != null) {
120+
return operation + " " + target;
121+
}
122+
return operation;
123+
}
124+
125+
// No operation - use target alone
126+
if (target != null) {
127+
return target;
128+
}
129+
130+
// Final fallback to db.system.name
131+
String dbSystem = getter.getDbSystem(request);
132+
if (dbSystem != null) {
133+
return dbSystem;
134+
}
135+
136+
return DEFAULT_SPAN_NAME;
137+
}
138+
75139
private static final class GenericDbClientSpanNameExtractor<REQUEST>
76140
extends DbClientSpanNameExtractor<REQUEST> {
77141

@@ -85,6 +149,9 @@ private GenericDbClientSpanNameExtractor(DbClientAttributesGetter<REQUEST, ?> ge
85149
public String extract(REQUEST request) {
86150
String namespace = getter.getDbNamespace(request);
87151
String operationName = getter.getDbOperationName(request);
152+
if (SemconvStability.emitStableDatabaseSemconv()) {
153+
return computeSpanNameStable(getter, request, operationName, null, null);
154+
}
88155
return computeSpanName(namespace, operationName, null, null);
89156
}
90157
}
@@ -104,6 +171,9 @@ public String extract(REQUEST request) {
104171
Collection<String> rawQueryTexts = getter.getRawQueryTexts(request);
105172

106173
if (rawQueryTexts.isEmpty()) {
174+
if (SemconvStability.emitStableDatabaseSemconv()) {
175+
return computeSpanNameStable(getter, request, null, null, null);
176+
}
107177
return computeSpanName(namespace, null, null, null);
108178
}
109179

@@ -131,26 +201,27 @@ public String extract(REQUEST request) {
131201
}
132202
return querySummary;
133203
}
134-
// Fall back to old behavior if no query summary
204+
// Fall back to stable semconv span naming
135205
String operation = sanitizedStatement.getOperationName();
136206
if (isBatch(request)) {
137-
operation = "BATCH " + operation;
207+
operation = operation != null ? "BATCH " + operation : "BATCH";
138208
}
139-
return computeSpanName(
140-
namespace,
209+
return computeSpanNameStable(
210+
getter,
211+
request,
141212
operation,
142213
sanitizedStatement.getCollectionName(),
143214
sanitizedStatement.getStoredProcedureName());
144215
}
145216

146217
MultiQuery multiQuery = MultiQuery.analyze(rawQueryTexts, false);
147218
String querySummary = multiQuery.getQuerySummary();
148-
// Fall back to old behavior if query summary equals operation (no common table)
219+
// Fall back to stable semconv span naming if query summary equals operation (no common table)
149220
if (!querySummary.equals(multiQuery.getOperationName())) {
150221
return querySummary;
151222
}
152-
return computeSpanName(
153-
namespace, multiQuery.getOperationName(), multiQuery.getCollectionName(), null);
223+
return computeSpanNameStable(
224+
getter, request, multiQuery.getOperationName(), multiQuery.getCollectionName(), null);
154225
}
155226

156227
private boolean isBatch(REQUEST request) {

instrumentation-api-incubator/src/test/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/DbClientSpanNameExtractorTest.java

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,5 +184,104 @@ void shouldExtractFullSpanNameForSingleQueryBatch() {
184184
spanName);
185185
}
186186

187+
@Test
188+
void shouldFallBackToServerAddressAndPort() {
189+
// given
190+
DbRequest dbRequest = new DbRequest();
191+
192+
if (SemconvStability.emitStableDatabaseSemconv()) {
193+
when(dbAttributesGetter.getServerAddress(dbRequest)).thenReturn("localhost");
194+
when(dbAttributesGetter.getServerPort(dbRequest)).thenReturn(5432);
195+
} else {
196+
// Old semconv does not use server address/port for span names
197+
}
198+
199+
SpanNameExtractor<DbRequest> underTest = DbClientSpanNameExtractor.create(dbAttributesGetter);
200+
201+
// when
202+
String spanName = underTest.extract(dbRequest);
203+
204+
// then
205+
assertEquals(
206+
SemconvStability.emitStableDatabaseSemconv() ? "localhost:5432" : "DB Query", spanName);
207+
}
208+
209+
@Test
210+
void shouldFallBackToServerAddressWithoutPort() {
211+
// given
212+
DbRequest dbRequest = new DbRequest();
213+
214+
if (SemconvStability.emitStableDatabaseSemconv()) {
215+
when(dbAttributesGetter.getServerAddress(dbRequest)).thenReturn("localhost");
216+
when(dbAttributesGetter.getServerPort(dbRequest)).thenReturn(null);
217+
}
218+
219+
SpanNameExtractor<DbRequest> underTest = DbClientSpanNameExtractor.create(dbAttributesGetter);
220+
221+
// when
222+
String spanName = underTest.extract(dbRequest);
223+
224+
// then
225+
assertEquals(SemconvStability.emitStableDatabaseSemconv() ? "localhost" : "DB Query", spanName);
226+
}
227+
228+
@Test
229+
void shouldFallBackToDbSystemName() {
230+
// given
231+
DbRequest dbRequest = new DbRequest();
232+
233+
if (SemconvStability.emitStableDatabaseSemconv()) {
234+
when(dbAttributesGetter.getDbSystem(dbRequest)).thenReturn("postgresql");
235+
}
236+
237+
SpanNameExtractor<DbRequest> underTest = DbClientSpanNameExtractor.create(dbAttributesGetter);
238+
239+
// when
240+
String spanName = underTest.extract(dbRequest);
241+
242+
// then
243+
assertEquals(
244+
SemconvStability.emitStableDatabaseSemconv() ? "postgresql" : "DB Query", spanName);
245+
}
246+
247+
@Test
248+
void shouldUseOperationWithServerAddressFallback() {
249+
// given
250+
DbRequest dbRequest = new DbRequest();
251+
252+
when(dbAttributesGetter.getDbOperationName(dbRequest)).thenReturn("PING");
253+
if (SemconvStability.emitStableDatabaseSemconv()) {
254+
when(dbAttributesGetter.getServerAddress(dbRequest)).thenReturn("localhost");
255+
when(dbAttributesGetter.getServerPort(dbRequest)).thenReturn(6379);
256+
}
257+
258+
SpanNameExtractor<DbRequest> underTest = DbClientSpanNameExtractor.create(dbAttributesGetter);
259+
260+
// when
261+
String spanName = underTest.extract(dbRequest);
262+
263+
// then
264+
assertEquals(
265+
SemconvStability.emitStableDatabaseSemconv() ? "PING localhost:6379" : "PING", spanName);
266+
}
267+
268+
@Test
269+
void shouldPreferNamespaceOverServerAddress() {
270+
// given
271+
DbRequest dbRequest = new DbRequest();
272+
273+
when(dbAttributesGetter.getDbNamespace(dbRequest)).thenReturn("mydb");
274+
// Note: not stubbing serverAddress/serverPort because namespace takes priority,
275+
// and the stubs would be unnecessary
276+
277+
SpanNameExtractor<DbRequest> underTest = DbClientSpanNameExtractor.create(dbAttributesGetter);
278+
279+
// when
280+
String spanName = underTest.extract(dbRequest);
281+
282+
// then
283+
assertEquals("mydb", spanName);
284+
}
285+
187286
static class DbRequest {}
188287
}

instrumentation/hibernate/hibernate-3.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/hibernate/v3_3/CriteriaInstrumentation.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ public static HibernateOperationScope startMethod(
6767

6868
Context parentContext = Java8BytecodeBridge.currentContext();
6969
HibernateOperation hibernateOperation =
70-
new HibernateOperation("Criteria." + name, entityName, sessionInfo);
70+
HibernateOperation.fromOperationName("Criteria." + name, entityName, sessionInfo);
7171

7272
return HibernateOperationScope.start(hibernateOperation, parentContext, instrumenter());
7373
}

instrumentation/hibernate/hibernate-3.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/hibernate/v3_3/QueryInstrumentation.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,8 @@ public static HibernateOperationScope startMethod(@Advice.This Query query) {
6161

6262
Context parentContext = Java8BytecodeBridge.currentContext();
6363
HibernateOperation hibernateOperation =
64-
new HibernateOperation(getSpanNameForQuery(query.getQueryString()), sessionInfo);
64+
HibernateOperation.fromSpanName(
65+
getSpanNameForQuery(query.getQueryString()), sessionInfo);
6566

6667
return HibernateOperationScope.start(hibernateOperation, parentContext, instrumenter());
6768
}

instrumentation/hibernate/hibernate-3.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/hibernate/v3_3/SessionInstrumentation.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,8 @@ public static HibernateOperationScope startMethod(
107107
String entityName =
108108
getEntityName(descriptor, arg0, arg1, EntityNameUtil.bestGuessEntityName(session));
109109
HibernateOperation hibernateOperation =
110-
new HibernateOperation(getSessionMethodOperationName(name), entityName, sessionInfo);
110+
HibernateOperation.fromOperationName(
111+
getSessionMethodOperationName(name), entityName, sessionInfo);
111112

112113
return HibernateOperationScope.start(hibernateOperation, parentContext, instrumenter());
113114
}

instrumentation/hibernate/hibernate-3.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/hibernate/v3_3/TransactionInstrumentation.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ public static HibernateOperationScope startCommit(@Advice.This Transaction trans
6060

6161
Context parentContext = Java8BytecodeBridge.currentContext();
6262
HibernateOperation hibernateOperation =
63-
new HibernateOperation("Transaction.commit", sessionInfo);
63+
HibernateOperation.fromSpanName("Transaction.commit", sessionInfo);
6464

6565
return HibernateOperationScope.start(hibernateOperation, parentContext, instrumenter());
6666
}

instrumentation/hibernate/hibernate-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/hibernate/v4_0/CriteriaInstrumentation.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ public static HibernateOperationScope startMethod(
6767

6868
Context parentContext = Java8BytecodeBridge.currentContext();
6969
HibernateOperation hibernateOperation =
70-
new HibernateOperation("Criteria." + name, entityName, sessionInfo);
70+
HibernateOperation.fromOperationName("Criteria." + name, entityName, sessionInfo);
7171

7272
return HibernateOperationScope.start(hibernateOperation, parentContext, instrumenter());
7373
}

instrumentation/hibernate/hibernate-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/hibernate/v4_0/QueryInstrumentation.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,8 @@ public static HibernateOperationScope startMethod(@Advice.This Query query) {
6161

6262
Context parentContext = Java8BytecodeBridge.currentContext();
6363
HibernateOperation hibernateOperation =
64-
new HibernateOperation(getSpanNameForQuery(query.getQueryString()), sessionInfo);
64+
HibernateOperation.fromSpanName(
65+
getSpanNameForQuery(query.getQueryString()), sessionInfo);
6566

6667
return HibernateOperationScope.start(hibernateOperation, parentContext, instrumenter());
6768
}

instrumentation/hibernate/hibernate-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/hibernate/v4_0/SessionInstrumentation.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,8 @@ public static HibernateOperationScope startMethod(
114114
String entityName =
115115
getEntityName(descriptor, arg0, arg1, EntityNameUtil.bestGuessEntityName(session));
116116
HibernateOperation hibernateOperation =
117-
new HibernateOperation(getSessionMethodOperationName(name), entityName, sessionInfo);
117+
HibernateOperation.fromOperationName(
118+
getSessionMethodOperationName(name), entityName, sessionInfo);
118119

119120
return HibernateOperationScope.start(hibernateOperation, parentContext, instrumenter());
120121
}

instrumentation/hibernate/hibernate-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/hibernate/v4_0/TransactionInstrumentation.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ public static HibernateOperationScope startCommit(@Advice.This Transaction trans
6060

6161
Context parentContext = Java8BytecodeBridge.currentContext();
6262
HibernateOperation hibernateOperation =
63-
new HibernateOperation("Transaction.commit", sessionInfo);
63+
HibernateOperation.fromSpanName("Transaction.commit", sessionInfo);
6464

6565
return HibernateOperationScope.start(hibernateOperation, parentContext, instrumenter());
6666
}

0 commit comments

Comments
 (0)