Skip to content

Commit 1485a04

Browse files
feat: add OpenTelemetry tracing (#1568)
* feat: add OpenTelemetry tracing * chore: add copyright headers * chore: add deps + reset tracing for test * fix: ClassCastException in Spring Data JDBC sample * docs: add sample for OpenTelemetry * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md * docs: update sample for OpenTelemetry * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md * test: check for credentials before setting up tracing * chore: cleanup * chore: add enable flag for otel to sample app * chore: add clirr diff * fix: add tracing prefix + more samples * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md * chore: remove whitespace * docs: update sample to use non-snapshot versions * docs: update sample + add debugging guide * chore: cleanup * chore: actually use properties in example * docs: add link to tag sample * docs: improve documentation based on review comments * docs: clearify the names of the Spanner generated traces --------- Co-authored-by: Owl Bot <gcf-owl-bot[bot]@users.noreply.github.com>
1 parent 7191f0a commit 1485a04

27 files changed

+1267
-74
lines changed

.readme-partials.yaml

Lines changed: 85 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ custom_content: |
2626
2727
### Connection URL Properties
2828
29-
The Cloud Spanner JDBC driver supports the following connection URL properties. Note that all of
29+
The Spanner JDBC driver supports the following connection URL properties. Note that all of
3030
these can also be supplied in a Properties instance that is passed to the
3131
`DriverManager#getConnection(String url, Properties properties)` method.
3232
@@ -37,6 +37,8 @@ custom_content: |
3737
- autoConfigEmulator (boolean): Automatically configure the connection to try to connect to the Cloud Spanner emulator. You do not need to specify any host or port in the connection string as long as the emulator is running on the default host/port (localhost:9010). The instance and database in the connection string will automatically be created if these do not yet exist on the emulator. This means that you do not need to execute any `gcloud` commands on the emulator to create the instance and database before you can connect to it. Example: `jdbc:cloudspanner:/projects/test-project/instances/test-instance/databases/test-db;autoConfigEmulator=true`
3838
- usePlainText (boolean): Sets whether the JDBC connection should establish an unencrypted connection to a (local) server. This option can only be used when connecting to a local emulator that does not require an encrypted connection, and that does not require authentication. Example: `jdbc:cloudspanner://localhost:9010/projects/test-project/instances/test-instance/databases/test-db;usePlainText=true`
3939
- optimizerVersion (String): Sets the default query optimizer version to use for this connection. See also https://cloud.google.com/spanner/docs/query-optimizer/query-optimizer-versions.
40+
- enableExtendedTracing (boolean): Enables extended OpenTelemetry tracing of queries that are executed by a JDBC connection. When enabled, the SQL string of the query that is executed is added as a property to the trace.
41+
- enableApiTracing (boolean): Enables API OpenTelemetry tracing of all RPCs that are executed by the JDBC driver. When enabled, a trace will be created for each RPC invocation that is executed by the JDBC driver. Enable this to investigate latency problems and/or RPCs that are being retried.
4042
4143
#### Advanced Properties
4244
- minSessions (int): Sets the minimum number of sessions in the backing session pool. Defaults to 100.
@@ -46,6 +48,88 @@ custom_content: |
4648
- oauthToken (string): A valid pre-existing OAuth token to use for authentication for this connection. Setting this property will take precedence over any value set for a credentials file.
4749
- lenient (boolean): Enable this to force the JDBC driver to ignore unknown properties in the connection URL. Some applications automatically add additional properties to the URL that are not recognized by the JDBC driver. Normally, the JDBC driver will reject this, unless `lenient` mode is enabled.
4850
51+
### OpenTelemetry Tracing
52+
The Spanner JDBC driver supports OpenTelemetry tracing. You can configure the OpenTelemetry instance
53+
that should be used in two ways:
54+
1. Register a global OpenTelemetry instance. This instance will automatically be picked up by the Spanner JDBC driver.
55+
2. Add an OpenTelemetry instance with the key `openTelemetry` to the `java.util.Properties` instance that is used to create the JDBC connection.
56+
57+
By default, the traces that are generated by the Spanner JDBC driver do not include the SQL
58+
statement. You can include the SQL statement with the traces by adding the property `enableExtendedTracing=true`
59+
to the JDBC connection URL.
60+
61+
#### Example Using Global OpenTelemetry
62+
Create and register a global OpenTelemetry object before creating a JDBC connection.
63+
See also the [Spring Data JDBC Sample](samples/spring-data-jdbc) for an example for how to
64+
configure OpenTelemetry in combination with Spring Data.
65+
66+
See [Latency Debugging Guide](documentation/latency-debugging-guide.md) for more information on how to use these traces.
67+
68+
```java
69+
TraceConfiguration traceConfiguration = TraceConfiguration.builder().setProjectId("my-project").build();
70+
SpanExporter traceExporter = TraceExporter.createWithConfiguration(traceConfiguration);
71+
OpenTelemetry openTelemetry =
72+
OpenTelemetrySdk.builder()
73+
.setTracerProvider(
74+
SdkTracerProvider.builder()
75+
.setSampler(Sampler.traceIdRatioBased(0.05))
76+
.setResource(
77+
Resource.builder()
78+
.put("service.name", "my-unique-service-name")
79+
.build())
80+
.addSpanProcessor(BatchSpanProcessor.builder(traceExporter).build())
81+
.build())
82+
.buildAndRegisterGlobal();
83+
String projectId = "my-project";
84+
String instanceId = "my-instance";
85+
String databaseId = "my-database";
86+
// Setting this to true instructs the JDBC driver to include the SQL statement with the traces.
87+
boolean enableExtendedTracing = true;
88+
// Enabling API tracing includes traces for each individual RPC invocation, including retries.
89+
boolean enableApiTracing = true;
90+
91+
try (Connection connection =
92+
DriverManager.getConnection(
93+
String.format(
94+
"jdbc:cloudspanner:/projects/%s/instances/%s/databases/%s?enableExtendedTracing=%s;enableApiTracing=%s",
95+
projectId, instanceId, databaseId, enableExtendedTracing, enableApiTracing))) {
96+
try (Statement statement = connection.createStatement()) {
97+
try (ResultSet rs = statement.executeQuery("SELECT CURRENT_TIMESTAMP()")) {
98+
while (rs.next()) {
99+
System.out.printf(
100+
"Connected to Cloud Spanner at [%s]%n", rs.getTimestamp(1).toString());
101+
}
102+
}
103+
}
104+
}
105+
```
106+
107+
#### Example Using an OpenTelemetry instance in Properties
108+
Instead of registering a global `OpenTelemetry` object, you can also provide a specific instance
109+
in the properties for a JDBC connection:
110+
111+
```java
112+
Properties info = new Properties();
113+
info.put(JdbcDriver.OPEN_TELEMETRY_PROPERTY_KEY, openTelemetry);
114+
info.put("enableExtendedTracing", String.valueOf(enableExtendedTracing));
115+
info.put("enableApiTracing", String.valueOf(enableApiTracing));
116+
117+
try (Connection connection =
118+
DriverManager.getConnection(
119+
String.format(
120+
"jdbc:cloudspanner:/projects/%s/instances/%s/databases/%s",
121+
projectId, instanceId, databaseId))) {
122+
try (Statement statement = connection.createStatement()) {
123+
try (ResultSet rs = statement.executeQuery("SELECT CURRENT_TIMESTAMP()")) {
124+
while (rs.next()) {
125+
System.out.printf(
126+
"Connected to Cloud Spanner at [%s]%n", rs.getTimestamp(1).toString());
127+
}
128+
}
129+
}
130+
}
131+
```
132+
49133
### Jar with Dependencies
50134
A single jar with all dependencies can be downloaded from https://repo1.maven.org/maven2/com/google/cloud/google-cloud-spanner-jdbc/latest
51135
or be built with the command `mvn package` (select the jar that is named `google-cloud-spanner-jdbc-<version>-single-jar-with-dependencies.jar`).
Loading
359 KB
Loading
469 KB
Loading
Loading
347 KB
Loading

documentation/img/example-tracing.png

345 KB
Loading

0 commit comments

Comments
 (0)