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); }