Skip to content

Commit 863dc63

Browse files
committed
feat: Refactor OpenTelemetry Tracer and Metrics
1 parent 588adba commit 863dc63

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

47 files changed

+1198
-416
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ nosetests.xml
2222
.settings
2323
.DS_Store
2424
.classpath
25+
.tool-versions
2526

2627
# Built documentation
2728
docs/

google-cloud-spanner/clirr-ignored-differences.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -347,7 +347,6 @@
347347
<className>com/google/cloud/spanner/connection/Connection</className>
348348
<method>void rollbackToSavepoint(java.lang.String)</method>
349349
</difference>
350-
351350
<!-- Delay start transaction -->
352351
<difference>
353352
<differenceType>7012</differenceType>
@@ -460,6 +459,7 @@
460459
<differenceType>7013</differenceType>
461460
<className>com/google/cloud/spanner/Dialect</className>
462461
<method>java.lang.String getDefaultSchema()</method>
462+
</difference>
463463
<difference>
464464
<differenceType>7005</differenceType>
465465
<className>com/google/cloud/spanner/PartitionedDmlTransaction</className>

google-cloud-spanner/pom.xml

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
<site.installationModule>google-cloud-spanner</site.installationModule>
1818
<opencensus.version>0.31.1</opencensus.version>
1919
<opentelemetry.version>1.32.0</opentelemetry.version>
20-
<graalvm.version>22.3.3</graalvm.version>
2120
<spanner.testenv.config.class>com.google.cloud.spanner.GceTestEnvConfig</spanner.testenv.config.class>
2221
<spanner.testenv.instance>projects/gcloud-devel/instances/spanner-testing-east1</spanner.testenv.instance>
2322
<spanner.gce.config.project_id>gcloud-devel</spanner.gce.config.project_id>
@@ -396,7 +395,6 @@
396395
<version>2.2</version>
397396
<scope>test</scope>
398397
</dependency>
399-
400398
<!-- Benchmarking dependencies -->
401399
<dependency>
402400
<groupId>org.openjdk.jmh</groupId>
@@ -410,7 +408,6 @@
410408
<version>1.37</version>
411409
<scope>test</scope>
412410
</dependency>
413-
414411
<!-- OpenTelemetry test dependencies -->
415412
<dependency>
416413
<groupId>io.opentelemetry</groupId>
@@ -436,9 +433,7 @@
436433
<version>${opentelemetry.version}</version>
437434
<scope>test</scope>
438435
</dependency>
439-
440436
</dependencies>
441-
442437
<profiles>
443438
<profile>
444439
<id>java9</id>

google-cloud-spanner/src/main/java/com/google/cloud/spanner/AbstractReadContext.java

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,6 @@
5454
import com.google.spanner.v1.Transaction;
5555
import com.google.spanner.v1.TransactionOptions;
5656
import com.google.spanner.v1.TransactionSelector;
57-
import io.opencensus.trace.Tracing;
58-
import io.opentelemetry.context.Context;
5957
import java.util.Map;
6058
import java.util.concurrent.atomic.AtomicLong;
6159
import javax.annotation.Nullable;
@@ -71,10 +69,8 @@ abstract class AbstractReadContext
7169
abstract static class Builder<B extends Builder<?, T>, T extends AbstractReadContext> {
7270
private SessionImpl session;
7371
private SpannerRpc rpc;
74-
private ISpan span =
75-
new DualSpan(
76-
Tracing.getTracer().getCurrentSpan(),
77-
io.opentelemetry.api.trace.Span.fromContext(Context.current()));
72+
private ISpan span;
73+
private TraceWrapper tracer;
7874
private int defaultPrefetchChunks = SpannerOptions.Builder.DEFAULT_PREFETCH_CHUNKS;
7975
private QueryOptions defaultQueryOptions = SpannerOptions.Builder.DEFAULT_QUERY_OPTIONS;
8076
private DirectedReadOptions defaultDirectedReadOption;
@@ -103,6 +99,11 @@ B setSpan(ISpan span) {
10399
return self();
104100
}
105101

102+
B setTracer(TraceWrapper tracer) {
103+
this.tracer = tracer;
104+
return self();
105+
}
106+
106107
B setDefaultPrefetchChunks(int defaultPrefetchChunks) {
107108
this.defaultPrefetchChunks = defaultPrefetchChunks;
108109
return self();
@@ -395,10 +396,7 @@ void initTransaction() {
395396
span.addAnnotation(
396397
"Transaction Creation Done",
397398
ImmutableMap.of(
398-
"Id",
399-
transaction.getId().toStringUtf8(),
400-
"Timestamp",
401-
Timestamp.fromProto(transaction.getReadTimestamp()).toString()));
399+
"Id", transaction.getId().toStringUtf8(), "Timestamp", timestamp.toString()));
402400

403401
} catch (SpannerException e) {
404402
span.addAnnotation("Transaction Creation Failed", e);
@@ -413,6 +411,7 @@ void initTransaction() {
413411
final SpannerRpc rpc;
414412
final ExecutorProvider executorProvider;
415413
ISpan span;
414+
TraceWrapper tracer;
416415
private final int defaultPrefetchChunks;
417416
private final QueryOptions defaultQueryOptions;
418417

@@ -445,6 +444,7 @@ void initTransaction() {
445444
this.span = builder.span;
446445
this.executorProvider = builder.executorProvider;
447446
this.clock = builder.clock;
447+
this.tracer = builder.tracer;
448448
}
449449

450450
@Override
@@ -702,6 +702,7 @@ ResultSet executeQueryInternalWithOptions(
702702
MAX_BUFFERED_CHUNKS,
703703
SpannerImpl.QUERY,
704704
span,
705+
tracer,
705706
rpc.getExecuteQueryRetrySettings(),
706707
rpc.getExecuteQueryRetryableCodes()) {
707708
@Override
@@ -847,6 +848,7 @@ ResultSet readInternalWithOptions(
847848
MAX_BUFFERED_CHUNKS,
848849
SpannerImpl.READ,
849850
span,
851+
tracer,
850852
rpc.getReadRetrySettings(),
851853
rpc.getReadRetryableCodes()) {
852854
@Override

google-cloud-spanner/src/main/java/com/google/cloud/spanner/AbstractResultSet.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,6 @@
4949
import com.google.spanner.v1.Transaction;
5050
import com.google.spanner.v1.TypeCode;
5151
import io.grpc.Context;
52-
import io.opencensus.trace.Tracing;
5352
import java.io.IOException;
5453
import java.io.Serializable;
5554
import java.math.BigDecimal;
@@ -77,7 +76,6 @@
7776

7877
/** Implementation of {@link ResultSet}. */
7978
abstract class AbstractResultSet<R> extends AbstractStructReader implements ResultSet {
80-
private static final TraceWrapper tracer = new TraceWrapper(Tracing.getTracer());
8179
private static final com.google.protobuf.Value NULL_VALUE =
8280
com.google.protobuf.Value.newBuilder().setNullValue(NullValue.NULL_VALUE).build();
8381

@@ -1089,6 +1087,7 @@ abstract static class ResumableStreamIterator extends AbstractIterator<PartialRe
10891087
private final LinkedList<PartialResultSet> buffer = new LinkedList<>();
10901088
private final int maxBufferSize;
10911089
private final ISpan span;
1090+
private final TraceWrapper tracer;
10921091
private CloseableIterator<PartialResultSet> stream;
10931092
private ByteString resumeToken;
10941093
private boolean finished;
@@ -1103,10 +1102,12 @@ protected ResumableStreamIterator(
11031102
int maxBufferSize,
11041103
String streamName,
11051104
ISpan parent,
1105+
TraceWrapper tracer,
11061106
RetrySettings streamingRetrySettings,
11071107
Set<Code> retryableCodes) {
11081108
checkArgument(maxBufferSize >= 0);
11091109
this.maxBufferSize = maxBufferSize;
1110+
this.tracer = tracer;
11101111
this.span = tracer.spanBuilderWithExplicitParent(streamName, parent);
11111112
this.streamingRetrySettings = Preconditions.checkNotNull(streamingRetrySettings);
11121113
this.retryableCodes = Preconditions.checkNotNull(retryableCodes);

google-cloud-spanner/src/main/java/com/google/cloud/spanner/BatchClientImpl.java

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@
3030
import com.google.spanner.v1.PartitionReadRequest;
3131
import com.google.spanner.v1.PartitionResponse;
3232
import com.google.spanner.v1.TransactionSelector;
33-
import io.opencensus.trace.Tracing;
3433
import java.util.List;
3534
import java.util.Map;
3635
import javax.annotation.Nullable;
@@ -62,7 +61,9 @@ public BatchReadOnlyTransaction batchReadOnlyTransaction(TimestampBound bound) {
6261
.setExecutorProvider(sessionClient.getSpanner().getAsyncExecutorProvider())
6362
.setDefaultPrefetchChunks(sessionClient.getSpanner().getDefaultPrefetchChunks())
6463
.setDefaultDirectedReadOptions(
65-
sessionClient.getSpanner().getOptions().getDirectedReadOptions()),
64+
sessionClient.getSpanner().getOptions().getDirectedReadOptions())
65+
.setSpan(sessionClient.getSpanner().getTracer().getCurrentSpan())
66+
.setTracer(sessionClient.getSpanner().getTracer()),
6667
checkNotNull(bound));
6768
}
6869

@@ -81,7 +82,9 @@ public BatchReadOnlyTransaction batchReadOnlyTransaction(BatchTransactionId batc
8182
.setExecutorProvider(sessionClient.getSpanner().getAsyncExecutorProvider())
8283
.setDefaultPrefetchChunks(sessionClient.getSpanner().getDefaultPrefetchChunks())
8384
.setDefaultDirectedReadOptions(
84-
sessionClient.getSpanner().getOptions().getDirectedReadOptions()),
85+
sessionClient.getSpanner().getOptions().getDirectedReadOptions())
86+
.setSpan(sessionClient.getSpanner().getTracer().getCurrentSpan())
87+
.setTracer(sessionClient.getSpanner().getTracer()),
8588
batchTransactionId);
8689
}
8790

@@ -95,11 +98,6 @@ private static class BatchReadOnlyTransactionImpl extends MultiUseReadOnlyTransa
9598
super(builder.setTimestampBound(bound));
9699
this.sessionName = session.getName();
97100
this.options = session.getOptions();
98-
setSpan(
99-
new DualSpan(
100-
Tracing.getTracer().getCurrentSpan(),
101-
io.opentelemetry.api.trace.Span.fromContext(
102-
io.opentelemetry.context.Context.current())));
103101
initTransaction();
104102
}
105103

@@ -108,11 +106,6 @@ private static class BatchReadOnlyTransactionImpl extends MultiUseReadOnlyTransa
108106
super(builder.setTransactionId(batchTransactionId.getTransactionId()));
109107
this.sessionName = session.getName();
110108
this.options = session.getOptions();
111-
setSpan(
112-
new DualSpan(
113-
Tracing.getTracer().getCurrentSpan(),
114-
io.opentelemetry.api.trace.Span.fromContext(
115-
io.opentelemetry.context.Context.current())));
116109
}
117110

118111
@Override

google-cloud-spanner/src/main/java/com/google/cloud/spanner/DatabaseClientImpl.java

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -26,25 +26,25 @@
2626
import com.google.common.base.Function;
2727
import com.google.common.util.concurrent.ListenableFuture;
2828
import com.google.spanner.v1.BatchWriteResponse;
29-
import io.opencensus.trace.Tracing;
3029
import javax.annotation.Nullable;
3130

3231
class DatabaseClientImpl implements DatabaseClient {
3332
private static final String READ_WRITE_TRANSACTION = "CloudSpanner.ReadWriteTransaction";
3433
private static final String READ_ONLY_TRANSACTION = "CloudSpanner.ReadOnlyTransaction";
3534
private static final String PARTITION_DML_TRANSACTION = "CloudSpanner.PartitionDMLTransaction";
36-
private static final TraceWrapper tracer = new TraceWrapper(Tracing.getTracer());
35+
private final TraceWrapper tracer;
3736
@VisibleForTesting final String clientId;
3837
@VisibleForTesting final SessionPool pool;
3938

4039
@VisibleForTesting
41-
DatabaseClientImpl(SessionPool pool) {
42-
this("", pool);
40+
DatabaseClientImpl(SessionPool pool, TraceWrapper tracer) {
41+
this("", pool, tracer);
4342
}
4443

45-
DatabaseClientImpl(String clientId, SessionPool pool) {
44+
DatabaseClientImpl(String clientId, SessionPool pool, TraceWrapper tracer) {
4645
this.clientId = clientId;
4746
this.pool = pool;
47+
this.tracer = tracer;
4848
}
4949

5050
@VisibleForTesting
@@ -198,9 +198,8 @@ public TransactionRunner readWriteTransaction(TransactionOption... options) {
198198
return getSession().readWriteTransaction(options);
199199
} catch (RuntimeException e) {
200200
span.setStatus(e);
201-
throw e;
202-
} finally {
203201
span.end();
202+
throw e;
204203
}
205204
}
206205

google-cloud-spanner/src/main/java/com/google/cloud/spanner/ISpan.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616

1717
package com.google.cloud.spanner;
1818

19-
import io.opencensus.trace.Status;
2019
import java.util.Map;
2120

2221
interface ISpan {
@@ -40,7 +39,7 @@ interface ISpan {
4039

4140
void setStatus(Throwable e);
4241

43-
void setStatus(Status status);
42+
void setStatus(ErrorCode errorCode);
4443

4544
void end();
4645
}

google-cloud-spanner/src/main/java/com/google/cloud/spanner/MetricRegistryConstants.java

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -65,16 +65,19 @@ class MetricRegistryConstants {
6565
/** Unit to represent counts. */
6666
static final String COUNT = "1";
6767

68+
static final String Instrumentation_Scope = "cloud.google.com/java";
69+
70+
static final String METRIC_PREFIX = "cloud.google.com/java/";
71+
6872
// The Metric name and description
69-
static final String MAX_IN_USE_SESSIONS = "cloud.google.com/java/spanner/max_in_use_sessions";
70-
static final String MAX_ALLOWED_SESSIONS = "cloud.google.com/java/spanner/max_allowed_sessions";
71-
static final String GET_SESSION_TIMEOUTS = "cloud.google.com/java/spanner/get_session_timeouts";
72-
static final String NUM_ACQUIRED_SESSIONS = "cloud.google.com/java/spanner/num_acquired_sessions";
73-
static final String NUM_RELEASED_SESSIONS = "cloud.google.com/java/spanner/num_released_sessions";
74-
static final String NUM_SESSIONS_IN_POOL = "cloud.google.com/java/spanner/num_sessions_in_pool";
75-
static final String NUM_SESSIONS_IN_USE = "cloud.google.com/java/spanner/num_in_use_sessions";
76-
static final String NUM_SESSIONS_AVAILABLE =
77-
"cloud.google.com/java/spanner/num_available_sessions";
73+
static final String MAX_IN_USE_SESSIONS = "spanner/max_in_use_sessions";
74+
static final String MAX_ALLOWED_SESSIONS = "spanner/max_allowed_sessions";
75+
static final String GET_SESSION_TIMEOUTS = "spanner/get_session_timeouts";
76+
static final String NUM_ACQUIRED_SESSIONS = "spanner/num_acquired_sessions";
77+
static final String NUM_RELEASED_SESSIONS = "spanner/num_released_sessions";
78+
static final String NUM_SESSIONS_IN_POOL = "spanner/num_sessions_in_pool";
79+
static final String NUM_SESSIONS_IN_USE = "spanner/num_in_use_sessions";
80+
static final String NUM_SESSIONS_AVAILABLE = "spanner/num_available_sessions";
7881
static final String SESSIONS_TYPE = "session_type";
7982

8083
static final String MAX_IN_USE_SESSIONS_DESCRIPTION =
@@ -89,12 +92,10 @@ class MetricRegistryConstants {
8992
"The number of sessions released by the user and pool maintainer.";
9093
static final String NUM_SESSIONS_IN_POOL_DESCRIPTION = "The number of sessions in the pool.";
9194

92-
static final String Scope = "cloud.google.com/java/spanner";
93-
static final String SPANNER_GFE_LATENCY = "cloud.google.com/java/spanner/gfe_latency";
95+
static final String SPANNER_GFE_LATENCY = "spanner/gfe_latency";
9496
static final String SPANNER_GFE_LATENCY_DESCRIPTION =
9597
"Latency between Google's network receiving an RPC and reading back the first byte of the response";
96-
static final String SPANNER_GFE_HEADER_MISSING_COUNT =
97-
"cloud.google.com/java/spanner/gfe_header_missing_count";
98+
static final String SPANNER_GFE_HEADER_MISSING_COUNT = "spanner/gfe_header_missing_count";
9899
static final String SPANNER_GFE_HEADER_MISSING_COUNT_DESCRIPTION =
99100
"Number of RPC responses received without the server-timing header, most likely means that the RPC never reached Google's network";
100101
static final String MILLISECOND = "ms";

google-cloud-spanner/src/main/java/com/google/cloud/spanner/DualScope.java renamed to google-cloud-spanner/src/main/java/com/google/cloud/spanner/OpenCensusScope.java

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,23 +18,18 @@
1818

1919
import io.opencensus.common.Scope;
2020

21-
class DualScope implements IScope {
21+
class OpenCensusScope implements IScope {
2222

2323
private final Scope openCensusScope;
24-
private final io.opentelemetry.context.Scope openTelemetryScope;
2524

26-
public DualScope(Scope openCensusScope, io.opentelemetry.context.Scope openTelemetryScope) {
25+
OpenCensusScope(Scope openCensusScope) {
2726
this.openCensusScope = openCensusScope;
28-
this.openTelemetryScope = openTelemetryScope;
2927
}
3028

3129
@Override
3230
public void close() {
3331
if (openCensusScope != null) {
3432
openCensusScope.close();
3533
}
36-
if (openTelemetryScope != null) {
37-
openTelemetryScope.close();
38-
}
3934
}
4035
}

0 commit comments

Comments
 (0)