diff --git a/java-bigquery/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/BigQueryOptions.java b/java-bigquery/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/BigQueryOptions.java
index 10ae77930c85..d0c989ae0841 100644
--- a/java-bigquery/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/BigQueryOptions.java
+++ b/java-bigquery/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/BigQueryOptions.java
@@ -16,7 +16,6 @@
package com.google.cloud.bigquery;
-import com.google.api.core.BetaApi;
import com.google.api.core.ObsoleteApi;
import com.google.api.gax.retrying.ResultRetryAlgorithm;
import com.google.cloud.ServiceDefaults;
@@ -127,9 +126,21 @@ public Builder setDataFormatOptions(DataFormatOptions dataFormatOptions) {
/**
* Enables OpenTelemetry tracing functionality for this BigQuery instance
*
+ *
Traces may contain sensitive data such as resource names, full URLs,
+ * and error messages.
+ *
+ *
Before configuring subscribers or exporters for traces, review the contents of the spans
+ * and consult the OpenTelemetry
+ * documentation to set up filters and formatters to prevent leaking sensitive information,
+ * depending on your intended use case.
+ *
+ *
See also: OpenTelemetry Semantic
+ * Conventions
+ *
* @param enableOpenTelemetryTracing enables OpenTelemetry tracing if true
*/
- @BetaApi
public Builder setEnableOpenTelemetryTracing(boolean enableOpenTelemetryTracing) {
this.enableOpenTelemetryTracing = enableOpenTelemetryTracing;
return this;
@@ -138,9 +149,21 @@ public Builder setEnableOpenTelemetryTracing(boolean enableOpenTelemetryTracing)
/**
* Sets the OpenTelemetry tracer for this BigQuery instance to be tracer.
*
+ *
Traces may contain sensitive data such as resource names, full URLs,
+ * and error messages.
+ *
+ *
Before configuring subscribers or exporters for traces, review the contents of the spans
+ * and consult the OpenTelemetry
+ * documentation to set up filters and formatters to prevent leaking sensitive information,
+ * depending on your intended use case.
+ *
+ *
See also: OpenTelemetry Semantic
+ * Conventions
+ *
* @param tracer OpenTelemetry tracer to be used
*/
- @BetaApi
public Builder setOpenTelemetryTracer(Tracer tracer) {
this.openTelemetryTracer = tracer;
return this;
@@ -282,7 +305,6 @@ public JobCreationMode getDefaultJobCreationMode() {
*
* @return true if tracing is enabled, false if not
*/
- @BetaApi("Span names and attributes are subject to change without notice")
public boolean isOpenTelemetryTracingEnabled() {
return enableOpenTelemetryTracing;
}
@@ -292,7 +314,6 @@ public boolean isOpenTelemetryTracingEnabled() {
*
* @return OpenTelemetry tracer object or {@code null} if not set
*/
- @BetaApi("Span names and attributes are subject to change without notice")
public Tracer getOpenTelemetryTracer() {
return openTelemetryTracer;
}
diff --git a/java-bigquery/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/spi/v2/HttpBigQueryRpc.java b/java-bigquery/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/spi/v2/HttpBigQueryRpc.java
index e789239b5589..b89cb99d4d64 100644
--- a/java-bigquery/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/spi/v2/HttpBigQueryRpc.java
+++ b/java-bigquery/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/spi/v2/HttpBigQueryRpc.java
@@ -88,8 +88,6 @@ public class HttpBigQueryRpc implements BigQueryRpc {
public static final String DEFAULT_PROJECTION = "full";
private static final String BASE_RESUMABLE_URI = "upload/bigquery/v2/projects/";
- static final String HTTP_TRACING_DEV_GATE_PROPERTY =
- "com.google.cloud.bigquery.http.tracing.dev.enabled";
static final String RESOURCE_PROJECT_PREFIX = "//bigquery.googleapis.com/projects/";
// see:
// https://cloud.google.com/bigquery/loading-data-post-request#resume-upload
@@ -120,9 +118,7 @@ public HttpBigQueryRpc(BigQueryOptions options) {
this.options = options;
this.urlDomain = new GenericUrl(options.getResolvedApiaryHost("bigquery")).getHost();
- if (options.isOpenTelemetryTracingEnabled()
- && options.getOpenTelemetryTracer() != null
- && isHttpTracingEnabled()) {
+ if (options.isOpenTelemetryTracingEnabled() && options.getOpenTelemetryTracer() != null) {
initializer =
new HttpTracingRequestInitializer(initializer, options.getOpenTelemetryTracer());
}
@@ -2146,14 +2142,11 @@ private Span createRpcTracingSpan(
.setSpanKind(SpanKind.CLIENT)
.setAttribute("bq.rpc.service", service)
.setAttribute("bq.rpc.method", method)
- .setAttribute("bq.rpc.system", "http");
- if (isHttpTracingEnabled()) {
- builder
- .setAttribute(
- BigQueryTelemetryTracer.GCP_RESOURCE_DESTINATION_ID, gcpResourceDestinationId)
- .setAttribute(BigQueryTelemetryTracer.URL_TEMPLATE, urlTemplate)
- .setAttribute(BigQueryTelemetryTracer.URL_DOMAIN, this.urlDomain);
- }
+ .setAttribute("bq.rpc.system", "http")
+ .setAttribute(
+ BigQueryTelemetryTracer.GCP_RESOURCE_DESTINATION_ID, gcpResourceDestinationId)
+ .setAttribute(BigQueryTelemetryTracer.URL_TEMPLATE, urlTemplate)
+ .setAttribute(BigQueryTelemetryTracer.URL_DOMAIN, this.urlDomain);
if (options != null) {
builder.setAllAttributes(otelAttributesFromOptions(options));
@@ -2175,13 +2168,11 @@ private T executeWithSpan(Span span, SpanOperation operation) throws IOEx
try (Scope scope = span.makeCurrent()) {
return operation.execute(span);
} catch (Exception e) {
- if (isHttpTracingEnabled()) {
- if (e instanceof GoogleJsonResponseException) {
- BigQueryTelemetryTracer.addServerErrorResponseToSpan(
- ((GoogleJsonResponseException) e), span);
- } else {
- BigQueryTelemetryTracer.addExceptionToSpan(e, span);
- }
+ if (e instanceof GoogleJsonResponseException) {
+ BigQueryTelemetryTracer.addServerErrorResponseToSpan(
+ ((GoogleJsonResponseException) e), span);
+ } else {
+ BigQueryTelemetryTracer.addExceptionToSpan(e, span);
}
throw e;
} finally {
@@ -2202,13 +2193,4 @@ private static Attributes otelAttributesFromOptions(Map options) {
}
return builder.build();
}
-
- /**
- * Temporary development gate for HttpTracingRequestInitializer rollout: must be explicitly
- * enabled with the system property. tracking ticket for removal:
- * https://github.com/googleapis/google-cloud-java/issues/12100
- */
- static boolean isHttpTracingEnabled() {
- return Boolean.parseBoolean(System.getProperty(HTTP_TRACING_DEV_GATE_PROPERTY));
- }
}
diff --git a/java-bigquery/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/telemetry/BigQueryTelemetryTracer.java b/java-bigquery/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/telemetry/BigQueryTelemetryTracer.java
index 559ed6632a53..091b0793d0b4 100644
--- a/java-bigquery/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/telemetry/BigQueryTelemetryTracer.java
+++ b/java-bigquery/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/telemetry/BigQueryTelemetryTracer.java
@@ -18,14 +18,12 @@
import com.google.api.client.googleapis.json.GoogleJsonError;
import com.google.api.client.googleapis.json.GoogleJsonResponseException;
-import com.google.api.core.BetaApi;
import com.google.api.core.InternalApi;
import io.opentelemetry.api.common.AttributeKey;
import io.opentelemetry.api.trace.Span;
import io.opentelemetry.api.trace.StatusCode;
/** BigQuery Telemetry class that stores generic telemetry attributes and values */
-@BetaApi
@InternalApi
public final class BigQueryTelemetryTracer {
diff --git a/java-bigquery/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/telemetry/ErrorTypeUtil.java b/java-bigquery/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/telemetry/ErrorTypeUtil.java
index c769fbb19e65..19d947811629 100644
--- a/java-bigquery/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/telemetry/ErrorTypeUtil.java
+++ b/java-bigquery/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/telemetry/ErrorTypeUtil.java
@@ -15,7 +15,6 @@
*/
package com.google.cloud.bigquery.telemetry;
-import com.google.api.core.BetaApi;
import com.google.common.annotations.VisibleForTesting;
/**
@@ -23,7 +22,6 @@
* replaced with gax version when ready work tracked in
* https://github.com/googleapis/google-cloud-java/issues/12105
*/
-@BetaApi
@VisibleForTesting
public class ErrorTypeUtil {
diff --git a/java-bigquery/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/telemetry/HttpTracingRequestInitializer.java b/java-bigquery/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/telemetry/HttpTracingRequestInitializer.java
index 35ab902bd0e8..20b647bef9c1 100644
--- a/java-bigquery/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/telemetry/HttpTracingRequestInitializer.java
+++ b/java-bigquery/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/telemetry/HttpTracingRequestInitializer.java
@@ -17,7 +17,6 @@
package com.google.cloud.bigquery.telemetry;
import com.google.api.client.http.*;
-import com.google.api.core.BetaApi;
import com.google.api.core.InternalApi;
import com.google.cloud.bigquery.BigQueryRetryHelper;
import com.google.common.annotations.VisibleForTesting;
@@ -33,7 +32,6 @@
* HttpRequestInitializer that wraps a delegate initializer, intercepts all HTTP requests, adds
* OpenTelemetry tracing and then invokes delegate interceptor.
*/
-@BetaApi
@InternalApi
public class HttpTracingRequestInitializer implements HttpRequestInitializer {
diff --git a/java-bigquery/google-cloud-bigquery/src/test/java/com/google/cloud/bigquery/it/ITOpenTelemetryTest.java b/java-bigquery/google-cloud-bigquery/src/test/java/com/google/cloud/bigquery/it/ITOpenTelemetryTest.java
index d42f193c56fd..bb6e4cdba0fa 100644
--- a/java-bigquery/google-cloud-bigquery/src/test/java/com/google/cloud/bigquery/it/ITOpenTelemetryTest.java
+++ b/java-bigquery/google-cloud-bigquery/src/test/java/com/google/cloud/bigquery/it/ITOpenTelemetryTest.java
@@ -54,7 +54,6 @@ public class ITOpenTelemetryTest {
@BeforeAll
public static void setUpClass() throws IOException {
- System.setProperty("com.google.cloud.bigquery.http.tracing.dev.enabled", "true");
bigqueryHelper = RemoteBigQueryHelper.create();
}
diff --git a/java-bigquery/google-cloud-bigquery/src/test/java/com/google/cloud/bigquery/spi/v2/HttpBigQueryRpcTest.java b/java-bigquery/google-cloud-bigquery/src/test/java/com/google/cloud/bigquery/spi/v2/HttpBigQueryRpcTest.java
index 7a98b3b9dd07..33716417ed09 100644
--- a/java-bigquery/google-cloud-bigquery/src/test/java/com/google/cloud/bigquery/spi/v2/HttpBigQueryRpcTest.java
+++ b/java-bigquery/google-cloud-bigquery/src/test/java/com/google/cloud/bigquery/spi/v2/HttpBigQueryRpcTest.java
@@ -64,12 +64,7 @@
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.parallel.Execution;
-import org.junit.jupiter.api.parallel.ExecutionMode;
-// same thread execution temporarily required for using java system properties will get removed in
-// issue https://github.com/googleapis/google-cloud-java/issues/12100
-@Execution(ExecutionMode.SAME_THREAD)
public class HttpBigQueryRpcTest {
private static final String PROJECT_ID = "test-project";
@@ -225,7 +220,6 @@ class TelemetryEnabled {
@BeforeEach
public void setUp() {
setUpServer();
- System.setProperty("com.google.cloud.bigquery.http.tracing.dev.enabled", "true");
rpc = createRpc(true);
}
@@ -1200,111 +1194,6 @@ public void testUrlDomain_OverriddenValue() throws Exception {
}
}
- @Nested
- class TelemetryEnabledDevDisabled {
- private HttpBigQueryRpc rpc;
-
- @BeforeEach
- public void setUp() {
- setUpServer();
- System.clearProperty("com.google.cloud.bigquery.http.tracing.dev.enabled");
- rpc = createRpc(true);
- }
-
- @Test
- public void testHttpTracingDisabledDoesNotAddAdditionalAttributes() throws Exception {
- setMockResponse(
- "{\"kind\":\"bigquery#dataset\",\"id\":\""
- + PROJECT_ID
- + ":"
- + DATASET_ID
- + "\",\"datasetReference\":{\"projectId\":\""
- + PROJECT_ID
- + "\",\"datasetId\":\""
- + DATASET_ID
- + "\"}}");
-
- rpc.getDatasetSkipExceptionTranslation(PROJECT_ID, DATASET_ID, new HashMap<>());
-
- verifyRequest("GET", "/projects/" + PROJECT_ID + "/datasets/" + DATASET_ID);
-
- List spans = spanExporter.getFinishedSpanItems();
- assertThat(spans).isNotEmpty();
- SpanData rpcSpan =
- spans.stream()
- .filter(
- span -> span.getName().equals("com.google.cloud.bigquery.BigQueryRpc.getDataset"))
- .findFirst()
- .orElse(null);
- assertNotNull(rpcSpan);
- verifySpanProductionAttributes(
- "DatasetService",
- "GetDataset",
- Collections.singletonMap("bq.rpc.response.dataset.id", PROJECT_ID + ":" + DATASET_ID),
- rpcSpan);
-
- assertNull(rpcSpan.getAttributes().get(BigQueryTelemetryTracer.RPC_SYSTEM_NAME));
- assertNull(rpcSpan.getAttributes().get(BigQueryTelemetryTracer.GCP_CLIENT_SERVICE));
- assertNull(
- rpcSpan.getAttributes().get(AttributeKey.stringKey("url.template")),
- "url.template attribute should not be set");
- assertNull(rpcSpan.getAttributes().get(BigQueryTelemetryTracer.GCP_RESOURCE_DESTINATION_ID));
- assertNull(rpcSpan.getAttributes().get(BigQueryTelemetryTracer.URL_DOMAIN));
- assertNull(
- rpcSpan.getAttributes().get(HttpTracingRequestInitializer.HTTP_REQUEST_RESEND_COUNT));
- }
-
- @Test
- public void testHttpTracingDisabled_GenericException_DoesNotSetAttributes() throws Exception {
- assertThrows(
- IOException.class,
- () -> {
- rpc.getDatasetSkipExceptionTranslation(PROJECT_ID, DATASET_ID, new HashMap<>());
- });
-
- List spans = spanExporter.getFinishedSpanItems();
- assertThat(spans).isNotEmpty();
- io.opentelemetry.sdk.trace.data.SpanData rpcSpan =
- spans.stream()
- .filter(
- span -> span.getName().equals("com.google.cloud.bigquery.BigQueryRpc.getDataset"))
- .findFirst()
- .orElse(null);
- assertNotNull(rpcSpan);
- assertNull(rpcSpan.getAttributes().get(BigQueryTelemetryTracer.EXCEPTION_TYPE));
- assertNull(rpcSpan.getAttributes().get(BigQueryTelemetryTracer.ERROR_TYPE));
- assertNull(rpcSpan.getAttributes().get(BigQueryTelemetryTracer.STATUS_MESSAGE));
- }
-
- @Test
- public void testHttpTracingDisabled_GoogleJsonResponseException_DoesNotSetAttributes()
- throws Exception {
- mockResponse.setStatusCode(400);
- mockResponse.setContentType(Json.MEDIA_TYPE);
- mockResponse.setContent(
- "{\"error\":{\"code\":400,\"message\":\"Invalid request\",\"errors\":[{\"message\":\"Invalid request\",\"domain\":\"global\",\"reason\":\"invalid\"}]}}");
-
- assertThrows(
- IOException.class,
- () -> {
- rpc.getDatasetSkipExceptionTranslation(PROJECT_ID, DATASET_ID, new HashMap<>());
- });
-
- List spans = spanExporter.getFinishedSpanItems();
- assertThat(spans).isNotEmpty();
- io.opentelemetry.sdk.trace.data.SpanData rpcSpan =
- spans.stream()
- .filter(
- span -> span.getName().equals("com.google.cloud.bigquery.BigQueryRpc.getDataset"))
- .findFirst()
- .orElse(null);
- assertNotNull(rpcSpan);
- assertNull(rpcSpan.getAttributes().get(BigQueryTelemetryTracer.EXCEPTION_TYPE));
- assertNull(rpcSpan.getAttributes().get(BigQueryTelemetryTracer.ERROR_TYPE));
- assertNull(rpcSpan.getAttributes().get(BigQueryTelemetryTracer.STATUS_MESSAGE));
- }
- }
-
@Nested
class TelemetryDisabled {
private HttpBigQueryRpc rpc;
@@ -1312,7 +1201,6 @@ class TelemetryDisabled {
@BeforeEach
public void setUp() {
setUpServer();
- System.clearProperty("com.google.cloud.bigquery.http.tracing.dev.enabled");
rpc = createRpc(false);
}