Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 14 additions & 1 deletion java-bigquery/google-cloud-bigquery-jdbc/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -185,7 +185,7 @@
<dependency>
<groupId>com.google.cloud</groupId>
<artifactId>google-cloud-logging</artifactId>
<version>3.33.0-SNAPSHOT</version><!-- {x-version-update:google-cloud-logging:current} -->
<version>3.32.0</version><!-- {x-version-update:google-cloud-logging:current} -->
</dependency>
<dependency>
<groupId>com.google.http-client</groupId>
Expand Down Expand Up @@ -301,6 +301,19 @@
<groupId>io.opentelemetry</groupId>
<artifactId>opentelemetry-context</artifactId>
</dependency>
<!-- OpenTelemetry SDK and Exporters (will be shaded via existing 'io' relocation) -->
<dependency>
<groupId>io.opentelemetry</groupId>
<artifactId>opentelemetry-sdk</artifactId>
</dependency>
<dependency>
<groupId>io.opentelemetry</groupId>
<artifactId>opentelemetry-exporter-otlp</artifactId>
</dependency>
<dependency>
<groupId>io.opentelemetry</groupId>
<artifactId>opentelemetry-sdk-extension-autoconfigure</artifactId>
</dependency>

<!-- Test Dependencies -->
<dependency>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@
import com.google.cloud.bigquery.storage.v1.BigQueryWriteClient;
import com.google.cloud.bigquery.storage.v1.BigQueryWriteSettings;
import com.google.cloud.http.HttpTransportOptions;
import com.google.cloud.logging.Logging;
import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.api.trace.Tracer;
import java.io.IOException;
Expand Down Expand Up @@ -88,6 +89,8 @@ public class BigQueryConnection extends BigQueryNoOpsConnection {
int transactionIsolation;
List<SQLWarning> sqlWarnings;
String catalog;
String gcpTelemetryCredentials;
String gcpTelemetryProjectId;
int holdability;
long retryTimeoutInSeconds;
Duration retryTimeoutDuration;
Expand Down Expand Up @@ -145,6 +148,7 @@ public class BigQueryConnection extends BigQueryNoOpsConnection {
Boolean enableGcpTraceExporter;
Boolean enableGcpLogExporter;
OpenTelemetry customOpenTelemetry;
private OpenTelemetry openTelemetry;
Tracer tracer =
OpenTelemetry.noop().getTracer(BigQueryJdbcOpenTelemetry.INSTRUMENTATION_SCOPE_NAME);
DatabaseMetaData databaseMetaData;
Expand All @@ -169,6 +173,8 @@ public class BigQueryConnection extends BigQueryNoOpsConnection {

this.labels = ds.getLabels() != null ? ds.getLabels() : new java.util.HashMap<>();
this.maxBytesBilled = ds.getMaximumBytesBilled();
this.gcpTelemetryCredentials = ds.getGcpTelemetryCredentials();
this.gcpTelemetryProjectId = ds.getGcpTelemetryProjectId();
this.retryTimeoutInSeconds = ds.getTimeout();
this.retryTimeoutDuration = Duration.ofMillis(retryTimeoutInSeconds * 1000L);
this.retryInitialDelayInSeconds = ds.getRetryInitialDelay();
Expand Down Expand Up @@ -277,6 +283,7 @@ public class BigQueryConnection extends BigQueryNoOpsConnection {
this.enableGcpTraceExporter = ds.getEnableGcpTraceExporter();
this.enableGcpLogExporter = ds.getEnableGcpLogExporter();
this.customOpenTelemetry = ds.getCustomOpenTelemetry();
this.openTelemetry = getOpenTelemetryInstance();
this.bigQuery = getBigQueryConnection();
}
}
Expand Down Expand Up @@ -961,6 +968,59 @@ void removeStatement(Statement statement) {
this.openStatements.remove(statement);
}

private OpenTelemetry getOpenTelemetryInstance() {
boolean isTraceEnabled = Boolean.TRUE.equals(this.enableGcpTraceExporter);
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: does corresponding DataSource property need to be Boolean? It has a default false, so maybe we should just update it to be boolean?

boolean isLogEnabled = Boolean.TRUE.equals(this.enableGcpLogExporter);
boolean hasCustomOtel = this.customOpenTelemetry != null;

String effectiveProjectId =
(this.gcpTelemetryProjectId != null) ? this.gcpTelemetryProjectId : this.catalog;
String effectiveCredentials = resolveEffectiveCredentials();

validateTraceConfiguration(isTraceEnabled, effectiveCredentials);

OpenTelemetry openTelemetry =
BigQueryJdbcOpenTelemetry.getOpenTelemetry(
isTraceEnabled,
isLogEnabled,
this.customOpenTelemetry,
effectiveCredentials,
effectiveProjectId);

Logging localLoggingClient = null;
if (isLogEnabled && !hasCustomOtel) {
localLoggingClient =
BigQueryJdbcOpenTelemetry.createLoggingClient(
true, null, effectiveCredentials, effectiveProjectId, this.credentials);
}

if (isLogEnabled || hasCustomOtel) {
BigQueryJdbcOpenTelemetry.registerConnection(
this.connectionId, openTelemetry, localLoggingClient, isLogEnabled);
}

return openTelemetry;
}

private String resolveEffectiveCredentials() {
String creds = this.gcpTelemetryCredentials;
String authTypeStr = this.overrideProperties.get("OAuthType");
if (creds == null && "0".equals(authTypeStr)) {
return this.overrideProperties.get("OAuthPvtKey");
}
return creds;
}

private void validateTraceConfiguration(boolean isTraceEnabled, String effectiveCredentials) {
if (isTraceEnabled && effectiveCredentials == null) {
String authTypeStr = this.overrideProperties.get("OAuthType");
if (!"0".equals(authTypeStr) && !"3".equals(authTypeStr)) {
throw new BigQueryJdbcRuntimeException(
"Exporting traces to Google Cloud is only supported when using Application Default Credentials (ADC) or Service Account authentication.");
}
}
}

private BigQuery getBigQueryConnection() {
BigQueryOptions.Builder bigQueryOptions = BigQueryOptions.newBuilder();
if (this.retryTimeoutInSeconds > 0L
Expand Down Expand Up @@ -997,18 +1057,8 @@ private BigQuery getBigQueryConnection() {
if (this.httpTransportOptions != null) {
bigQueryOptions.setTransportOptions(this.httpTransportOptions);
}

OpenTelemetry openTelemetry =
BigQueryJdbcOpenTelemetry.getOpenTelemetry(
this.enableGcpTraceExporter, this.enableGcpLogExporter, this.customOpenTelemetry);

if (this.enableGcpLogExporter || this.customOpenTelemetry != null) {
BigQueryJdbcOpenTelemetry.registerConnection(
this.connectionId, openTelemetry, null, this.enableGcpLogExporter);
}

if (this.enableGcpTraceExporter || this.customOpenTelemetry != null) {
this.tracer = BigQueryJdbcOpenTelemetry.getTracer(openTelemetry);
if (Boolean.TRUE.equals(this.enableGcpTraceExporter) || this.customOpenTelemetry != null) {
this.tracer = BigQueryJdbcOpenTelemetry.getTracer(this.openTelemetry);
bigQueryOptions.setOpenTelemetryTracer(this.tracer);
}

Expand Down Expand Up @@ -1060,11 +1110,8 @@ private BigQueryReadClient getBigQueryReadClientConnection() throws IOException

bigQueryReadSettings.setTransportChannelProvider(activeProvider);

OpenTelemetry openTelemetry =
BigQueryJdbcOpenTelemetry.getOpenTelemetry(
this.enableGcpTraceExporter, this.enableGcpLogExporter, this.customOpenTelemetry);
if (this.enableGcpTraceExporter || this.customOpenTelemetry != null) {
bigQueryReadSettings.setOpenTelemetryTracerProvider(openTelemetry.getTracerProvider());
if (Boolean.TRUE.equals(this.enableGcpTraceExporter) || this.customOpenTelemetry != null) {
bigQueryReadSettings.setOpenTelemetryTracerProvider(this.openTelemetry.getTracerProvider());
}

return BigQueryReadClient.create(bigQueryReadSettings.build());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -307,7 +307,7 @@ private static boolean isFileExists(String filename) {
}
}

private static boolean isJson(byte[] value) {
static boolean isJson(byte[] value) {
try {
// This is done this way to ensure strict Json parsing
// https://github.com/google/gson/issues/1208#issuecomment-2120764686
Expand Down
Loading
Loading