Skip to content

Commit 2449224

Browse files
authored
Don't wrap null ResultSet in jdbc library instrumentation (#13758)
1 parent 2ae5553 commit 2449224

File tree

10 files changed

+881
-24
lines changed

10 files changed

+881
-24
lines changed

instrumentation/jdbc/library/src/main/java/io/opentelemetry/instrumentation/jdbc/internal/OpenTelemetryPreparedStatement.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ public OpenTelemetryPreparedStatement(
5959

6060
@Override
6161
public ResultSet executeQuery() throws SQLException {
62-
return new OpenTelemetryResultSet(wrapCall(query, delegate::executeQuery), this);
62+
return OpenTelemetryResultSet.wrap(wrapCall(query, delegate::executeQuery), this);
6363
}
6464

6565
@Override

instrumentation/jdbc/library/src/main/java/io/opentelemetry/instrumentation/jdbc/internal/OpenTelemetryResultSet.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,18 @@ class OpenTelemetryResultSet implements ResultSet {
3434
private final ResultSet delegate;
3535
private final Statement statement;
3636

37-
OpenTelemetryResultSet(ResultSet delegate, Statement statement) {
37+
private OpenTelemetryResultSet(ResultSet delegate, Statement statement) {
3838
this.delegate = delegate;
3939
this.statement = statement;
4040
}
4141

42+
public static ResultSet wrap(ResultSet delegate, Statement statement) {
43+
if (delegate == null) {
44+
return null;
45+
}
46+
return new OpenTelemetryResultSet(delegate, statement);
47+
}
48+
4249
@Override
4350
public boolean next() throws SQLException {
4451
return delegate.next();

instrumentation/jdbc/library/src/main/java/io/opentelemetry/instrumentation/jdbc/internal/OpenTelemetryStatement.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ public void setCursorName(String name) throws SQLException {
176176

177177
@Override
178178
public ResultSet getResultSet() throws SQLException {
179-
return new OpenTelemetryResultSet(delegate.getResultSet(), this);
179+
return OpenTelemetryResultSet.wrap(delegate.getResultSet(), this);
180180
}
181181

182182
@Override
@@ -246,7 +246,7 @@ public Connection getConnection() {
246246

247247
@Override
248248
public ResultSet getGeneratedKeys() throws SQLException {
249-
return new OpenTelemetryResultSet(delegate.getGeneratedKeys(), this);
249+
return OpenTelemetryResultSet.wrap(delegate.getGeneratedKeys(), this);
250250
}
251251

252252
@Override

instrumentation/jdbc/library/src/test/java/io/opentelemetry/instrumentation/jdbc/internal/OpenTelemetryConnectionTest.java

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,29 @@ void testVerifyPrepareStatement() throws SQLException {
105105
connection.close();
106106
}
107107

108+
@Test
109+
void testVerifyPrepareStatementUpdate() throws SQLException {
110+
Instrumenter<DbRequest, Void> instrumenter =
111+
createStatementInstrumenter(testing.getOpenTelemetry());
112+
DbInfo dbInfo = getDbInfo();
113+
OpenTelemetryConnection connection =
114+
new OpenTelemetryConnection(new TestConnection(), dbInfo, instrumenter);
115+
String query = "UPDATE users SET name = name";
116+
PreparedStatement statement = connection.prepareStatement(query);
117+
118+
testing.runWithSpan(
119+
"parent",
120+
() -> {
121+
statement.executeUpdate();
122+
assertThat(statement.getResultSet()).isNull();
123+
});
124+
125+
jdbcTraceAssertion(dbInfo, query, "UPDATE");
126+
127+
statement.close();
128+
connection.close();
129+
}
130+
108131
@Test
109132
void testVerifyPrepareStatementQuery() throws SQLException {
110133
Instrumenter<DbRequest, Void> instrumenter =
@@ -214,14 +237,18 @@ private static DbInfo getDbInfo() {
214237
.build();
215238
}
216239

217-
@SuppressWarnings("deprecation") // old semconv
218240
private static void jdbcTraceAssertion(DbInfo dbInfo, String query) {
241+
jdbcTraceAssertion(dbInfo, query, "SELECT");
242+
}
243+
244+
@SuppressWarnings("deprecation") // old semconv
245+
private static void jdbcTraceAssertion(DbInfo dbInfo, String query, String operation) {
219246
testing.waitAndAssertTraces(
220247
trace ->
221248
trace.hasSpansSatisfyingExactly(
222249
span -> span.hasName("parent").hasKind(SpanKind.INTERNAL).hasNoParent(),
223250
span ->
224-
span.hasName("SELECT my_name.users")
251+
span.hasName(operation + " my_name.users")
225252
.hasKind(SpanKind.CLIENT)
226253
.hasParent(trace.getSpan(0))
227254
.hasAttributesSatisfyingExactly(
@@ -234,7 +261,7 @@ private static void jdbcTraceAssertion(DbInfo dbInfo, String query) {
234261
DB_CONNECTION_STRING,
235262
emitStableDatabaseSemconv() ? null : dbInfo.getShortUrl()),
236263
equalTo(maybeStable(DB_STATEMENT), query),
237-
equalTo(maybeStable(DB_OPERATION), "SELECT"),
264+
equalTo(maybeStable(DB_OPERATION), operation),
238265
equalTo(maybeStable(DB_SQL_TABLE), "users"),
239266
equalTo(SERVER_ADDRESS, dbInfo.getHost()),
240267
equalTo(SERVER_PORT, dbInfo.getPort()))));

instrumentation/jdbc/testing/src/main/java/io/opentelemetry/instrumentation/jdbc/TestCallableStatement.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import java.sql.Blob;
1414
import java.sql.CallableStatement;
1515
import java.sql.Clob;
16+
import java.sql.Connection;
1617
import java.sql.Date;
1718
import java.sql.NClob;
1819
import java.sql.Ref;
@@ -25,6 +26,10 @@
2526
import java.util.Map;
2627

2728
class TestCallableStatement extends TestPreparedStatement implements CallableStatement {
29+
TestCallableStatement(Connection connection) {
30+
super(connection);
31+
}
32+
2833
@Override
2934
public Array getArray(int parameterIndex) throws SQLException {
3035
return null;

instrumentation/jdbc/testing/src/main/java/io/opentelemetry/instrumentation/jdbc/TestConnection.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -183,20 +183,20 @@ public String nativeSQL(String sql) throws SQLException {
183183

184184
@Override
185185
public CallableStatement prepareCall(String sql) throws SQLException {
186-
return new TestCallableStatement();
186+
return new TestCallableStatement(this);
187187
}
188188

189189
@Override
190190
public CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency)
191191
throws SQLException {
192-
return new TestCallableStatement();
192+
return new TestCallableStatement(this);
193193
}
194194

195195
@Override
196196
public CallableStatement prepareCall(
197197
String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability)
198198
throws SQLException {
199-
return new TestCallableStatement();
199+
return new TestCallableStatement(this);
200200
}
201201

202202
@Override

instrumentation/jdbc/testing/src/main/java/io/opentelemetry/instrumentation/jdbc/TestDatabaseMetaData.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
import java.sql.SQLException;
1313

1414
class TestDatabaseMetaData implements DatabaseMetaData {
15-
final String url;
15+
private final String url;
1616

1717
TestDatabaseMetaData() {
1818
this("jdbc:postgresql://127.0.0.1:5432/dbname");

instrumentation/jdbc/testing/src/main/java/io/opentelemetry/instrumentation/jdbc/TestPreparedStatement.java

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,15 +28,17 @@
2828
import java.util.Calendar;
2929

3030
class TestPreparedStatement extends TestStatement implements PreparedStatement {
31-
32-
TestPreparedStatement() {
33-
super();
34-
}
31+
private boolean hasResultSet = true;
3532

3633
TestPreparedStatement(Connection connection) {
3734
super(connection);
3835
}
3936

37+
@Override
38+
protected boolean hasResultSet() {
39+
return hasResultSet;
40+
}
41+
4042
@Override
4143
public void addBatch() throws SQLException {}
4244

@@ -50,11 +52,12 @@ public boolean execute() throws SQLException {
5052

5153
@Override
5254
public ResultSet executeQuery() throws SQLException {
53-
return null;
55+
return new TestResultSet(this);
5456
}
5557

5658
@Override
5759
public int executeUpdate() throws SQLException {
60+
hasResultSet = false;
5861
return 0;
5962
}
6063

0 commit comments

Comments
 (0)