Skip to content

Commit a341eb8

Browse files
authored
fix: support override monitoring endpoint (#2364)
* fix: support override monitoring endpoint * format * update default * add nullable annotation * update * update
1 parent 9d24c45 commit a341eb8

File tree

8 files changed

+113
-24
lines changed

8 files changed

+113
-24
lines changed

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

+10
Original file line numberDiff line numberDiff line change
@@ -265,4 +265,14 @@
265265
<className>com/google/cloud/bigtable/admin/v2/stub/EnhancedBigtableTableAdminStub</className>
266266
<method>*</method>
267267
</difference>
268+
<difference>
269+
<differenceType>7004</differenceType>
270+
<className>com/google/cloud/bigtable/data/v2/stub/metrics/BigtableCloudMonitoringExporter</className>
271+
<method>*</method>
272+
</difference>
273+
<difference>
274+
<differenceType>7004</differenceType>
275+
<className>com/google/cloud/bigtable/data/v2/stub/metrics/DefaultMetricsProvider</className>
276+
<method>*</method>
277+
</difference>
268278
</differences>

google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/BigtableDataClientFactory.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,8 @@ public static BigtableDataClientFactory create(BigtableDataSettings defaultSetti
9090
EnhancedBigtableStub.getOpenTelemetry(
9191
defaultSettings.getProjectId(),
9292
defaultSettings.getMetricsProvider(),
93-
sharedClientContext.getCredentials());
93+
sharedClientContext.getCredentials(),
94+
defaultSettings.getStubSettings().getMetricsEndpoint());
9495
} catch (Throwable t) {
9596
logger.log(Level.WARNING, "Failed to get OTEL, will skip exporting client side metrics", t);
9697
}

google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/EnhancedBigtableStub.java

