Skip to content
Merged
Show file tree
Hide file tree
Changes from 27 commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
08cb1b8
feat: migrate exporter to OTEL
mutianf May 26, 2023
26a648a
address comments
mutianf Jun 16, 2023
91fcd80
filter out only bigtable metrics
mutianf Jun 28, 2023
32ac2be
fix test
mutianf Jun 28, 2023
af6cbb2
use the bom
mutianf Jun 28, 2023
e87cf91
update
mutianf Jun 30, 2023
e2b7e58
update
mutianf Jul 5, 2023
6d127e3
feat: migrate builtin metrics to OTEl
mutianf Jun 15, 2023
e8be9c2
update completeResultCode
mutianf Jul 12, 2023
cd04252
add a comment
mutianf Jul 12, 2023
31b6d5c
Merge branch 'main' into migrate12
mutianf Aug 23, 2023
3d9b30d
udpate
mutianf Aug 23, 2023
9fcd0f3
fix tests
mutianf Aug 24, 2023
0c80a4c
remove unrelated changes
mutianf Aug 25, 2023
4b66a0e
fix tests
mutianf Aug 25, 2023
9414ece
add documentation
mutianf Sep 1, 2023
a07f817
fix test
mutianf Sep 1, 2023
2c268d2
Merge branch 'migrate1' into migrate12
mutianf Sep 1, 2023
ef4f2be
merge exporter changes
mutianf Sep 1, 2023
896cf4b
Merge branch 'main' into migrate12
mutianf Jan 18, 2024
e9c535f
address comments
mutianf Jan 19, 2024
6f01ea4
Merge branch 'otel' into migrate12
mutianf Jan 23, 2024
28ca070
rebase on otel
mutianf Jan 24, 2024
9a435f7
revert changes in stats
mutianf Jan 24, 2024
a797c96
fix import
mutianf Jan 24, 2024
d534f7f
update
mutianf Jan 24, 2024
2dd6586
merge back the endpoint change
mutianf Jan 25, 2024
54a8d25
refactor constants and settings
mutianf Jan 30, 2024
96099b8
refactor and fix tests
mutianf Jan 30, 2024
803f5b5
remove unused dependency
mutianf Jan 31, 2024
66ab16a
add some javadoc
mutianf Jan 31, 2024
c5fd5ca
Merge branch 'otel' into migrate12
mutianf Feb 5, 2024
4f577fa
address part of the comments
mutianf Feb 6, 2024
0f21a31
update test
mutianf Feb 6, 2024
56f6b71
test with nano
mutianf Feb 7, 2024
14f22a8
measure everything in nanos and publish with double histogram
mutianf Feb 8, 2024
5bfa166
Merge branch 'otel' into migrate12
mutianf Feb 16, 2024
523724b
address comments
mutianf Feb 20, 2024
db6c496
fix test
mutianf Feb 20, 2024
8f511cf
add toString
mutianf Feb 21, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions google-cloud-bigtable/clirr-ignored-differences.xml
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,12 @@
<differenceType>8001</differenceType>
<className>com/google/cloud/bigtable/data/v2/stub/metrics/BigtableTracerBatchedUnaryCallable</className>
</difference>
<!-- InternalApi constructor was updated -->
<difference>
<differenceType>7004</differenceType>
<className>com/google/cloud/bigtable/data/v2/stub/metrics/BuiltinMetricsTracerFactory</className>
<method>*</method>
</difference>
<!-- InternalApi was updated -->
<difference>
<differenceType>6001</differenceType>
Expand Down
9 changes: 9 additions & 0 deletions google-cloud-bigtable/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -339,6 +339,10 @@
<groupId>io.opentelemetry</groupId>
<artifactId>opentelemetry-api</artifactId>
</dependency>
<dependency>
<groupId>io.opentelemetry</groupId>
<artifactId>opentelemetry-sdk</artifactId>
</dependency>
<dependency>
<groupId>io.opentelemetry</groupId>
<artifactId>opentelemetry-sdk-metrics</artifactId>
Expand All @@ -347,6 +351,11 @@
<groupId>io.opentelemetry</groupId>
<artifactId>opentelemetry-sdk-common</artifactId>
</dependency>
<dependency>
<groupId>io.opentelemetry</groupId>
<artifactId>opentelemetry-sdk-testing</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.google.cloud</groupId>
<artifactId>google-cloud-monitoring</artifactId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,16 +25,14 @@
import com.google.api.gax.grpc.InstantiatingGrpcChannelProvider;
import com.google.api.gax.rpc.UnaryCallSettings;
import com.google.auth.Credentials;
import com.google.auth.oauth2.GoogleCredentials;
import com.google.cloud.bigtable.data.v2.models.Query;
import com.google.cloud.bigtable.data.v2.models.Row;
import com.google.cloud.bigtable.data.v2.stub.BigtableBatchingCallSettings;
import com.google.cloud.bigtable.data.v2.stub.EnhancedBigtableStubSettings;
import com.google.cloud.bigtable.stats.BigtableStackdriverStatsExporter;
import com.google.cloud.bigtable.stats.BuiltinViews;
import com.google.common.base.MoreObjects;
import com.google.common.base.Strings;
import io.grpc.ManagedChannelBuilder;
import io.opentelemetry.api.OpenTelemetry;
import java.io.IOException;
import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;
Expand Down Expand Up @@ -197,24 +195,25 @@ public static void enableGfeOpenCensusStats() {
com.google.cloud.bigtable.data.v2.stub.metrics.RpcViews.registerBigtableClientGfeViews();
}

