Skip to content

Commit d739628

Browse files
authored
Return wrapped connection from Statement.getConnection (#10554)
1 parent 205100e commit d739628

File tree

5 files changed

+67
-21
lines changed

5 files changed

+67
-21
lines changed

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

+6-2
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,12 @@ public class OpenTelemetryCallableStatement<S extends CallableStatement>
4949
extends OpenTelemetryPreparedStatement<S> implements CallableStatement {
5050

5151
public OpenTelemetryCallableStatement(
52-
S delegate, DbInfo dbInfo, String query, Instrumenter<DbRequest, Void> instrumenter) {
53-
super(delegate, dbInfo, query, instrumenter);
52+
S delegate,
53+
OpenTelemetryConnection connection,
54+
DbInfo dbInfo,
55+
String query,
56+
Instrumenter<DbRequest, Void> instrumenter) {
57+
super(delegate, connection, dbInfo, query, instrumenter);
5458
}
5559

5660
@Override

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

+21-12
Original file line numberDiff line numberDiff line change
@@ -61,36 +61,38 @@ public OpenTelemetryConnection(
6161
@Override
6262
public Statement createStatement() throws SQLException {
6363
Statement statement = delegate.createStatement();
64-
return new OpenTelemetryStatement<>(statement, dbInfo, statementInstrumenter);
64+
return new OpenTelemetryStatement<>(statement, this, dbInfo, statementInstrumenter);
6565
}
6666

6767
@Override
6868
public Statement createStatement(int resultSetType, int resultSetConcurrency)
6969
throws SQLException {
7070
Statement statement = delegate.createStatement(resultSetType, resultSetConcurrency);
71-
return new OpenTelemetryStatement<>(statement, dbInfo, statementInstrumenter);
71+
return new OpenTelemetryStatement<>(statement, this, dbInfo, statementInstrumenter);
7272
}
7373

7474
@Override
7575
public Statement createStatement(
7676
int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException {
7777
Statement statement =
7878
delegate.createStatement(resultSetType, resultSetConcurrency, resultSetHoldability);
79-
return new OpenTelemetryStatement<>(statement, dbInfo, statementInstrumenter);
79+
return new OpenTelemetryStatement<>(statement, this, dbInfo, statementInstrumenter);
8080
}
8181

8282
@Override
8383
public PreparedStatement prepareStatement(String sql) throws SQLException {
8484
PreparedStatement statement = delegate.prepareStatement(sql);
85-
return new OpenTelemetryPreparedStatement<>(statement, dbInfo, sql, statementInstrumenter);
85+
return new OpenTelemetryPreparedStatement<>(
86+
statement, this, dbInfo, sql, statementInstrumenter);
8687
}
8788

8889
@Override
8990
public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency)
9091
throws SQLException {
9192
PreparedStatement statement =
9293
delegate.prepareStatement(sql, resultSetType, resultSetConcurrency);
93-
return new OpenTelemetryPreparedStatement<>(statement, dbInfo, sql, statementInstrumenter);
94+
return new OpenTelemetryPreparedStatement<>(
95+
statement, this, dbInfo, sql, statementInstrumenter);
9496
}
9597

9698
@Override
@@ -99,38 +101,44 @@ public PreparedStatement prepareStatement(
99101
throws SQLException {
100102
PreparedStatement statement =
101103
delegate.prepareStatement(sql, resultSetType, resultSetConcurrency, resultSetHoldability);
102-
return new OpenTelemetryPreparedStatement<>(statement, dbInfo, sql, statementInstrumenter);
104+
return new OpenTelemetryPreparedStatement<>(
105+
statement, this, dbInfo, sql, statementInstrumenter);
103106
}
104107

105108
@Override
106109
public PreparedStatement prepareStatement(String sql, int autoGeneratedKeys) throws SQLException {
107110
PreparedStatement statement = delegate.prepareStatement(sql, autoGeneratedKeys);
108-
return new OpenTelemetryPreparedStatement<>(statement, dbInfo, sql, statementInstrumenter);
111+
return new OpenTelemetryPreparedStatement<>(
112+
statement, this, dbInfo, sql, statementInstrumenter);
109113
}
110114

111115
@Override
112116
public PreparedStatement prepareStatement(String sql, int[] columnIndexes) throws SQLException {
113117
PreparedStatement statement = delegate.prepareStatement(sql, columnIndexes);
114-
return new OpenTelemetryPreparedStatement<>(statement, dbInfo, sql, statementInstrumenter);
118+
return new OpenTelemetryPreparedStatement<>(
119+
statement, this, dbInfo, sql, statementInstrumenter);
115120
}
116121

117122
@Override
118123
public PreparedStatement prepareStatement(String sql, String[] columnNames) throws SQLException {
119124
PreparedStatement statement = delegate.prepareStatement(sql, columnNames);
120-
return new OpenTelemetryPreparedStatement<>(statement, dbInfo, sql, statementInstrumenter);
125+
return new OpenTelemetryPreparedStatement<>(
126+
statement, this, dbInfo, sql, statementInstrumenter);
121127
}
122128

123129
@Override
124130
public CallableStatement prepareCall(String sql) throws SQLException {
125131
CallableStatement statement = delegate.prepareCall(sql);
126-
return new OpenTelemetryCallableStatement<>(statement, dbInfo, sql, statementInstrumenter);
132+
return new OpenTelemetryCallableStatement<>(
133+
statement, this, dbInfo, sql, statementInstrumenter);
127134
}
128135

129136
@Override
130137
public CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency)
131138
throws SQLException {
132139
CallableStatement statement = delegate.prepareCall(sql, resultSetType, resultSetConcurrency);
133-
return new OpenTelemetryCallableStatement<>(statement, dbInfo, sql, statementInstrumenter);
140+
return new OpenTelemetryCallableStatement<>(
141+
statement, this, dbInfo, sql, statementInstrumenter);
134142
}
135143

136144
@Override
@@ -139,7 +147,8 @@ public CallableStatement prepareCall(
139147
throws SQLException {
140148
CallableStatement statement =
141149
delegate.prepareCall(sql, resultSetType, resultSetConcurrency, resultSetHoldability);
142-
return new OpenTelemetryCallableStatement<>(statement, dbInfo, sql, statementInstrumenter);
150+
return new OpenTelemetryCallableStatement<>(
151+
statement, this, dbInfo, sql, statementInstrumenter);
143152
}
144153

145154
@Override

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

+6-2
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,12 @@ public class OpenTelemetryPreparedStatement<S extends PreparedStatement>
5151
extends OpenTelemetryStatement<S> implements PreparedStatement {
5252

5353
public OpenTelemetryPreparedStatement(
54-
S delegate, DbInfo dbInfo, String query, Instrumenter<DbRequest, Void> instrumenter) {
55-
super(delegate, dbInfo, query, instrumenter);
54+
S delegate,
55+
OpenTelemetryConnection connection,
56+
DbInfo dbInfo,
57+
String query,
58+
Instrumenter<DbRequest, Void> instrumenter) {
59+
super(delegate, connection, dbInfo, query, instrumenter);
5660
}
5761

5862
@Override

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

+15-5
Original file line numberDiff line numberDiff line change
@@ -38,19 +38,29 @@
3838
public class OpenTelemetryStatement<S extends Statement> implements Statement {
3939

4040
protected final S delegate;
41+
protected final OpenTelemetryConnection connection;
4142
protected final DbInfo dbInfo;
4243
protected final String query;
4344
protected final Instrumenter<DbRequest, Void> instrumenter;
4445

4546
private final ArrayList<String> batchCommands = new ArrayList<>();
4647

47-
OpenTelemetryStatement(S delegate, DbInfo dbInfo, Instrumenter<DbRequest, Void> instrumenter) {
48-
this(delegate, dbInfo, null, instrumenter);
48+
OpenTelemetryStatement(
49+
S delegate,
50+
OpenTelemetryConnection connection,
51+
DbInfo dbInfo,
52+
Instrumenter<DbRequest, Void> instrumenter) {
53+
this(delegate, connection, dbInfo, null, instrumenter);
4954
}
5055

5156
OpenTelemetryStatement(
52-
S delegate, DbInfo dbInfo, String query, Instrumenter<DbRequest, Void> instrumenter) {
57+
S delegate,
58+
OpenTelemetryConnection connection,
59+
DbInfo dbInfo,
60+
String query,
61+
Instrumenter<DbRequest, Void> instrumenter) {
5362
this.delegate = delegate;
63+
this.connection = connection;
5464
this.dbInfo = dbInfo;
5565
this.query = query;
5666
this.instrumenter = instrumenter;
@@ -230,8 +240,8 @@ public void clearBatch() throws SQLException {
230240
}
231241

232242
@Override
233-
public Connection getConnection() throws SQLException {
234-
return delegate.getConnection();
243+
public Connection getConnection() {
244+
return connection;
235245
}
236246

237247
@Override

instrumentation/jdbc/library/src/test/java/io/opentelemetry/instrumentation/jdbc/datasource/JdbcTelemetryTest.java

+19
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,17 @@
66
package io.opentelemetry.instrumentation.jdbc.datasource;
77

88
import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo;
9+
import static org.assertj.core.api.Assertions.assertThat;
910

11+
import io.opentelemetry.instrumentation.jdbc.internal.OpenTelemetryConnection;
1012
import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension;
1113
import io.opentelemetry.instrumentation.testing.junit.LibraryInstrumentationExtension;
1214
import io.opentelemetry.semconv.SemanticAttributes;
15+
import java.sql.CallableStatement;
16+
import java.sql.Connection;
17+
import java.sql.PreparedStatement;
1318
import java.sql.SQLException;
19+
import java.sql.Statement;
1420
import javax.sql.DataSource;
1521
import org.junit.jupiter.api.Test;
1622
import org.junit.jupiter.api.extension.RegisterExtension;
@@ -113,4 +119,17 @@ void buildWithSanitizationDisabled() throws SQLException {
113119
span.hasName("SELECT dbname")
114120
.hasAttribute(equalTo(SemanticAttributes.DB_STATEMENT, "SELECT 1;"))));
115121
}
122+
123+
@Test
124+
void statementReturnsWrappedConnection() throws SQLException {
125+
JdbcTelemetry telemetry = JdbcTelemetry.builder(testing.getOpenTelemetry()).build();
126+
DataSource dataSource = telemetry.wrap(new TestDataSource());
127+
Connection connection = dataSource.getConnection();
128+
Statement statement = connection.createStatement();
129+
assertThat(statement.getConnection()).isInstanceOf(OpenTelemetryConnection.class);
130+
PreparedStatement preparedStatement = connection.prepareStatement("SELECT 1");
131+
assertThat(preparedStatement.getConnection()).isInstanceOf(OpenTelemetryConnection.class);
132+
CallableStatement callableStatement = connection.prepareCall("SELECT 1");
133+
assertThat(callableStatement.getConnection()).isInstanceOf(OpenTelemetryConnection.class);
134+
}
116135
}

0 commit comments

Comments
 (0)