Skip to content

Commit 0e54363

Browse files
authored
fix: remove connection-id from metrics (googleapis#1763)
* fix: remove connection-id from metrics The OpenTelemetry metrics that were gathered by the JDBC driver also included a unique Connection ID for each connection. This creats too many time series. * chore: run code formatter
1 parent 7b2d639 commit 0e54363

File tree

2 files changed

+65
-15
lines changed

2 files changed

+65
-15
lines changed

src/main/java/com/google/cloud/spanner/jdbc/JdbcConnection.java

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -91,14 +91,14 @@ class JdbcConnection extends AbstractJdbcConnection {
9191

9292
private final Metrics metrics;
9393

94-
private final Attributes openTelemetryAttributes;
94+
private final Attributes openTelemetryMetricsAttributes;
9595

9696
JdbcConnection(String connectionUrl, ConnectionOptions options) throws SQLException {
9797
super(connectionUrl, options);
9898
this.useLegacyIsValidCheck = useLegacyValidCheck();
9999
OpenTelemetry openTelemetry = getSpanner().getOptions().getOpenTelemetry();
100-
this.openTelemetryAttributes =
101-
createOpenTelemetryAttributes(getConnectionOptions().getDatabaseId());
100+
this.openTelemetryMetricsAttributes =
101+
createOpenTelemetryAttributes(getConnectionOptions().getDatabaseId(), false);
102102
this.metrics = new Metrics(openTelemetry);
103103
}
104104

@@ -114,17 +114,21 @@ static boolean useLegacyValidCheck() {
114114
}
115115

116116
@VisibleForTesting
117-
static Attributes createOpenTelemetryAttributes(DatabaseId databaseId) {
117+
static Attributes createOpenTelemetryAttributes(
118+
DatabaseId databaseId, boolean includeConnectionId) {
118119
AttributesBuilder attributesBuilder = Attributes.builder();
119-
attributesBuilder.put("connection_id", UUID.randomUUID().toString());
120+
// A unique connection ID should only be included for tracing and not for metrics.
121+
if (includeConnectionId) {
122+
attributesBuilder.put("connection_id", UUID.randomUUID().toString());
123+
}
120124
attributesBuilder.put("database", databaseId.getDatabase());
121125
attributesBuilder.put("instance_id", databaseId.getInstanceId().getInstance());
122126
attributesBuilder.put("project_id", databaseId.getInstanceId().getProject());
123127
return attributesBuilder.build();
124128
}
125129

126130
public void recordClientLibLatencyMetric(long value) {
127-
metrics.recordClientLibLatency(value, openTelemetryAttributes);
131+
metrics.recordClientLibLatency(value, openTelemetryMetricsAttributes);
128132
}
129133

130134
@Override

src/test/java/com/google/cloud/spanner/jdbc/it/ITOpenTelemetryTest.java

Lines changed: 55 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,14 @@
5151
import java.sql.ResultSet;
5252
import java.sql.SQLException;
5353
import java.sql.Statement;
54+
import java.util.ArrayList;
55+
import java.util.List;
5456
import java.util.Properties;
5557
import java.util.UUID;
58+
import java.util.concurrent.Callable;
59+
import java.util.concurrent.ExecutorService;
60+
import java.util.concurrent.Executors;
61+
import java.util.concurrent.Future;
5662
import java.util.concurrent.ThreadLocalRandom;
5763
import java.util.concurrent.TimeUnit;
5864
import org.junit.AfterClass;
@@ -125,21 +131,21 @@ public void setup() {
125131
}
126132

127133
@Test
128-
public void testGlobalOpenTelemetry() throws SQLException, IOException, InterruptedException {
134+
public void testGlobalOpenTelemetry() throws Exception {
129135
GlobalOpenTelemetry.resetForTest();
130136
GlobalOpenTelemetry.set(openTelemetry);
131137
Properties info = new Properties();
132138
info.put("enableExtendedTracing", "true");
133139
try (Connection connection = createConnection(env, database, info)) {
134140
testOpenTelemetry(connection);
141+
testOpenTelemetryConcurrency(() -> createConnection(env, database, info));
135142
} finally {
136143
GlobalOpenTelemetry.resetForTest();
137144
}
138145
}
139146

140147
@Test
141-
public void testOpenTelemetryInProperties()
142-
throws SQLException, IOException, InterruptedException {
148+
public void testOpenTelemetryInProperties() throws Exception {
143149
// Make sure there is no Global OpenTelemetry.
144150
GlobalOpenTelemetry.resetForTest();
145151
Properties info = new Properties();
@@ -148,6 +154,7 @@ public void testOpenTelemetryInProperties()
148154
try (Connection connection = createConnection(env, database, info)) {
149155
testOpenTelemetry(connection);
150156
}
157+
testOpenTelemetryConcurrency(() -> createConnection(env, database, info));
151158
}
152159

153160
private void testOpenTelemetry(Connection connection)
@@ -159,14 +166,14 @@ private void testOpenTelemetry(Connection connection)
159166

160167
// Test executeQuery(String)
161168
try (ResultSet resultSet = statement.executeQuery(sql)) {
162-
assertQueryResult(resultSet, sql, uuid);
169+
assertQueryResult(resultSet, sql, uuid, true);
163170
}
164171

165172
// Test execute(String)
166173
uuid = UUID.randomUUID();
167174
sql = "select '" + uuid + "'";
168175
assertTrue(statement.execute(sql));
169-
assertQueryResult(statement.getResultSet(), sql, uuid);
176+
assertQueryResult(statement.getResultSet(), sql, uuid, true);
170177

171178
// Test executeUpdate(String)
172179
uuid = UUID.randomUUID();
@@ -189,15 +196,15 @@ private void testOpenTelemetry(Connection connection)
189196
String sql = "select '" + uuid + "'";
190197
try (PreparedStatement statement = connection.prepareStatement(sql)) {
191198
try (ResultSet resultSet = statement.executeQuery()) {
192-
assertQueryResult(resultSet, sql, uuid);
199+
assertQueryResult(resultSet, sql, uuid, true);
193200
}
194201
}
195202

196203
uuid = UUID.randomUUID();
197204
sql = "select '" + uuid + "'";
198205
try (PreparedStatement statement = connection.prepareStatement(sql)) {
199206
assertTrue(statement.execute());
200-
assertQueryResult(statement.getResultSet(), sql, uuid);
207+
assertQueryResult(statement.getResultSet(), sql, uuid, true);
201208
}
202209

203210
uuid = UUID.randomUUID();
@@ -217,14 +224,53 @@ private void testOpenTelemetry(Connection connection)
217224
}
218225
}
219226

220-
private void assertQueryResult(ResultSet resultSet, String sql, UUID uuid)
227+
private interface ConnectionProducer {
228+
Connection createConnection() throws SQLException;
229+
}
230+
231+
private void testOpenTelemetryConcurrency(ConnectionProducer connectionProducer)
232+
throws Exception {
233+
int numThreads = 16;
234+
int numIterations = 1000;
235+
ExecutorService executor = Executors.newFixedThreadPool(16);
236+
List<Future<?>> futures = new ArrayList<>(numThreads);
237+
for (int n = 0; n < numThreads; n++) {
238+
futures.add(
239+
executor.submit(
240+
(Callable<Void>)
241+
() -> {
242+
try (Connection connection = connectionProducer.createConnection();
243+
Statement statement = connection.createStatement()) {
244+
for (int i = 0; i < numIterations; i++) {
245+
UUID uuid = UUID.randomUUID();
246+
String sql = "select '" + uuid + "'";
247+
248+
try (ResultSet resultSet = statement.executeQuery(sql)) {
249+
assertQueryResult(resultSet, sql, uuid, false);
250+
}
251+
}
252+
}
253+
return null;
254+
}));
255+
}
256+
executor.shutdown();
257+
assertTrue(executor.awaitTermination(600L, TimeUnit.SECONDS));
258+
for (Future<?> future : futures) {
259+
// Just verify that we did not get an exception.
260+
future.get();
261+
}
262+
}
263+
264+
private void assertQueryResult(ResultSet resultSet, String sql, UUID uuid, boolean assertTrace)
221265
throws SQLException, IOException, InterruptedException {
222266
assertTrue(resultSet.next());
223267
assertEquals(uuid.toString(), resultSet.getString(1));
224268
assertFalse(resultSet.next());
225269

226270
flushOpenTelemetry();
227-
assertTrace(sql);
271+
if (assertTrace) {
272+
assertTrace(sql);
273+
}
228274
}
229275

230276
private void assertUpdateResult(long updateCount, String sql)

0 commit comments

Comments
 (0)