From a6baa7d362c740ba455a80f0dcf117ac57864ef2 Mon Sep 17 00:00:00 2001 From: Surbhi Garg Date: Wed, 8 Oct 2025 14:21:57 +0530 Subject: [PATCH 1/4] chore: Improve traces --- .../cloud/spanner/DatabaseClientImpl.java | 34 +++++++++---------- .../google/cloud/spanner/SessionClient.java | 11 +++--- .../com/google/cloud/spanner/SpannerImpl.java | 6 ++-- .../google/cloud/spanner/TraceWrapper.java | 20 ++++++++--- .../cloud/spanner/XGoogSpannerRequestId.java | 2 +- .../spanner/spi/v1/HeaderInterceptor.java | 7 ++-- 6 files changed, 47 insertions(+), 33 deletions(-) diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/DatabaseClientImpl.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/DatabaseClientImpl.java index 40dbd710bd5..aafa66d16f1 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/DatabaseClientImpl.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/DatabaseClientImpl.java @@ -42,7 +42,7 @@ class DatabaseClientImpl implements DatabaseClient { private static final String READ_ONLY_TRANSACTION = "CloudSpanner.ReadOnlyTransaction"; private static final String PARTITION_DML_TRANSACTION = "CloudSpanner.PartitionDMLTransaction"; private final TraceWrapper tracer; - private Attributes commonAttributes; + private final Attributes databaseAttributes; @VisibleForTesting final String clientId; @VisibleForTesting final SessionPool pool; @VisibleForTesting final MultiplexedSessionDatabaseClient multiplexedSessionDatabaseClient; @@ -88,7 +88,7 @@ class DatabaseClientImpl implements DatabaseClient { boolean useMultiplexedSessionPartitionedOps, TraceWrapper tracer, boolean useMultiplexedSessionForRW, - Attributes commonAttributes) { + Attributes databaseAttributes) { this.clientId = clientId; this.pool = pool; this.useMultiplexedSessionBlindWrite = useMultiplexedSessionBlindWrite; @@ -96,7 +96,7 @@ class DatabaseClientImpl implements DatabaseClient { this.useMultiplexedSessionPartitionedOps = useMultiplexedSessionPartitionedOps; this.tracer = tracer; this.useMultiplexedSessionForRW = useMultiplexedSessionForRW; - this.commonAttributes = commonAttributes; + this.databaseAttributes = databaseAttributes; this.clientIdToOrdinalMap = new HashMap(); this.dbId = this.dbIdFromClientId(this.clientId); @@ -203,7 +203,7 @@ public Timestamp write(final Iterable mutations) throws SpannerExcepti public CommitResponse writeWithOptions( final Iterable mutations, final TransactionOption... options) throws SpannerException { - ISpan span = tracer.spanBuilder(READ_WRITE_TRANSACTION, commonAttributes, options); + ISpan span = tracer.spanBuilder(READ_WRITE_TRANSACTION, databaseAttributes, options); try (IScope s = tracer.withSpan(span)) { if (canUseMultiplexedSessionsForRW() && getMultiplexedSessionDatabaseClient() != null) { return getMultiplexedSessionDatabaseClient().writeWithOptions(mutations, options); @@ -230,7 +230,7 @@ public Timestamp writeAtLeastOnce(final Iterable mutations) throws Spa public CommitResponse writeAtLeastOnceWithOptions( final Iterable mutations, final TransactionOption... options) throws SpannerException { - ISpan span = tracer.spanBuilder(READ_WRITE_TRANSACTION, commonAttributes, options); + ISpan span = tracer.spanBuilder(READ_WRITE_TRANSACTION, databaseAttributes, options); try (IScope s = tracer.withSpan(span)) { if (useMultiplexedSessionBlindWrite && getMultiplexedSessionDatabaseClient() != null) { return getMultiplexedSessionDatabaseClient() @@ -260,7 +260,7 @@ int getNthRequest() { public ServerStream batchWriteAtLeastOnce( final Iterable mutationGroups, final TransactionOption... options) throws SpannerException { - ISpan span = tracer.spanBuilder(READ_WRITE_TRANSACTION, commonAttributes, options); + ISpan span = tracer.spanBuilder(READ_WRITE_TRANSACTION, databaseAttributes, options); try (IScope s = tracer.withSpan(span)) { if (canUseMultiplexedSessionsForRW() && getMultiplexedSessionDatabaseClient() != null) { return getMultiplexedSessionDatabaseClient().batchWriteAtLeastOnce(mutationGroups, options); @@ -278,7 +278,7 @@ public ServerStream batchWriteAtLeastOnce( @Override public ReadContext singleUse() { - ISpan span = tracer.spanBuilder(READ_ONLY_TRANSACTION, commonAttributes); + ISpan span = tracer.spanBuilder(READ_ONLY_TRANSACTION, databaseAttributes); try (IScope s = tracer.withSpan(span)) { return getMultiplexedSession().singleUse(); } catch (RuntimeException e) { @@ -290,7 +290,7 @@ public ReadContext singleUse() { @Override public ReadContext singleUse(TimestampBound bound) { - ISpan span = tracer.spanBuilder(READ_ONLY_TRANSACTION, commonAttributes); + ISpan span = tracer.spanBuilder(READ_ONLY_TRANSACTION, databaseAttributes); try (IScope s = tracer.withSpan(span)) { return getMultiplexedSession().singleUse(bound); } catch (RuntimeException e) { @@ -302,7 +302,7 @@ public ReadContext singleUse(TimestampBound bound) { @Override public ReadOnlyTransaction singleUseReadOnlyTransaction() { - ISpan span = tracer.spanBuilder(READ_ONLY_TRANSACTION, commonAttributes); + ISpan span = tracer.spanBuilder(READ_ONLY_TRANSACTION, databaseAttributes); try (IScope s = tracer.withSpan(span)) { return getMultiplexedSession().singleUseReadOnlyTransaction(); } catch (RuntimeException e) { @@ -314,7 +314,7 @@ public ReadOnlyTransaction singleUseReadOnlyTransaction() { @Override public ReadOnlyTransaction singleUseReadOnlyTransaction(TimestampBound bound) { - ISpan span = tracer.spanBuilder(READ_ONLY_TRANSACTION, commonAttributes); + ISpan span = tracer.spanBuilder(READ_ONLY_TRANSACTION, databaseAttributes); try (IScope s = tracer.withSpan(span)) { return getMultiplexedSession().singleUseReadOnlyTransaction(bound); } catch (RuntimeException e) { @@ -326,7 +326,7 @@ public ReadOnlyTransaction singleUseReadOnlyTransaction(TimestampBound bound) { @Override public ReadOnlyTransaction readOnlyTransaction() { - ISpan span = tracer.spanBuilder(READ_ONLY_TRANSACTION, commonAttributes); + ISpan span = tracer.spanBuilder(READ_ONLY_TRANSACTION, databaseAttributes); try (IScope s = tracer.withSpan(span)) { return getMultiplexedSession().readOnlyTransaction(); } catch (RuntimeException e) { @@ -338,7 +338,7 @@ public ReadOnlyTransaction readOnlyTransaction() { @Override public ReadOnlyTransaction readOnlyTransaction(TimestampBound bound) { - ISpan span = tracer.spanBuilder(READ_ONLY_TRANSACTION, commonAttributes); + ISpan span = tracer.spanBuilder(READ_ONLY_TRANSACTION, databaseAttributes); try (IScope s = tracer.withSpan(span)) { return getMultiplexedSession().readOnlyTransaction(bound); } catch (RuntimeException e) { @@ -350,7 +350,7 @@ public ReadOnlyTransaction readOnlyTransaction(TimestampBound bound) { @Override public TransactionRunner readWriteTransaction(TransactionOption... options) { - ISpan span = tracer.spanBuilder(READ_WRITE_TRANSACTION, commonAttributes, options); + ISpan span = tracer.spanBuilder(READ_WRITE_TRANSACTION, databaseAttributes, options); try (IScope s = tracer.withSpan(span)) { return getMultiplexedSessionForRW().readWriteTransaction(options); } catch (RuntimeException e) { @@ -362,7 +362,7 @@ public TransactionRunner readWriteTransaction(TransactionOption... options) { @Override public TransactionManager transactionManager(TransactionOption... options) { - ISpan span = tracer.spanBuilder(READ_WRITE_TRANSACTION, commonAttributes, options); + ISpan span = tracer.spanBuilder(READ_WRITE_TRANSACTION, databaseAttributes, options); try (IScope s = tracer.withSpan(span)) { return getMultiplexedSessionForRW().transactionManager(options); } catch (RuntimeException e) { @@ -374,7 +374,7 @@ public TransactionManager transactionManager(TransactionOption... options) { @Override public AsyncRunner runAsync(TransactionOption... options) { - ISpan span = tracer.spanBuilder(READ_WRITE_TRANSACTION, commonAttributes, options); + ISpan span = tracer.spanBuilder(READ_WRITE_TRANSACTION, databaseAttributes, options); try (IScope s = tracer.withSpan(span)) { return getMultiplexedSessionForRW().runAsync(options); } catch (RuntimeException e) { @@ -386,7 +386,7 @@ public AsyncRunner runAsync(TransactionOption... options) { @Override public AsyncTransactionManager transactionManagerAsync(TransactionOption... options) { - ISpan span = tracer.spanBuilder(READ_WRITE_TRANSACTION, commonAttributes, options); + ISpan span = tracer.spanBuilder(READ_WRITE_TRANSACTION, databaseAttributes, options); try (IScope s = tracer.withSpan(span)) { return getMultiplexedSessionForRW().transactionManagerAsync(options); } catch (RuntimeException e) { @@ -449,7 +449,7 @@ private TransactionOption[] withReqId( private long executePartitionedUpdateWithPooledSession( final Statement stmt, final UpdateOption... options) { - ISpan span = tracer.spanBuilder(PARTITION_DML_TRANSACTION, commonAttributes); + ISpan span = tracer.spanBuilder(PARTITION_DML_TRANSACTION, databaseAttributes); try (IScope s = tracer.withSpan(span)) { return runWithSessionRetry( (session, reqId) -> { diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SessionClient.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SessionClient.java index 20c86bdf25b..6592eb74991 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SessionClient.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SessionClient.java @@ -140,7 +140,7 @@ public void run() { List sessions; int remainingSessionsToCreate = sessionCount; ISpan span = - spanner.getTracer().spanBuilder(SpannerImpl.BATCH_CREATE_SESSIONS, commonAttributes); + spanner.getTracer().spanBuilder(SpannerImpl.BATCH_CREATE_SESSIONS, databaseAttributes); try (IScope s = spanner.getTracer().withSpan(span)) { spanner .getTracer() @@ -185,7 +185,7 @@ interface SessionConsumer { private final ExecutorFactory executorFactory; private final ScheduledExecutorService executor; private final DatabaseId db; - private final Attributes commonAttributes; + private final Attributes databaseAttributes; // SessionClient is created long before a DatabaseClientImpl is created, // as batch sessions are firstly created then later attached to each Client. @@ -204,7 +204,7 @@ interface SessionConsumer { this.db = db; this.executorFactory = executorFactory; this.executor = executorFactory.get(); - this.commonAttributes = spanner.getTracer().createCommonAttributes(db); + this.databaseAttributes = spanner.getTracer().createDatabaseAttributes(db); } @Override @@ -236,7 +236,8 @@ SessionImpl createSession() { sessionChannelCounter++; } XGoogSpannerRequestId reqId = nextRequestId(channelId, 1); - ISpan span = spanner.getTracer().spanBuilder(SpannerImpl.CREATE_SESSION, this.commonAttributes); + ISpan span = + spanner.getTracer().spanBuilder(SpannerImpl.CREATE_SESSION, this.databaseAttributes); try (IScope s = spanner.getTracer().withSpan(span)) { com.google.spanner.v1.Session session = spanner @@ -289,7 +290,7 @@ SessionImpl createMultiplexedSession() { ISpan span = spanner .getTracer() - .spanBuilder(SpannerImpl.CREATE_MULTIPLEXED_SESSION, this.commonAttributes); + .spanBuilder(SpannerImpl.CREATE_MULTIPLEXED_SESSION, this.databaseAttributes); // MultiplexedSession doesn't use a channelId hence this hard-coded value. int channelId = 0; XGoogSpannerRequestId reqId = nextRequestId(channelId, 1); diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SpannerImpl.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SpannerImpl.java index 8f5baca64f6..582f0b11a70 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SpannerImpl.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SpannerImpl.java @@ -316,7 +316,7 @@ public DatabaseClient getDatabaseClient(DatabaseId db) { multiplexedSessionDatabaseClient, getOptions().getSessionPoolOptions().getUseMultiplexedSessionPartitionedOps(), useMultiplexedSessionForRW, - this.tracer.createCommonAttributes(db)); + this.tracer.createDatabaseAttributes(db)); dbClients.put(db, dbClient); return dbClient; } @@ -331,7 +331,7 @@ DatabaseClientImpl createDatabaseClient( @Nullable MultiplexedSessionDatabaseClient multiplexedSessionClient, boolean useMultiplexedSessionPartitionedOps, boolean useMultiplexedSessionForRW, - Attributes commonAttributes) { + Attributes databaseAttributes) { if (multiplexedSessionClient != null) { // Set the session pool in the multiplexed session client. // This is required to handle fallback to regular sessions for in-progress transactions that @@ -346,7 +346,7 @@ DatabaseClientImpl createDatabaseClient( useMultiplexedSessionPartitionedOps, tracer, useMultiplexedSessionForRW, - commonAttributes); + databaseAttributes); } @Override diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/TraceWrapper.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/TraceWrapper.java index df5874cb3c6..14a69631eff 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/TraceWrapper.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/TraceWrapper.java @@ -60,6 +60,7 @@ class TraceWrapper { private final Tracer openCensusTracer; private final io.opentelemetry.api.trace.Tracer openTelemetryTracer; private final boolean enableExtendedTracing; + private final AttributesBuilder commonAttributesBuilder; TraceWrapper( Tracer openCensusTracer, @@ -68,20 +69,24 @@ class TraceWrapper { this.openTelemetryTracer = openTelemetryTracer; this.openCensusTracer = openCensusTracer; this.enableExtendedTracing = enableExtendedTracing; + this.commonAttributesBuilder = createCommonAttributes(); } ISpan spanBuilder(String spanName) { return spanBuilder(spanName, Attributes.empty()); } - ISpan spanBuilder(String spanName, Attributes commonAttributes, TransactionOption... options) { - return spanBuilder(spanName, createTransactionAttributes(commonAttributes, options)); + ISpan spanBuilder(String spanName, Attributes attributes, TransactionOption... options) { + return spanBuilder(spanName, createTransactionAttributes(attributes, options)); } ISpan spanBuilder(String spanName, Attributes attributes) { if (SpannerOptions.getActiveTracingFramework().equals(TracingFramework.OPEN_TELEMETRY)) { return new OpenTelemetrySpan( - openTelemetryTracer.spanBuilder(spanName).setAllAttributes(attributes).startSpan()); + openTelemetryTracer + .spanBuilder(spanName) + .setAllAttributes(this.commonAttributesBuilder.putAll(attributes).build()) + .startSpan()); } else { return new OpenCensusSpan(openCensusTracer.spanBuilder(spanName).startSpan()); } @@ -209,15 +214,20 @@ Attributes createTableAttributes(String tableName, Options options) { return builder.build(); } - Attributes createCommonAttributes(DatabaseId db) { + Attributes createDatabaseAttributes(DatabaseId db) { AttributesBuilder builder = Attributes.builder(); builder.put(DB_NAME_KEY, db.getDatabase()); builder.put(INSTANCE_NAME_KEY, db.getInstanceId().getInstance()); + return builder.build(); + } + + private AttributesBuilder createCommonAttributes() { + AttributesBuilder builder = Attributes.builder(); builder.put(GCP_CLIENT_SERVICE_KEY, "spanner"); builder.put(GCP_CLIENT_REPO_KEY, "googleapis/java-spanner"); builder.put(GCP_CLIENT_VERSION_KEY, GaxProperties.getLibraryVersion(TraceWrapper.class)); builder.put(CLOUD_REGION_KEY, BuiltInMetricsProvider.detectClientLocation()); - return builder.build(); + return builder; } private static String getTraceThreadName() { diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/XGoogSpannerRequestId.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/XGoogSpannerRequestId.java index 274592f9b40..47ccb05231c 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/XGoogSpannerRequestId.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/XGoogSpannerRequestId.java @@ -35,7 +35,7 @@ public class XGoogSpannerRequestId { @VisibleForTesting static final String RAND_PROCESS_ID = XGoogSpannerRequestId.generateRandProcessId(); - static String REQUEST_ID = "x-goog-spanner-request-id"; + public static String REQUEST_ID = "x-goog-spanner-request-id"; public static final Metadata.Key REQUEST_HEADER_KEY = Metadata.Key.of(REQUEST_ID, Metadata.ASCII_STRING_MARSHALLER); diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/spi/v1/HeaderInterceptor.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/spi/v1/HeaderInterceptor.java index bec062db907..1aaa7bd304d 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/spi/v1/HeaderInterceptor.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/spi/v1/HeaderInterceptor.java @@ -112,14 +112,17 @@ public void start(Listener responseListener, Metadata headers) { Span span = Span.current(); DatabaseName databaseName = extractDatabaseName(headers); String key = extractKey(databaseName, method.getFullMethodName()); + String requestId = extractRequestId(headers); TagContext tagContext = getTagContext(key, method.getFullMethodName(), databaseName); Attributes attributes = getMetricAttributes(key, method.getFullMethodName(), databaseName); Map builtInMetricsAttributes = getBuiltInMetricAttributes(key, databaseName); - builtInMetricsAttributes.put( - BuiltInMetricsConstant.REQUEST_ID_KEY.getKey(), extractRequestId(headers)); + builtInMetricsAttributes.put(BuiltInMetricsConstant.REQUEST_ID_KEY.getKey(), requestId); addBuiltInMetricAttributes(compositeTracer, builtInMetricsAttributes); + if (span != null) { + span.setAttribute(XGoogSpannerRequestId.REQUEST_ID, requestId); + } super.start( new SimpleForwardingClientCallListener(responseListener) { @Override From b2ec69fb2be900416c7eb13357899886340eb06d Mon Sep 17 00:00:00 2001 From: cloud-java-bot Date: Thu, 9 Oct 2025 06:40:06 +0000 Subject: [PATCH 2/4] chore: generate libraries at Thu Oct 9 06:37:27 UTC 2025 --- .github/workflows/update_generation_config.yaml | 2 +- README.md | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/update_generation_config.yaml b/.github/workflows/update_generation_config.yaml index 59e39834dd0..a7e14bb483c 100644 --- a/.github/workflows/update_generation_config.yaml +++ b/.github/workflows/update_generation_config.yaml @@ -26,7 +26,7 @@ jobs: # the branch into which the pull request is merged base_branch: main steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v4 with: fetch-depth: 0 token: ${{ secrets.CLOUD_JAVA_BOT_TOKEN }} diff --git a/README.md b/README.md index 6fc3af24e73..09bdb791d8a 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ If you are using Maven with [BOM][libraries-bom], add this to your pom.xml file: com.google.cloud libraries-bom - 26.68.0 + 26.69.0 pom import @@ -56,13 +56,13 @@ implementation 'com.google.cloud:google-cloud-spanner' If you are using Gradle without BOM, add this to your dependencies: ```Groovy -implementation 'com.google.cloud:google-cloud-spanner:6.101.1' +implementation 'com.google.cloud:google-cloud-spanner:6.102.0' ``` If you are using SBT, add this to your dependencies: ```Scala -libraryDependencies += "com.google.cloud" % "google-cloud-spanner" % "6.101.1" +libraryDependencies += "com.google.cloud" % "google-cloud-spanner" % "6.102.0" ``` ## Authentication @@ -731,7 +731,7 @@ Java is a registered trademark of Oracle and/or its affiliates. [kokoro-badge-link-5]: http://storage.googleapis.com/cloud-devrel-public/java/badges/java-spanner/java11.html [stability-image]: https://img.shields.io/badge/stability-stable-green [maven-version-image]: https://img.shields.io/maven-central/v/com.google.cloud/google-cloud-spanner.svg -[maven-version-link]: https://central.sonatype.com/artifact/com.google.cloud/google-cloud-spanner/6.101.1 +[maven-version-link]: https://central.sonatype.com/artifact/com.google.cloud/google-cloud-spanner/6.102.0 [authentication]: https://github.com/googleapis/google-cloud-java#authentication [auth-scopes]: https://developers.google.com/identity/protocols/oauth2/scopes [predefined-iam-roles]: https://cloud.google.com/iam/docs/understanding-roles#predefined_roles From 57519e800d7b8bc9cc54fd9fd4ff32de89174268 Mon Sep 17 00:00:00 2001 From: cloud-java-bot Date: Fri, 10 Oct 2025 05:28:32 +0000 Subject: [PATCH 3/4] chore: generate libraries at Fri Oct 10 05:25:43 UTC 2025 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 09bdb791d8a..0aa66b78751 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ If you are using Maven with [BOM][libraries-bom], add this to your pom.xml file: com.google.cloud libraries-bom - 26.69.0 + 26.70.0 pom import From 049a5cd85dbb8a24c61edacc81209bb380963d9a Mon Sep 17 00:00:00 2001 From: Surbhi Garg Date: Wed, 29 Oct 2025 22:44:07 +0530 Subject: [PATCH 4/4] test fix --- .../java/com/google/cloud/spanner/TraceWrapper.java | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/TraceWrapper.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/TraceWrapper.java index 14a69631eff..e19a63c034f 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/TraceWrapper.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/TraceWrapper.java @@ -60,7 +60,7 @@ class TraceWrapper { private final Tracer openCensusTracer; private final io.opentelemetry.api.trace.Tracer openTelemetryTracer; private final boolean enableExtendedTracing; - private final AttributesBuilder commonAttributesBuilder; + private final Attributes commonAttributes; TraceWrapper( Tracer openCensusTracer, @@ -69,7 +69,7 @@ class TraceWrapper { this.openTelemetryTracer = openTelemetryTracer; this.openCensusTracer = openCensusTracer; this.enableExtendedTracing = enableExtendedTracing; - this.commonAttributesBuilder = createCommonAttributes(); + this.commonAttributes = createCommonAttributes(); } ISpan spanBuilder(String spanName) { @@ -85,7 +85,8 @@ ISpan spanBuilder(String spanName, Attributes attributes) { return new OpenTelemetrySpan( openTelemetryTracer .spanBuilder(spanName) - .setAllAttributes(this.commonAttributesBuilder.putAll(attributes).build()) + .setAllAttributes(attributes) + .setAllAttributes(commonAttributes) .startSpan()); } else { return new OpenCensusSpan(openCensusTracer.spanBuilder(spanName).startSpan()); @@ -221,13 +222,13 @@ Attributes createDatabaseAttributes(DatabaseId db) { return builder.build(); } - private AttributesBuilder createCommonAttributes() { + private Attributes createCommonAttributes() { AttributesBuilder builder = Attributes.builder(); builder.put(GCP_CLIENT_SERVICE_KEY, "spanner"); builder.put(GCP_CLIENT_REPO_KEY, "googleapis/java-spanner"); builder.put(GCP_CLIENT_VERSION_KEY, GaxProperties.getLibraryVersion(TraceWrapper.class)); builder.put(CLOUD_REGION_KEY, BuiltInMetricsProvider.detectClientLocation()); - return builder; + return builder.build(); } private static String getTraceThreadName() {