6868import com .google .spanner .v1 .DirectedReadOptions ;
6969import com .google .spanner .v1 .ExecuteSqlRequest ;
7070import com .google .spanner .v1 .ExecuteSqlRequest .QueryOptions ;
71+ import com .google .spanner .v1 .RequestOptions ;
7172import com .google .spanner .v1 .SpannerGrpc ;
7273import com .google .spanner .v1 .TransactionOptions ;
7374import com .google .spanner .v1 .TransactionOptions .IsolationLevel ;
@@ -227,6 +228,7 @@ public static GcpChannelPoolOptions createDefaultDynamicChannelPoolOptions() {
227228 private final boolean autoThrottleAdministrativeRequests ;
228229 private final RetrySettings retryAdministrativeRequestsSettings ;
229230 private final boolean trackTransactionStarter ;
231+ private final boolean enableGrpcGcpOtelMetrics ;
230232 private final BuiltInMetricsProvider builtInMetricsProvider = BuiltInMetricsProvider .INSTANCE ;
231233
232234 /**
@@ -259,6 +261,7 @@ public static GcpChannelPoolOptions createDefaultDynamicChannelPoolOptions() {
259261 private final boolean enableEndToEndTracing ;
260262 private final String monitoringHost ;
261263 private final TransactionOptions defaultTransactionOptions ;
264+ private final RequestOptions .ClientContext clientContext ;
262265
263266 enum TracingFramework {
264267 OPEN_CENSUS ,
@@ -895,6 +898,7 @@ protected SpannerOptions(Builder builder) {
895898 autoThrottleAdministrativeRequests = builder .autoThrottleAdministrativeRequests ;
896899 retryAdministrativeRequestsSettings = builder .retryAdministrativeRequestsSettings ;
897900 trackTransactionStarter = builder .trackTransactionStarter ;
901+ enableGrpcGcpOtelMetrics = builder .enableGrpcGcpOtelMetrics ;
898902 defaultQueryOptions = builder .defaultQueryOptions ;
899903 envQueryOptions = builder .getEnvironmentQueryOptions ();
900904 if (envQueryOptions .equals (QueryOptions .getDefaultInstance ())) {
@@ -925,13 +929,19 @@ protected SpannerOptions(Builder builder) {
925929 enableEndToEndTracing = builder .enableEndToEndTracing ;
926930 monitoringHost = builder .monitoringHost ;
927931 defaultTransactionOptions = builder .defaultTransactionOptions ;
932+ clientContext = builder .clientContext ;
928933 }
929934
930935 private String getResolvedUniverseDomain () {
931936 String universeDomain = getUniverseDomain ();
932937 return Strings .isNullOrEmpty (universeDomain ) ? GOOGLE_DEFAULT_UNIVERSE : universeDomain ;
933938 }
934939
940+ /** Returns the default {@link RequestOptions.ClientContext} for this {@link SpannerOptions}. */
941+ public RequestOptions .ClientContext getClientContext () {
942+ return clientContext ;
943+ }
944+
935945 /**
936946 * The environment to read configuration values from. The default implementation uses environment
937947 * variables.
@@ -975,6 +985,10 @@ default boolean isEnableGRPCBuiltInMetrics() {
975985 return false ;
976986 }
977987
988+ default boolean isEnableGrpcGcpOtelMetrics () {
989+ return true ;
990+ }
991+
978992 default boolean isEnableEndToEndTracing () {
979993 return false ;
980994 }
@@ -1013,6 +1027,8 @@ private static class SpannerEnvironmentImpl implements SpannerEnvironment {
10131027 private static final String SPANNER_DISABLE_BUILTIN_METRICS = "SPANNER_DISABLE_BUILTIN_METRICS" ;
10141028 private static final String SPANNER_DISABLE_DIRECT_ACCESS_GRPC_BUILTIN_METRICS =
10151029 "SPANNER_DISABLE_DIRECT_ACCESS_GRPC_BUILTIN_METRICS" ;
1030+ private static final String SPANNER_DISABLE_GRPC_GCP_OTEL_METRICS =
1031+ "SPANNER_DISABLE_GRPC_GCP_OTEL_METRICS" ;
10161032 private static final String SPANNER_MONITORING_HOST = "SPANNER_MONITORING_HOST" ;
10171033
10181034 private SpannerEnvironmentImpl () {}
@@ -1058,6 +1074,11 @@ public boolean isEnableGRPCBuiltInMetrics() {
10581074 System .getenv (SPANNER_DISABLE_DIRECT_ACCESS_GRPC_BUILTIN_METRICS ));
10591075 }
10601076
1077+ @ Override
1078+ public boolean isEnableGrpcGcpOtelMetrics () {
1079+ return !Boolean .parseBoolean (System .getenv (SPANNER_DISABLE_GRPC_GCP_OTEL_METRICS ));
1080+ }
1081+
10611082 @ Override
10621083 public boolean isEnableEndToEndTracing () {
10631084 return Boolean .parseBoolean (System .getenv (SPANNER_ENABLE_END_TO_END_TRACING ));
@@ -1128,6 +1149,8 @@ public static class Builder
11281149 private boolean autoThrottleAdministrativeRequests = false ;
11291150 private boolean trackTransactionStarter = false ;
11301151 private Map <DatabaseId , QueryOptions > defaultQueryOptions = new HashMap <>();
1152+ private boolean enableGrpcGcpOtelMetrics =
1153+ SpannerOptions .environment .isEnableGrpcGcpOtelMetrics ();
11311154 private CallCredentialsProvider callCredentialsProvider ;
11321155 private CloseableExecutorProvider asyncExecutorProvider ;
11331156 private String compressorName ;
@@ -1146,6 +1169,7 @@ public static class Builder
11461169 private String experimentalHost = null ;
11471170 private boolean usePlainText = false ;
11481171 private TransactionOptions defaultTransactionOptions = TransactionOptions .getDefaultInstance ();
1172+ private RequestOptions .ClientContext clientContext ;
11491173
11501174 private static String createCustomClientLibToken (String token ) {
11511175 return token + " " + ServiceOptions .getGoogApiClientLibName ();
@@ -1231,6 +1255,7 @@ protected Builder() {
12311255 this .autoThrottleAdministrativeRequests = options .autoThrottleAdministrativeRequests ;
12321256 this .retryAdministrativeRequestsSettings = options .retryAdministrativeRequestsSettings ;
12331257 this .trackTransactionStarter = options .trackTransactionStarter ;
1258+ this .enableGrpcGcpOtelMetrics = options .enableGrpcGcpOtelMetrics ;
12341259 this .defaultQueryOptions = options .defaultQueryOptions ;
12351260 this .callCredentialsProvider = options .callCredentialsProvider ;
12361261 this .asyncExecutorProvider = options .asyncExecutorProvider ;
@@ -1248,6 +1273,7 @@ protected Builder() {
12481273 this .enableEndToEndTracing = options .enableEndToEndTracing ;
12491274 this .monitoringHost = options .monitoringHost ;
12501275 this .defaultTransactionOptions = options .defaultTransactionOptions ;
1276+ this .clientContext = options .clientContext ;
12511277 }
12521278
12531279 @ Override
@@ -1750,6 +1776,17 @@ public Builder disableDynamicChannelPool() {
17501776 return this ;
17511777 }
17521778
1779+ /**
1780+ * Sets whether to enable or disable grpc-gcp OpenTelemetry metrics injection. When disabled,
1781+ * Spanner will not automatically inject an OpenTelemetry {@link
1782+ * io.opentelemetry.api.metrics.Meter} into grpc-gcp. If a Meter or MetricRegistry is explicitly
1783+ * provided via {@link GcpManagedChannelOptions}, those settings will still be honored.
1784+ */
1785+ public Builder setGrpcGcpOtelMetricsEnabled (boolean enableGrpcGcpOtelMetrics ) {
1786+ this .enableGrpcGcpOtelMetrics = enableGrpcGcpOtelMetrics ;
1787+ return this ;
1788+ }
1789+
17531790 /**
17541791 * Sets the channel pool options for dynamic channel pooling. Use this to configure the dynamic
17551792 * channel pool behavior when {@link #enableDynamicChannelPool()} is enabled.
@@ -1989,6 +2026,12 @@ public Builder setDefaultTransactionOptions(
19892026 return this ;
19902027 }
19912028
2029+ /** Sets the default {@link RequestOptions.ClientContext} for all requests. */
2030+ public Builder setDefaultClientContext (RequestOptions .ClientContext clientContext ) {
2031+ this .clientContext = clientContext ;
2032+ return this ;
2033+ }
2034+
19922035 @ SuppressWarnings ("rawtypes" )
19932036 @ Override
19942037 public SpannerOptions build () {
@@ -2211,6 +2254,10 @@ public boolean isGrpcGcpExtensionEnabled() {
22112254 return grpcGcpExtensionEnabled ;
22122255 }
22132256
2257+ public boolean isGrpcGcpOtelMetricsEnabled () {
2258+ return enableGrpcGcpOtelMetrics ;
2259+ }
2260+
22142261 public GcpManagedChannelOptions getGrpcGcpOptions () {
22152262 return grpcGcpOptions ;
22162263 }
0 commit comments