+12-4
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,8 @@ public static EnhancedBigtableStub create(EnhancedBigtableStubSettings settings)
223223
getOpenTelemetry(
224224
settings.getProjectId(),
225225
settings.getMetricsProvider(),
226-
clientContext.getCredentials());
226+
clientContext.getCredentials(),
227+
settings.getMetricsEndpoint());
227228
} catch (Throwable t) {
228229
logger.log(Level.WARNING, "Failed to get OTEL, will skip exporting client side metrics", t);
229230
}
@@ -268,7 +269,11 @@ public static ClientContext createClientContext(EnhancedBigtableStubSettings set
268269
// We don't want client side metrics to crash the client, so catch any exception when getting
269270
// the OTEL instance and log the exception instead.
270271
openTelemetry =
271-
getOpenTelemetry(settings.getProjectId(), settings.getMetricsProvider(), credentials);
272+
getOpenTelemetry(
273+
settings.getProjectId(),
274+
settings.getMetricsProvider(),
275+
credentials,
276+
settings.getMetricsEndpoint());
272277
} catch (Throwable t) {
273278
logger.log(Level.WARNING, "Failed to get OTEL, will skip exporting client side metrics", t);
274279
}
@@ -378,7 +383,10 @@ public static ApiTracerFactory createBigtableTracerFactory(
378383

379384
@Nullable
380385
public static OpenTelemetry getOpenTelemetry(
381-
String projectId, MetricsProvider metricsProvider, @Nullable Credentials defaultCredentials)
386+
String projectId,
387+
MetricsProvider metricsProvider,
388+
@Nullable Credentials defaultCredentials,
389+
@Nullable String metricsEndpoint)
382390
throws IOException {
383391
if (metricsProvider instanceof CustomOpenTelemetryMetricsProvider) {
384392
CustomOpenTelemetryMetricsProvider customMetricsProvider =
@@ -390,7 +398,7 @@ public static OpenTelemetry getOpenTelemetry(
390398
? BigtableDataSettings.getMetricsCredentials()
391399
: defaultCredentials;
392400
DefaultMetricsProvider defaultMetricsProvider = (DefaultMetricsProvider) metricsProvider;
393-
return defaultMetricsProvider.getOpenTelemetry(projectId, credentials);
401+
return defaultMetricsProvider.getOpenTelemetry(projectId, metricsEndpoint, credentials);
394402
} else if (metricsProvider instanceof NoopMetricsProvider) {
395403
return null;
396404
}

google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/EnhancedBigtableStubSettings.java

+33
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@
6565
import java.util.Set;
6666
import java.util.logging.Logger;
6767
import javax.annotation.Nonnull;
68+
import javax.annotation.Nullable;
6869
import org.threeten.bp.Duration;
6970

7071
/**
@@ -250,6 +251,7 @@ public class EnhancedBigtableStubSettings extends StubSettings<EnhancedBigtableS
250251
private final FeatureFlags featureFlags;
251252

252253
private final MetricsProvider metricsProvider;
254+
@Nullable private final String metricsEndpoint;
253255

254256
private EnhancedBigtableStubSettings(Builder builder) {
255257
super(builder);
@@ -278,6 +280,7 @@ private EnhancedBigtableStubSettings(Builder builder) {
278280
enableRoutingCookie = builder.enableRoutingCookie;
279281
enableRetryInfo = builder.enableRetryInfo;
280282
metricsProvider = builder.metricsProvider;
283+
metricsEndpoint = builder.metricsEndpoint;
281284

282285
// Per method settings.
283286
readRowsSettings = builder.readRowsSettings.build();
@@ -362,6 +365,15 @@ public boolean getEnableRetryInfo() {
362365
return enableRetryInfo;
363366
}
364367

368+
/**
369+
* Gets the Google Cloud Monitoring endpoint for publishing client side metrics. If it's null,
370+
* client will publish metrics to the default monitoring endpoint.
371+
*/
372+
@Nullable
373+
public String getMetricsEndpoint() {
374+
return metricsEndpoint;
375+
}
376+
365377
/** Returns a builder for the default ChannelProvider for this service. */
366378
public static InstantiatingGrpcChannelProvider.Builder defaultGrpcTransportProviderBuilder() {
367379
Boolean isDirectpathEnabled = Boolean.parseBoolean(System.getenv(CBT_ENABLE_DIRECTPATH));
@@ -684,6 +696,7 @@ public static class Builder extends StubSettings.Builder<EnhancedBigtableStubSet
684696
private FeatureFlags.Builder featureFlags;
685697

686698
private MetricsProvider metricsProvider;
699+
@Nullable private String metricsEndpoint;
687700

688701
/**
689702
* Initializes a new Builder with sane defaults for all settings.
@@ -831,6 +844,7 @@ private Builder(EnhancedBigtableStubSettings settings) {
831844
enableRoutingCookie = settings.enableRoutingCookie;
832845
enableRetryInfo = settings.enableRetryInfo;
833846
metricsProvider = settings.metricsProvider;
847+
metricsEndpoint = settings.getMetricsEndpoint();
834848

835849
// Per method settings.
836850
readRowsSettings = settings.readRowsSettings.toBuilder();
@@ -999,6 +1013,24 @@ public MetricsProvider getMetricsProvider() {
9991013
return this.metricsProvider;
10001014
}
10011015

1016+
/**
1017+
* Built-in client side metrics are published through Google Cloud Monitoring endpoint. This
1018+
* setting overrides the default endpoint for publishing the metrics.
1019+
*/
1020+
public Builder setMetricsEndpoint(String endpoint) {
1021+
this.metricsEndpoint = endpoint;
1022+
return this;
1023+
}
1024+
1025+
/**
1026+
* Get the Google Cloud Monitoring endpoint for publishing client side metrics. If it's null,
1027+
* client will publish metrics to the default monitoring endpoint.
1028+
*/
1029+
@Nullable
1030+
public String getMetricsEndpoint() {
1031+
return metricsEndpoint;
1032+
}
1033+
10021034
@InternalApi("Used for internal testing")
10031035
public Map<String, String> getJwtAudienceMapping() {
10041036
return jwtAudienceMapping;
@@ -1184,6 +1216,7 @@ public String toString() {
11841216
.add("pingAndWarmSettings", pingAndWarmSettings)
11851217
.add("executeQuerySettings", executeQuerySettings)
11861218
.add("metricsProvider", metricsProvider)
1219+
.add("metricsEndpoint", metricsEndpoint)
11871220
.add("parent", super.toString())
11881221
.toString();
11891222
}

google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/BigtableCloudMonitoringExporter.java

+16-8
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@
3939
import com.google.cloud.monitoring.v3.MetricServiceClient;
4040
import com.google.cloud.monitoring.v3.MetricServiceSettings;
4141
import com.google.common.annotations.VisibleForTesting;
42-
import com.google.common.base.MoreObjects;
4342
import com.google.common.collect.ImmutableList;
4443
import com.google.common.collect.ImmutableSet;
4544
import com.google.common.collect.Iterables;
@@ -79,11 +78,12 @@ public final class BigtableCloudMonitoringExporter implements MetricExporter {
7978
Logger.getLogger(BigtableCloudMonitoringExporter.class.getName());
8079

8180
// This system property can be used to override the monitoring endpoint
82-
// to a different environment. It's meant for internal testing only.
83-
private static final String MONITORING_ENDPOINT =
84-
MoreObjects.firstNonNull(
85-
System.getProperty("bigtable.test-monitoring-endpoint"),
86-
MetricServiceSettings.getDefaultEndpoint());
81+
// to a different environment. It's meant for internal testing only and
82+
// will be removed in future versions. Use settings in EnhancedBigtableStubSettings
83+
// to override the endpoint.
84+
@Deprecated @Nullable
85+
private static final String MONITORING_ENDPOINT_OVERRIDE_SYS_PROP =
86+
System.getProperty("bigtable.test-monitoring-endpoint");
8787

8888
private static final String APPLICATION_RESOURCE_PROJECT_ID = "project_id";
8989

@@ -126,14 +126,22 @@ public final class BigtableCloudMonitoringExporter implements MetricExporter {
126126
.collect(ImmutableList.toImmutableList());
127127

128128
public static BigtableCloudMonitoringExporter create(
129-
String projectId, @Nullable Credentials credentials) throws IOException {
129+
String projectId, @Nullable Credentials credentials, @Nullable String endpoint)
130+
throws IOException {
130131
MetricServiceSettings.Builder settingsBuilder = MetricServiceSettings.newBuilder();
131132
CredentialsProvider credentialsProvider =
132133
Optional.ofNullable(credentials)
133134
.<CredentialsProvider>map(FixedCredentialsProvider::create)
134135
.orElse(NoCredentialsProvider.create());
135136
settingsBuilder.setCredentialsProvider(credentialsProvider);
136-
settingsBuilder.setEndpoint(MONITORING_ENDPOINT);
137+
if (MONITORING_ENDPOINT_OVERRIDE_SYS_PROP != null) {
138+
logger.warning(
139+
"Setting the monitoring endpoint through system variable will be removed in future versions");
140+
settingsBuilder.setEndpoint(MONITORING_ENDPOINT_OVERRIDE_SYS_PROP);
141+
}
142+
if (endpoint != null) {
143+
settingsBuilder.setEndpoint(endpoint);
144+
}
137145

138146
org.threeten.bp.Duration timeout = Duration.ofMinutes(1);
139147
// TODO: createServiceTimeSeries needs special handling if the request failed. Leaving

google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/BuiltinMetricsView.java

+20-3
Original file line numberDiff line numberDiff line change
@@ -37,19 +37,36 @@ private BuiltinMetricsView() {}
3737

3838
/**
3939
* Register built-in metrics on the {@link SdkMeterProviderBuilder} with application default
40-
* credentials.
40+
* credentials and default endpoint.
4141
*/
4242
public static void registerBuiltinMetrics(String projectId, SdkMeterProviderBuilder builder)
4343
throws IOException {
4444
BuiltinMetricsView.registerBuiltinMetrics(
4545
projectId, GoogleCredentials.getApplicationDefault(), builder);
4646
}
4747

48-
/** Register built-in metrics on the {@link SdkMeterProviderBuilder} with credentials. */
48+
/**
49+
* Register built-in metrics on the {@link SdkMeterProviderBuilder} with custom credentials and
50+
* default endpoint.
51+
*/
4952
public static void registerBuiltinMetrics(
5053
String projectId, @Nullable Credentials credentials, SdkMeterProviderBuilder builder)
5154
throws IOException {
52-
MetricExporter metricExporter = BigtableCloudMonitoringExporter.create(projectId, credentials);
55+
BuiltinMetricsView.registerBuiltinMetrics(projectId, credentials, builder, null);
56+
}
57+
58+
/**
59+
* Register built-in metrics on the {@link SdkMeterProviderBuilder} with custom credentials and
60+
* endpoint.
61+
*/
62+
public static void registerBuiltinMetrics(
63+
String projectId,
64+
@Nullable Credentials credentials,
65+
SdkMeterProviderBuilder builder,
66+
@Nullable String endpoint)
67+
throws IOException {
68+
MetricExporter metricExporter =
69+
BigtableCloudMonitoringExporter.create(projectId, credentials, endpoint);
5370
for (Map.Entry<InstrumentSelector, View> entry :
5471
BuiltinMetricsConstants.getAllViews().entrySet()) {
5572
builder.registerView(entry.getKey(), entry.getValue());

google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/DefaultMetricsProvider.java

+4-2
Original file line numberDiff line numberDiff line change
@@ -42,12 +42,14 @@ public final class DefaultMetricsProvider implements MetricsProvider {
4242
private DefaultMetricsProvider() {}
4343

4444
@InternalApi
45-
public OpenTelemetry getOpenTelemetry(String projectId, @Nullable Credentials credentials)
45+
public OpenTelemetry getOpenTelemetry(
46+
String projectId, String metricsEndpoint, @Nullable Credentials credentials)
4647
throws IOException {
4748
this.projectId = projectId;
4849
if (openTelemetry == null) {
4950
SdkMeterProviderBuilder meterProvider = SdkMeterProvider.builder();
50-
BuiltinMetricsView.registerBuiltinMetrics(projectId, credentials, meterProvider);
51+
BuiltinMetricsView.registerBuiltinMetrics(
52+
projectId, credentials, meterProvider, metricsEndpoint);
5153
openTelemetry = OpenTelemetrySdk.builder().setMeterProvider(meterProvider.build()).build();
5254
}
5355
return openTelemetry;

google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/stub/EnhancedBigtableStubSettingsTest.java

+16-6
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ public void settingsAreNotLostTest() {
8181
Duration watchdogInterval = Duration.ofSeconds(12);
8282
boolean enableRoutingCookie = false;
8383
boolean enableRetryInfo = false;
84+
String metricsEndpoint = "test-endpoint:443";
8485

8586
EnhancedBigtableStubSettings.Builder builder =
8687
EnhancedBigtableStubSettings.newBuilder()
@@ -93,7 +94,8 @@ public void settingsAreNotLostTest() {
9394
.setStreamWatchdogProvider(watchdogProvider)
9495
.setStreamWatchdogCheckInterval(watchdogInterval)
9596
.setEnableRoutingCookie(enableRoutingCookie)
96-
.setEnableRetryInfo(enableRetryInfo);
97+
.setEnableRetryInfo(enableRetryInfo)
98+
.setMetricsEndpoint(metricsEndpoint);
9799

98100
verifyBuilder(
99101
builder,
@@ -106,7 +108,8 @@ public void settingsAreNotLostTest() {
106108
watchdogProvider,
107109
watchdogInterval,
108110
enableRoutingCookie,
109-
enableRetryInfo);
111+
enableRetryInfo,
112+
metricsEndpoint);
110113
verifySettings(
111114
builder.build(),
112115
projectId,
@@ -118,7 +121,8 @@ public void settingsAreNotLostTest() {
118121
watchdogProvider,
119122
watchdogInterval,
120123
enableRoutingCookie,
121-
enableRetryInfo);
124+
enableRetryInfo,
125+
metricsEndpoint);
122126
verifyBuilder(
123127
builder.build().toBuilder(),
124128
projectId,
@@ -130,7 +134,8 @@ public void settingsAreNotLostTest() {
130134
watchdogProvider,
131135
watchdogInterval,
132136
enableRoutingCookie,
133-
enableRetryInfo);
137+
enableRetryInfo,
138+
metricsEndpoint);
134139
}
135140

136141
private void verifyBuilder(
@@ -144,7 +149,8 @@ private void verifyBuilder(
144149
WatchdogProvider watchdogProvider,
145150
Duration watchdogInterval,
146151
boolean enableRoutingCookie,
147-
boolean enableRetryInfo) {
152+
boolean enableRetryInfo,
153+
String metricsEndpoint) {
148154
assertThat(builder.getProjectId()).isEqualTo(projectId);
149155
assertThat(builder.getInstanceId()).isEqualTo(instanceId);
150156
assertThat(builder.getAppProfileId()).isEqualTo(appProfileId);
@@ -155,6 +161,7 @@ private void verifyBuilder(
155161
assertThat(builder.getStreamWatchdogCheckInterval()).isEqualTo(watchdogInterval);
156162
assertThat(builder.getEnableRoutingCookie()).isEqualTo(enableRoutingCookie);
157163
assertThat(builder.getEnableRetryInfo()).isEqualTo(enableRetryInfo);
164+
assertThat(builder.getMetricsEndpoint()).isEqualTo(metricsEndpoint);
158165
}
159166

160167
private void verifySettings(
@@ -168,7 +175,8 @@ private void verifySettings(
168175
WatchdogProvider watchdogProvider,
169176
Duration watchdogInterval,
170177
boolean enableRoutingCookie,
171-
boolean enableRetryInfo) {
178+
boolean enableRetryInfo,
179+
String metricsEndpoint) {
172180
assertThat(settings.getProjectId()).isEqualTo(projectId);
173181
assertThat(settings.getInstanceId()).isEqualTo(instanceId);
174182
assertThat(settings.getAppProfileId()).isEqualTo(appProfileId);
@@ -179,6 +187,7 @@ private void verifySettings(
179187
assertThat(settings.getStreamWatchdogCheckInterval()).isEqualTo(watchdogInterval);
180188
assertThat(settings.getEnableRoutingCookie()).isEqualTo(enableRoutingCookie);
181189
assertThat(settings.getEnableRetryInfo()).isEqualTo(enableRetryInfo);
190+
assertThat(settings.getMetricsEndpoint()).isEqualTo(metricsEndpoint);
182191
}
183192

184193
@Test
@@ -965,6 +974,7 @@ public void enableRetryInfoFalseValueTest() throws IOException {
965974
"pingAndWarmSettings",
966975
"executeQuerySettings",
967976
"metricsProvider",
977+
"metricsEndpoint",
968978
};
969979

970980
@Test

0 commit comments

Comments
 (0)