Skip to content

feat(storage): wire logical operation metrics in Retrying and StorageOptions - #14695

Open
nidhiii-27 wants to merge 65 commits into
mainfrom
feat/storage-logical-metrics
Open

nidhiii-27 wants to merge 65 commits into
mainfrom
feat/storage-logical-metrics

Conversation

@nidhiii-27

@nidhiii-27 nidhiii-27 commented Oct 20, 2026 •

Copy link
Copy Markdown
Contributor

Wires client-level metrics lifecycle and retrier operation metrics into StorageOptions and Retrying.

  • Initializes StorageClientMetrics provider and lifecycle management in StorageOptions.
  • Instruments Retrying to record operation attempts, durations, and status attributes.
  • Adds comprehensive unit tests (StorageOptionsTest, StorageClientMetricsTest, RetryingMetricsTest).

Stacked on #14728.

@nidhiii-27 nidhiii-27 added the ai-generated Pull Request generated by AI label Oct 20, 2026

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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
nidhiii-27 added this pull request to stack #14485 October 20, 2026 10:06
@nidhiii-27
nidhiii-27 force-pushed the feat/storage-metrics-context-error-mapping branch from 608c46a to 1bf9a9d Compare October 20, 2026 11:50
@nidhiii-27
nidhiii-27 force-pushed the feat/storage-logical-metrics branch from b385679 to 0a3696b Compare October 20, 2026 12:11
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
nidhiii-27 requested a review from cpriti-os October 21, 2026 17:56
@nidhiii-27
nidhiii-27 marked this pull request as ready for review October 22, 2026 05:02
@nidhiii-27
nidhiii-27 requested review from a team as code owners 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]
… 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]
… helpers out of StorageOptions

[Generated-by: AI]
… tests

- Walk the class hierarchy in isAuthException to support anonymous and custom subclasses, and remove redundant simpleName check.
- Extract mapSpecificClientCause and mapKnownCause helpers and check specific client causes on HttpResponseException.
- Guard against null StatusCode on ApiException.
- Restrict single-use HTTP mapping status constants to private visibility, use Ascii.toLowerCase, add boolean parameter comments, and move private constructor to bottom of class.
- Split multi-behavior tests in StorageErrorTypeMapperTest, deduplicate test exception classes and CRC32C fixtures, and import SigningException.

[Generated-by: AI]
@nidhiii-27
nidhiii-27 requested a review from Dhriti07 October 29, 2026 06:46
- 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 cpriti-os left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, thanks for addressing all the review comments!

nidhiii-27 and others added 13 commits November 2, 2026 10:31
- 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]
- 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
Base automatically changed from feat/storage-metrics-context to main November 11, 2026 20:00

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ai-generated Pull Request generated by AI

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants