Skip to content

Commit 9f72a64

Browse files
authored
chore: Add OpenTelemetry Metrics enable/disable configuration to Datastore (#12024)
Creates an option in DatastoreOpenTelemetryOptions to enable/disable metrics. Recording the metrics will be added in future PRs.
1 parent 3caee36 commit 9f72a64

File tree

4 files changed

+148
-43
lines changed

4 files changed

+148
-43
lines changed

java-datastore/google-cloud-datastore/src/main/java/com/google/cloud/datastore/DatastoreImpl.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -255,7 +255,7 @@ public T call() throws DatastoreException {
255255
public <T> T runInTransaction(final TransactionCallable<T> callable) {
256256
TraceUtil.Span span = otelTraceUtil.startSpan(SPAN_NAME_TRANSACTION_RUN);
257257
Callable<T> transactionCallable =
258-
(getOptions().getOpenTelemetryOptions().isEnabled()
258+
(getOptions().getOpenTelemetryOptions().isTracingEnabled()
259259
? new TracedReadWriteTransactionCallable<T>(
260260
this, callable, /* transactionOptions= */ null, span)
261261
: new ReadWriteTransactionCallable<T>(this, callable, /* transactionOptions= */ null));
@@ -279,7 +279,7 @@ public <T> T runInTransaction(
279279
TraceUtil.Span span = otelTraceUtil.startSpan(SPAN_NAME_TRANSACTION_RUN);
280280

281281
Callable<T> transactionCallable =
282-
(getOptions().getOpenTelemetryOptions().isEnabled()
282+
(getOptions().getOpenTelemetryOptions().isTracingEnabled()
283283
? new TracedReadWriteTransactionCallable<T>(this, callable, transactionOptions, span)
284284
: new ReadWriteTransactionCallable<T>(this, callable, transactionOptions));
285285

java-datastore/google-cloud-datastore/src/main/java/com/google/cloud/datastore/DatastoreOpenTelemetryOptions.java

Lines changed: 52 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -21,16 +21,41 @@
2121
import javax.annotation.Nullable;
2222

2323
public class DatastoreOpenTelemetryOptions {
24-
private final boolean enabled;
24+
private final boolean tracingEnabled;
25+
private final boolean metricsEnabled;
2526
private final @Nullable OpenTelemetry openTelemetry;
2627

2728
DatastoreOpenTelemetryOptions(Builder builder) {
28-
this.enabled = builder.enabled;
29+
this.tracingEnabled = builder.tracingEnabled;
30+
this.metricsEnabled = builder.metricsEnabled;
2931
this.openTelemetry = builder.openTelemetry;
3032
}
3133

34+
/**
35+
* Returns whether either tracing or metrics are enabled. Telemetry is disabled by default.
36+
*
37+
* @return {@code true} if either tracing or metrics are enabled, {@code false} otherwise.
38+
*/
3239
public boolean isEnabled() {
33-
return enabled;
40+
return tracingEnabled || metricsEnabled;
41+
}
42+
43+
/**
44+
* Returns whether tracing is enabled.
45+
*
46+
* @return {@code true} if tracing is enabled, {@code false} otherwise.
47+
*/
48+
public boolean isTracingEnabled() {
49+
return tracingEnabled;
50+
}
51+
52+
/**
53+
* Returns whether metrics are enabled.
54+
*
55+
* @return {@code true} if metrics are enabled, {@code false} otherwise.
56+
*/
57+
public boolean isMetricsEnabled() {
58+
return metricsEnabled;
3459
}
3560

3661
@Nullable
@@ -50,33 +75,43 @@ public static DatastoreOpenTelemetryOptions.Builder newBuilder() {
5075

5176
public static class Builder {
5277

53-
private boolean enabled;
78+
private boolean tracingEnabled;
79+
private boolean metricsEnabled;
5480

5581
@Nullable private OpenTelemetry openTelemetry;
5682

5783
private Builder() {
58-
enabled = false;
84+
tracingEnabled = false;
85+
metricsEnabled = false;
5986
openTelemetry = null;
6087
}
6188

6289
private Builder(DatastoreOpenTelemetryOptions options) {
63-
this.enabled = options.enabled;
90+
this.tracingEnabled = options.tracingEnabled;
91+
this.metricsEnabled = options.metricsEnabled;
6492
this.openTelemetry = options.openTelemetry;
6593
}
6694

67-
@Nonnull
68-
public DatastoreOpenTelemetryOptions build() {
69-
return new DatastoreOpenTelemetryOptions(this);
70-
}
71-
7295
/**
7396
* Sets whether tracing should be enabled.
7497
*
7598
* @param enabled Whether tracing should be enabled.
7699
*/
77100
@Nonnull
78101
public DatastoreOpenTelemetryOptions.Builder setTracingEnabled(boolean enabled) {
79-
this.enabled = enabled;
102+
this.tracingEnabled = enabled;
103+
return this;
104+
}
105+
106+
/**
107+
* Sets whether metrics should be enabled.
108+
*
109+
* @param enabled Whether metrics should be enabled.
110+
* @return the builder instance.
111+
*/
112+
@Nonnull
113+
public DatastoreOpenTelemetryOptions.Builder setMetricsEnabled(boolean enabled) {
114+
this.metricsEnabled = enabled;
80115
return this;
81116
}
82117

@@ -93,5 +128,10 @@ public DatastoreOpenTelemetryOptions.Builder setOpenTelemetry(
93128
this.openTelemetry = openTelemetry;
94129
return this;
95130
}
131+
132+
@Nonnull
133+
public DatastoreOpenTelemetryOptions build() {
134+
return new DatastoreOpenTelemetryOptions(this);
135+
}
96136
}
97137
}

java-datastore/google-cloud-datastore/src/main/java/com/google/cloud/datastore/telemetry/TraceUtil.java

Lines changed: 25 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -30,31 +30,30 @@
3030
/** Utility interface to manage OpenTelemetry tracing instrumentation based on the configuration. */
3131
@InternalExtensionOnly
3232
public interface TraceUtil {
33-
static final String ATTRIBUTE_SERVICE_PREFIX = "gcp.datastore.";
34-
static final String ENABLE_TRACING_ENV_VAR = "DATASTORE_ENABLE_TRACING";
35-
static final String LIBRARY_NAME = "com.google.cloud.datastore";
36-
static final String SPAN_NAME_LOOKUP = "Lookup";
37-
static final String SPAN_NAME_ALLOCATE_IDS = "AllocateIds";
38-
static final String SPAN_NAME_RESERVE_IDS = "ReserveIds";
39-
static final String SPAN_NAME_COMMIT = "Commit";
40-
static final String SPAN_NAME_RUN_QUERY = "RunQuery";
41-
static final String SPAN_NAME_RUN_AGGREGATION_QUERY = "RunAggregationQuery";
42-
static final String SPAN_NAME_TRANSACTION_RUN = "Transaction.Run";
43-
static final String SPAN_NAME_BEGIN_TRANSACTION = "Transaction.Begin";
44-
static final String SPAN_NAME_TRANSACTION_LOOKUP = "Transaction.Lookup";
45-
static final String SPAN_NAME_TRANSACTION_COMMIT = "Transaction.Commit";
46-
static final String SPAN_NAME_TRANSACTION_RUN_QUERY = "Transaction.RunQuery";
47-
static final String SPAN_NAME_ROLLBACK = "Transaction.Rollback";
48-
static final String SPAN_NAME_TRANSACTION_RUN_AGGREGATION_QUERY =
49-
"Transaction.RunAggregationQuery";
50-
static final String ATTRIBUTES_KEY_DOCUMENT_COUNT = "doc_count";
51-
static final String ATTRIBUTES_KEY_TRANSACTIONAL = "transactional";
52-
static final String ATTRIBUTES_KEY_TRANSACTION_ID = "transaction_id";
53-
static final String ATTRIBUTES_KEY_READ_CONSISTENCY = "read_consistency";
54-
static final String ATTRIBUTES_KEY_RECEIVED = "Received";
55-
static final String ATTRIBUTES_KEY_MISSING = "Missing";
56-
static final String ATTRIBUTES_KEY_DEFERRED = "Deferred";
57-
static final String ATTRIBUTES_KEY_MORE_RESULTS = "mor_results";
33+
String ATTRIBUTE_SERVICE_PREFIX = "gcp.datastore.";
34+
String ENABLE_TRACING_ENV_VAR = "DATASTORE_ENABLE_TRACING";
35+
String LIBRARY_NAME = "com.google.cloud.datastore";
36+
String SPAN_NAME_LOOKUP = "Lookup";
37+
String SPAN_NAME_ALLOCATE_IDS = "AllocateIds";
38+
String SPAN_NAME_RESERVE_IDS = "ReserveIds";
39+
String SPAN_NAME_COMMIT = "Commit";
40+
String SPAN_NAME_RUN_QUERY = "RunQuery";
41+
String SPAN_NAME_RUN_AGGREGATION_QUERY = "RunAggregationQuery";
42+
String SPAN_NAME_TRANSACTION_RUN = "Transaction.Run";
43+
String SPAN_NAME_BEGIN_TRANSACTION = "Transaction.Begin";
44+
String SPAN_NAME_TRANSACTION_LOOKUP = "Transaction.Lookup";
45+
String SPAN_NAME_TRANSACTION_COMMIT = "Transaction.Commit";
46+
String SPAN_NAME_TRANSACTION_RUN_QUERY = "Transaction.RunQuery";
47+
String SPAN_NAME_ROLLBACK = "Transaction.Rollback";
48+
String SPAN_NAME_TRANSACTION_RUN_AGGREGATION_QUERY = "Transaction.RunAggregationQuery";
49+
String ATTRIBUTES_KEY_DOCUMENT_COUNT = "doc_count";
50+
String ATTRIBUTES_KEY_TRANSACTIONAL = "transactional";
51+
String ATTRIBUTES_KEY_TRANSACTION_ID = "transaction_id";
52+
String ATTRIBUTES_KEY_READ_CONSISTENCY = "read_consistency";
53+
String ATTRIBUTES_KEY_RECEIVED = "Received";
54+
String ATTRIBUTES_KEY_MISSING = "Missing";
55+
String ATTRIBUTES_KEY_DEFERRED = "Deferred";
56+
String ATTRIBUTES_KEY_MORE_RESULTS = "more_results";
5857

5958
/**
6059
* Creates and returns an instance of the TraceUtil class.
@@ -64,7 +63,7 @@ public interface TraceUtil {
6463
* @return An instance of the TraceUtil class.
6564
*/
6665
static TraceUtil getInstance(@Nonnull DatastoreOptions datastoreOptions) {
67-
boolean createEnabledInstance = datastoreOptions.getOpenTelemetryOptions().isEnabled();
66+
boolean createEnabledInstance = datastoreOptions.getOpenTelemetryOptions().isTracingEnabled();
6867

6968
// The environment variable can override options to enable/disable telemetry collection.
7069
String enableTracingEnvVar = System.getenv(ENABLE_TRACING_ENV_VAR);

java-datastore/google-cloud-datastore/src/test/java/com/google/cloud/datastore/DatastoreOptionsTest.java

Lines changed: 69 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import static com.google.common.truth.Truth.assertThat;
2020
import static org.junit.Assert.assertEquals;
21+
import static org.junit.Assert.assertFalse;
2122
import static org.junit.Assert.assertNotEquals;
2223
import static org.junit.Assert.assertSame;
2324
import static org.junit.Assert.assertTrue;
@@ -79,18 +80,83 @@ public void testHost() {
7980
assertEquals("http://localhost:" + PORT, options.build().getHost());
8081
}
8182

83+
@Test
84+
public void testOpenTelemetryOptionsDefault() {
85+
DatastoreOpenTelemetryOptions o1 = DatastoreOpenTelemetryOptions.newBuilder().build();
86+
assertFalse(o1.isMetricsEnabled());
87+
assertFalse(o1.isTracingEnabled());
88+
assertFalse(o1.isEnabled());
89+
}
90+
8291
@Test
8392
public void testOpenTelemetryOptionsEnabled() {
8493
options.setOpenTelemetryOptions(
85-
DatastoreOpenTelemetryOptions.newBuilder().setTracingEnabled(true).build());
94+
DatastoreOpenTelemetryOptions.newBuilder()
95+
.setTracingEnabled(true)
96+
.setMetricsEnabled(true)
97+
.build());
8698
assertTrue(options.build().getOpenTelemetryOptions().isEnabled());
99+
assertTrue(options.build().getOpenTelemetryOptions().isTracingEnabled());
100+
assertTrue(options.build().getOpenTelemetryOptions().isMetricsEnabled());
87101
}
88102

89103
@Test
90104
public void testOpenTelemetryOptionsDisabled() {
91105
options.setOpenTelemetryOptions(
92-
DatastoreOpenTelemetryOptions.newBuilder().setTracingEnabled(false).build());
93-
assertTrue(!options.build().getOpenTelemetryOptions().isEnabled());
106+
DatastoreOpenTelemetryOptions.newBuilder()
107+
.setTracingEnabled(false)
108+
.setMetricsEnabled(false)
109+
.build());
110+
assertFalse(options.build().getOpenTelemetryOptions().isEnabled());
111+
assertFalse(options.build().getOpenTelemetryOptions().isTracingEnabled());
112+
assertFalse(options.build().getOpenTelemetryOptions().isMetricsEnabled());
113+
}
114+
115+
@Test
116+
public void testOpenTelemetryTracingEnabled() {
117+
DatastoreOpenTelemetryOptions o1 =
118+
DatastoreOpenTelemetryOptions.newBuilder().setTracingEnabled(false).build();
119+
assertFalse(o1.isTracingEnabled());
120+
assertFalse(o1.isEnabled());
121+
122+
DatastoreOpenTelemetryOptions o2 =
123+
DatastoreOpenTelemetryOptions.newBuilder().setTracingEnabled(true).build();
124+
assertTrue(o2.isTracingEnabled());
125+
assertTrue(o2.isEnabled());
126+
}
127+
128+
@Test
129+
public void testOpenTelemetryMetricsEnabled() {
130+
DatastoreOpenTelemetryOptions o1 =
131+
DatastoreOpenTelemetryOptions.newBuilder().setMetricsEnabled(false).build();
132+
assertFalse(o1.isMetricsEnabled());
133+
assertFalse(o1.isEnabled());
134+
135+
DatastoreOpenTelemetryOptions o2 =
136+
DatastoreOpenTelemetryOptions.newBuilder().setMetricsEnabled(true).build();
137+
assertTrue(o2.isMetricsEnabled());
138+
assertTrue(o2.isEnabled());
139+
}
140+
141+
@Test
142+
public void testTelemetrySignalsMixedEnabled() {
143+
DatastoreOpenTelemetryOptions o1 =
144+
DatastoreOpenTelemetryOptions.newBuilder()
145+
.setTracingEnabled(true)
146+
.setMetricsEnabled(false)
147+
.build();
148+
assertTrue(o1.isTracingEnabled());
149+
assertFalse(o1.isMetricsEnabled());
150+
assertTrue(o1.isEnabled());
151+
152+
DatastoreOpenTelemetryOptions o2 =
153+
DatastoreOpenTelemetryOptions.newBuilder()
154+
.setTracingEnabled(false)
155+
.setMetricsEnabled(true)
156+
.build();
157+
assertFalse(o2.isTracingEnabled());
158+
assertTrue(o2.isMetricsEnabled());
159+
assertTrue(o2.isEnabled());
94160
}
95161

96162
@Test

0 commit comments

Comments
 (0)