Repository navigation
feat(storage): wire logical operation metrics in Retrying and StorageOptions - #14695
Merged
Merged
Conversation
Contributor
There was a problem hiding this comment.
Code Review
This pull request integrates OpenTelemetry metrics into the client-side retry mechanism of Google Cloud Storage. It updates StorageOptions, GrpcStorageOptions, and HttpStorageOptions to expose StorageClientMetrics, and modifies Retrying.DefaultRetrier to record attempts, errors, retries, operations, and duration metrics when metrics are enabled. Additionally, a comprehensive test suite RetryingMetricsTest has been added to verify metric collection across various retry scenarios. There are no review comments, and I have no feedback to provide.
nidhiii-27
force-pushed
the
feat/storage-metrics-context-error-mapping
branch
from
October 20, 2026 11:50
608c46a to
1bf9a9d
Compare
nidhiii-27
force-pushed
the
feat/storage-logical-metrics
branch
from
October 20, 2026 12:11
b385679 to
0a3696b
Compare
cpriti-os
requested changes
Oct 20, 2026
nidhiii-27
added a commit
that referenced
this pull request
Oct 20, 2026
โฆoptions - Narrow PR #14695 to core Retrying chokepoint and options wiring - Remove per-run StorageMetricsContext binding from DefaultRetrierWithAlg to avoid elapsed time drift across runs - Add createMetricsContext helper on StorageOptions - Revert veneer operation wiring and server address attributes to separate stacked PR - Update unit tests in RetryingMetricsTest [Generated-by: AI]
nidhiii-27
marked this pull request as ready for review
October 22, 2026 05:02
โฆnfiguration - Add configuration options to StorageOptions, GrpcStorageOptions, and HttpStorageOptions (enableOtelMetrics, enableOtelDebugMetrics, meterProvider, metricInterval). - Add development gate checking system properties and environment variables in StorageMetricsConfig. - Implement package-private instrument registry in StorageClientMetrics. - Update OpenTelemetryBootstrappingUtils to register client views with custom histogram boundaries and create client meter provider. - Add comprehensive unit tests in StorageOptionsTest, StorageClientMetricsTest, and OpenTelemetryBootstrappingUtilsTest.
Apply spotify fmt-maven-plugin formatting to StorageMetricsConfig, StorageClientMetrics, StorageOptionsTest, and StorageClientMetricsTest. [Generated-by: AI]
Use simple class name Duration instead of fully qualified java.time.Duration in GrpcStorageOptions and OpenTelemetryBootstrappingUtils. [Generated-by: AI]
โฆtrappingUtils Apply spotify fmt-maven-plugin formatting to OpenTelemetryBootstrappingUtils. [Generated-by: AI]
โฆnd views [Generated-by: AI]
โฆ metrics Refactor addClientHistogramView in OpenTelemetryBootstrappingUtils to remove unit selector and custom view description, preserving instrument default descriptions. Remove deferred Phase 2 connection metrics (dnsLookupDuration, tcpConnectDuration, tlsHandshakeDuration) from StorageClientMetrics, CLIENT_LATENCY_HISTOGRAMS, and StorageClientMetricsTest. Ensure clean Duration imports. [Generated-by: AI]
โฆrProvider Default api parameter to "grpc" instead of "storage" in createClientMeterProvider, allow specifying "json" / "http" transport protocols for Cloud Monitoring monitored resource storage.googleapis.com/Client, and add unit test coverage in OpenTelemetryBootstrappingUtilsTest. [Generated-by: AI]
Update createClientMeterProvider to use prefix custom.googleapis.com with default monitored resource mapping. Add KEY_URL_TEMPLATE attribute key constant in StorageClientMetrics. [Generated-by: AI]
โฆfor default monitored resource
โฆgeClientMetricsTest [Generated-by: AI]
โฆm boundary helpers
โฆvements [Generated-by: AI]
- Consolidate CONNECTION_REFUSED, CONNECTION_RESET, and CONNECTIVITY into CONNECTION_ERROR. - Keep DEADLINE_EXCEEDED for server/RPC status codes and HTTP 408/504, reserving TIMEOUT for client timeouts. - Map HTTP 409 to ABORTED. - Include IOException in hasSpecificClientCause so wrapped IOExceptions map to CONNECTION_ERROR. - Match server-side CRC32C and MD5 checksum mismatch messages in isChecksumMismatch. [Generated-by: AI]
Explicitly declare com.google.api:gax-httpjson in java-storage/google-cloud-storage/pom.xml to satisfy Maven dependency:analyze. [Generated-by: AI]
cpriti-os
approved these changes
Oct 31, 2026
cpriti-os
left a comment
Contributor
There was a problem hiding this comment.
LGTM, thanks for addressing all the review comments!
[Generated-by: AI]
- Check status.getCause() and server checksum mismatch descriptions on INVALID_ARGUMENT and DATA_LOSS in mapGrpcStatus - Simplify StorageException cause handling in mapThrowable by calling mapKnownCause directly - Restrict (crc32c || md5) && match server checksum error pattern to HTTP 400 and gRPC INVALID_ARGUMENT / DATA_LOSS - Add unit tests for mapGrpcStatus causes/descriptions and negative 404/412 checksum message cases [Generated-by: AI]
โฆic-libraries-bom [Generated-by: AI]
โฆ entry points [Generated-by: AI]
- Move self-causation check to the bottom of the while loop in extractRpcStatusCode and extractHttpStatusCode so top-level self-causing exceptions are inspected first - Add defensive null checks on getStatus() and getCode() for StatusRuntimeException and StatusException in extractRpcStatusCode - Add unit tests for top-level self-causing exceptions and null status on gRPC status exceptions [Generated-by: AI]
โฆn StorageErrorTypeMapper - Reword class Javadoc to remove HLD acronym. - Delegate StatusRuntimeException and StatusException directly to mapGrpcStatus. - Cap cause-chain traversal depth (MAX_CAUSE_DEPTH = 20) across mapGrpcStatus and mapThrowable to guard against multi-node cause cycles (A -> B -> A). [Generated-by: AI]
โฆor-mapping' into feat/storage-metrics-context
[Generated-by: AI]
[Generated-by: AI]
โฆse.status_code [Generated-by: AI]
โฆe branch [Generated-by: AI]
[Generated-by: AI]
Dhriti07
approved these changes
Nov 12, 2026
whowes
pushed a commit
that referenced
this pull request
Nov 13, 2026
๐ค I have created a release *beep* *boop* --- <details><summary>1.97.0</summary> ## [1.97.0](v1.96.0...v1.97.0) (2026-11-12) ### โ BREAKING CHANGES * **shopping-merchant:** remove discontinued Merchant API v1beta ([#14942](#14942)) ### Features * **bigquery-jdbc:** adds BigQuery graph integration to DatabaseMetadata methods ([#14930](#14930)) ([950b81b](950b81b)) * **gax:** implement resumable upload session resumption ([#14677](#14677)) ([24728d6](24728d6)) * **grpc-gcp:** add built-in channel_count metric for client library pools ([#14947](#14947)) ([712f043](712f043)) * **grpc-gcp:** add built-in channel_load metric for client library pools ([#14985](#14985)) ([9f87888](9f87888)) * **shopping-merchant:** remove discontinued Merchant API v1beta ([#14942](#14942)) ([2947dfd](2947dfd)) * **storage:** add StorageErrorTypeMapper for standard metrics ([#14694](#14694)) ([a9ac393](a9ac393)) * **storage:** add StorageMetricsContext for operation metrics state ([#14728](#14728)) ([edea395](edea395)) * **storage:** wire logical operation metrics in Retrying and StorageOptions ([#14695](#14695)) ([589c66c](589c66c)) * update API sources and regenerate ([#14958](#14958)) ([75944f3](75944f3)) ### Bug Fixes * **auth:** verify public/private key match with retries in mTLS keystore loading ([#14829](#14829)) ([096dbd6](096dbd6)) * **bigquery:** set QueryResultsFormat.ARROW in QueryArrow sample ([#14960](#14960)) ([c98e7c3](c98e7c3)) * **bigtable:** avoid triggering per-RPC credential session fallback on default call context ([#14961](#14961)) ([eb06d2c](eb06d2c)) * **bigtable:** copy Metadata per GetClientConfiguration call ([#14950](#14950)) ([278fe2f](278fe2f)) * **bigtable:** disable SwitchingChannelPool when ChannelPoolConfiguration is empty ([#14911](#14911)) ([fa24702](fa24702)) * **bigtable:** handle empty SessionPoolConfiguration in SessionPoolImpl and PoolSizer ([#14912](#14912)) ([cc7b235](cc7b235)) * **bigtable:** replace SessionPoolImpl Watchdog with per-session closeTimeout ([#14977](#14977)) ([a15acfb](a15acfb)) * **spanner-jdbc:** report database default isolation level ([#14929](#14929)) ([7e7595a](7e7595a)) * **spanner:** fix PG SHOW isolation level statements ([#14904](#14904)) ([bc917ed](bc917ed)) ### Dependencies * bump grpc to 1.85.1, opentelemetry to 1.67.0, and guava to 33.7.2-jre ([#14957](#14957)) ([1a27a00](1a27a00)) * bump guava to 33.7.1-jre and jspecify to 1.0.1 ([#14937](#14937)) ([1441527](1441527)) ### Documentation * **spanner:** update CHANGELOG.md for java spanner releases ([#14935](#14935)) ([956681e](956681e)) * **storage:** add Rapid Cache samples ([#14886](#14886)) ([e714f62](e714f62)) </details> --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). --------- Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Wires client-level metrics lifecycle and retrier operation metrics into StorageOptions and Retrying.
StorageClientMetricsprovider and lifecycle management inStorageOptions.Retryingto record operation attempts, durations, and status attributes.StorageOptionsTest,StorageClientMetricsTest,RetryingMetricsTest).Stacked on #14728.