/** Register built in metrics. */
public static void enableBuiltinMetrics() throws IOException {
if (BUILTIN_METRICS_REGISTERED.compareAndSet(false, true)) {
BuiltinViews.registerBigtableBuiltinViews();
BigtableStackdriverStatsExporter.register(GoogleCredentials.getApplicationDefault());
}
}
/**
* Register built in metrics.
*
* @deprecated This is a no-op that doesn't do anything. Builtin metrics are enabled by default
* now. Please use {@link BigtableDataSettings.Builder#setBuiltinMetricsEnabled(boolean)} to
* enable or disable built-in metrics.
*/
@Deprecated
public static void enableBuiltinMetrics() throws IOException {}

/**
* Register built in metrics with credentials. The credentials need to have metric write access
* for all the projects you're publishing to.
*
* @deprecated This is a no-op that doesn't do anything. Builtin metrics are enabled by default
* now. Please use {@link BigtableDataSettings.Builder#setBuiltinMetricsEnabled(boolean)} to
* enable or disable built-in metrics.
*/
public static void enableBuiltinMetrics(Credentials credentials) throws IOException {
if (BUILTIN_METRICS_REGISTERED.compareAndSet(false, true)) {
BuiltinViews.registerBigtableBuiltinViews();
BigtableStackdriverStatsExporter.register(credentials);
}
}
public static void enableBuiltinMetrics(Credentials credentials) throws IOException {}

/** Returns the target project id. */
public String getProjectId() {
Expand Down Expand Up @@ -278,6 +277,20 @@ public boolean isBulkMutationFlowControlEnabled() {
return stubSettings.bulkMutateRowsSettings().isServerInitiatedFlowControlEnabled();
}

/** Gets if built-in metrics is enabled. */
public boolean isBuiltinMetricsEnabled() {
return stubSettings.isBuiltinMetricsEnabled();
}

/**
* Gets the custom OpenTelemetry instance. If no custom OTEL instance is set, the client uses a
* default instance with builtin metrics enabled. Use {@link
* Builder#setBuiltinMetricsEnabled(boolean)} to disable the builtin metrics.
*/
public OpenTelemetry getOpenTelemetry() {
return stubSettings.getOpenTelemetry();
}

/** Returns the underlying RPC settings. */
public EnhancedBigtableStubSettings getStubSettings() {
return stubSettings;
Expand Down Expand Up @@ -527,6 +540,54 @@ public boolean isBulkMutationFlowControlEnabled() {
return stubSettings.bulkMutateRowsSettings().isServerInitiatedFlowControlEnabled();
}

/** Set enable to true to enable builtin metrics. */
public Builder setBuiltinMetricsEnabled(boolean enable) {
stubSettings.setBuiltinMetricsEnabled(enable);
return this;
}

/** Gets if built-in metrics is enabled. */
public boolean isBuiltinMetricsEnabled() {
return stubSettings.isBuiltinMetricsEnabled();
}

/**
* Set a custom OpenTelemetry instance.
*
* <p>To register builtin metrics on the custom OpenTelemetry:
*
* <pre>{@code
* SdkMeterProviderBuilder sdkMeterProvider = SdkMeterProvider.builder();
*
* // register Builtin metrics on your meter provider
* BuiltinMetricsViews.registerBuiltinMetrics("project-id", sdkMeterProvider);
*
* // register other metrics reader and views
* sdkMeterProvider.registerMetricReader(..);
* sdkMeterProvider.registerView(..);
*
* // create the OTEL instance
* OpenTelemetry openTelemetry = OpenTelemetrySdk
* .builder()
* .setMeterProvider(sdkMeterProvider().build());
*
* settings.setOpenTelemetry(openTelemetry);
* }</pre>
*/
public Builder setOpenTelemetry(OpenTelemetry openTelemetry) {
stubSettings.setOpenTelemetry(openTelemetry);
return this;
}

/**
* Gets the custom OpenTelemetry instance. If no custom OTEL instance is set, the client uses a
* default instance with builtin metrics enabled. Use {@link #setBuiltinMetricsEnabled(boolean)}
* to disable the builtin metrics.
*/
public OpenTelemetry getOpenTelemetry() {
return stubSettings.getOpenTelemetry();
}

/**
* Returns the underlying settings for making RPC calls. The settings should be changed with
* care.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,10 @@
*/
package com.google.cloud.bigtable.data.v2.stub;

import static com.google.cloud.bigtable.data.v2.stub.metrics.BuiltinMetricsConstants.APP_PROFILE;
import static com.google.cloud.bigtable.data.v2.stub.metrics.BuiltinMetricsConstants.INSTANCE_ID;
import static com.google.cloud.bigtable.data.v2.stub.metrics.BuiltinMetricsConstants.PROJECT_ID;

import com.google.api.core.BetaApi;
import com.google.api.core.InternalApi;
import com.google.api.gax.batching.Batcher;
Expand Down Expand Up @@ -93,6 +97,7 @@
import com.google.cloud.bigtable.data.v2.stub.metrics.BigtableTracerStreamingCallable;
import com.google.cloud.bigtable.data.v2.stub.metrics.BigtableTracerUnaryCallable;
import com.google.cloud.bigtable.data.v2.stub.metrics.BuiltinMetricsTracerFactory;
import com.google.cloud.bigtable.data.v2.stub.metrics.BuiltinMetricsView;
import com.google.cloud.bigtable.data.v2.stub.metrics.CompositeTracerFactory;
import com.google.cloud.bigtable.data.v2.stub.metrics.MetricsTracerFactory;
import com.google.cloud.bigtable.data.v2.stub.metrics.RpcMeasureConstants;
Expand Down Expand Up @@ -123,6 +128,11 @@
import io.opencensus.tags.TagValue;
import io.opencensus.tags.Tagger;
import io.opencensus.tags.Tags;
import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.api.common.Attributes;
import io.opentelemetry.sdk.OpenTelemetrySdk;
import io.opentelemetry.sdk.metrics.SdkMeterProvider;
import io.opentelemetry.sdk.metrics.SdkMeterProviderBuilder;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
Expand Down Expand Up @@ -236,14 +246,15 @@ public static ClientContext createClientContext(EnhancedBigtableStubSettings set
return ClientContext.create(builder.build());
}

public static ApiTracerFactory createBigtableTracerFactory(
EnhancedBigtableStubSettings settings) {
public static ApiTracerFactory createBigtableTracerFactory(EnhancedBigtableStubSettings settings)
throws IOException {
return createBigtableTracerFactory(settings, Tags.getTagger(), Stats.getStatsRecorder());
}

@VisibleForTesting
public static ApiTracerFactory createBigtableTracerFactory(
EnhancedBigtableStubSettings settings, Tagger tagger, StatsRecorder stats) {
EnhancedBigtableStubSettings settings, Tagger tagger, StatsRecorder stats)
throws IOException {
String projectId = settings.getProjectId();
String instanceId = settings.getInstanceId();
String appProfileId = settings.getAppProfileId();
Expand All @@ -254,32 +265,61 @@ public static ApiTracerFactory createBigtableTracerFactory(
.put(RpcMeasureConstants.BIGTABLE_INSTANCE_ID, TagValue.create(instanceId))
.put(RpcMeasureConstants.BIGTABLE_APP_PROFILE_ID, TagValue.create(appProfileId))
.build();
ImmutableMap<String, String> builtinAttributes =
ImmutableMap.<String, String>builder()
.put("project_id", projectId)
.put("instance", instanceId)
.put("app_profile", appProfileId)
.build();

return new CompositeTracerFactory(
ImmutableList.of(
ImmutableList.Builder<ApiTracerFactory> tracerFactories = ImmutableList.builder();
tracerFactories
.add(
// Add OpenCensus Tracing
new OpencensusTracerFactory(
ImmutableMap.<String, String>builder()
// Annotate traces with the same tags as metrics
.put(RpcMeasureConstants.BIGTABLE_PROJECT_ID.getName(), projectId)
.put(RpcMeasureConstants.BIGTABLE_INSTANCE_ID.getName(), instanceId)
.put(RpcMeasureConstants.BIGTABLE_APP_PROFILE_ID.getName(), appProfileId)
.put(RpcMeasureConstants.BIGTABLE_PROJECT_ID.getName(), settings.getProjectId())
.put(
RpcMeasureConstants.BIGTABLE_INSTANCE_ID.getName(),
settings.getInstanceId())
.put(
RpcMeasureConstants.BIGTABLE_APP_PROFILE_ID.getName(),
settings.getAppProfileId())
// Also annotate traces with library versions
.put("gax", GaxGrpcProperties.getGaxGrpcVersion())
.put("grpc", GaxGrpcProperties.getGrpcVersion())
.put("gapic", Version.VERSION)
.build()),
// Add OpenCensus Metrics
MetricsTracerFactory.create(tagger, stats, attributes),
BuiltinMetricsTracerFactory.create(builtinAttributes),
// Add user configured tracer
settings.getTracerFactory()));
.build()))
// Add OpenCensus Metrics
.add(MetricsTracerFactory.create(tagger, stats, attributes))
// Add user configured tracer
.add(settings.getTracerFactory());
Attributes otelAttributes =
Attributes.of(
PROJECT_ID,
settings.getProjectId(),
INSTANCE_ID,
settings.getInstanceId(),
APP_PROFILE,
settings.getAppProfileId());
BuiltinMetricsTracerFactory builtinMetricsTracerFactory =
setupBuiltinMetricsTracerFactory(settings.toBuilder(), otelAttributes);
if (builtinMetricsTracerFactory != null) {
tracerFactories.add(builtinMetricsTracerFactory);
}
return new CompositeTracerFactory(tracerFactories.build());
}

private static BuiltinMetricsTracerFactory setupBuiltinMetricsTracerFactory(
EnhancedBigtableStubSettings.Builder settings, Attributes attributes) throws IOException {
if (settings.getOpenTelemetry() != null) {
return BuiltinMetricsTracerFactory.create(settings.getOpenTelemetry(), attributes);
} else if (settings.isBuiltinMetricsEnabled()) {
SdkMeterProviderBuilder meterProvider = SdkMeterProvider.builder();
BuiltinMetricsView.registerBuiltinMetrics(
settings.getProjectId(),
settings.getCredentialsProvider().getCredentials(),
meterProvider);
OpenTelemetry openTelemetry =
OpenTelemetrySdk.builder().setMeterProvider(meterProvider.build()).build();
return BuiltinMetricsTracerFactory.create(openTelemetry, attributes);
}
return null;
}

private static void patchCredentials(EnhancedBigtableStubSettings.Builder settings)
Expand Down
Loading