Skip to content

feat(sidekick): Add conditional instrumentation to gRPC clients#2594

Merged
westarle merged 1 commit intogoogleapis:mainfrom
westarle:feat/t4-grpc-conditional-instr
Oct 17, 2025
Merged

feat(sidekick): Add conditional instrumentation to gRPC clients#2594
westarle merged 1 commit intogoogleapis:mainfrom
westarle:feat/t4-grpc-conditional-instr

Conversation

@westarle
Copy link
Copy Markdown
Contributor

@westarle westarle commented Oct 16, 2025

This PR introduces feature-gated instrumentation support for gRPC clients generated by Librarian, specifically targeting gRPC-only clients using the grpc-client template set.

For googleapis/google-cloud-rust#3418

Changes:

  1. internal/sidekick/internal/rust/templates/grpc-client/transport.rs.mustache:

    • Added a lazy_static definition for INSTRUMENTATION_CLIENT_INFO within the existing info module. This static is conditionally compiled based on the google_cloud_unstable_tracing cfg flag and the Codec.DetailedTracingAttributes Sidekick option.
    • Modified the StorageControl::new function to call .with_instrumentation() on the gaxi::grpc::Client instance (inner). This call is conditional based on gaxi::options::tracing_enabled(&config) at runtime, and the entire block is guarded by {{#Codec.DetailedTracingAttributes}} and #[cfg(google_cloud_unstable_tracing)].
  2. internal/sidekick/internal/rust/templates/common/Cargo.toml.mustache:

    • Added [lints] workspace = true to ensure generated crates inherit workspace lint configurations, including the unexpected_cfgs allowance for google_cloud_unstable_tracing. This is also guarded by {{#Codec.DetailedTracingAttributes}}.

Testing Steps:

Test PR: googleapis/google-cloud-rust#3546

The following steps were performed to test these template changes, using the google-cloud-storage crate's StorageControl client as a test case, as it uses the grpc-client templates.

Setup:

  • Librarian repo on branch feat/t4-grpc-conditional-instr.
  • google-cloud-rust repo on branch feat/t4-grpc-client-with-instr (which contains the with_instrumentation method on gaxi::grpc::Client).

Test Case 1: DetailedTracingAttributes ON

  1. Configure: Modify /usr/local/google/home/westarle/src/otel-rust/projects/t4-grpc-network-span/google-cloud-rust/src/storage/src/generated/gapic/.sidekick.toml to ensure detailed-tracing-attributes = true.

  2. Regenerate: From the Librarian repo root:

    go run ./cmd/sidekick refresh -project-root /usr/local/google/home/westarle/src/otel-rust/projects/t4-grpc-network-span/google-cloud-rust -output src/storage/src/generated/gapic
  3. Format: In the google-cloud-rust repo:

    cargo fmt -p google-cloud-storage
  4. Verify Diffs: In the google-cloud-rust repo:

    git diff src/storage/src/generated/gapic/transport.rs

    Confirmed that the INSTRUMENTATION_CLIENT_INFO static and the call to inner.with_instrumentation(Some(&info::INSTRUMENTATION_CLIENT_INFO)) were present and correctly guarded.

  5. Test with RUSTFLAGS: In the google-cloud-rust repo:

    RUSTFLAGS="--cfg google_cloud_unstable_tracing" cargo test -p google-cloud-storage
    RUSTFLAGS="--cfg google_cloud_unstable_tracing" cargo clippy -p google-cloud-storage -- -D warnings
    cargo semver-checks check-release -p google-cloud-storage

    All checks passed.

  6. Test without RUSTFLAGS: In the google-cloud-rust repo:

    cargo test -p google-cloud-storage
    cargo clippy -p google-cloud-storage -- -D warnings
    cargo semver-checks check-release -p google-cloud-storage

    All checks passed.

Test Case 2: DetailedTracingAttributes OFF

  1. Configure: Modify /usr/local/google/home/westarle/src/otel-rust/projects/t4-grpc-network-span/google-cloud-rust/src/storage/src/generated/gapic/.sidekick.toml to set detailed-tracing-attributes = false.
  2. Regenerate: Repeat step 3 from Test Case 1.
  3. Format: Repeat step 4 from Test Case 1.
  4. Verify Diffs: In the google-cloud-rust repo:
    git diff src/storage/src/generated/gapic/transport.rs
    Confirmed that the guarded blocks are now absent in src/storage/src/generated/gapic/transport.rs.
  5. Test without RUSTFLAGS: Repeat step 7 from Test Case 1.
    cargo test -p google-cloud-storage
    cargo clippy -p google-cloud-storage -- -D warnings
    cargo semver-checks check-release -p google-cloud-storage
    All checks passed.

Cleanup:

  • Restored google-cloud-rust/src/storage/src/generated/gapic/.sidekick.toml to its original state.

These tests confirm that the template changes correctly inject the instrumentation logic only when both the Sidekick option and the compile-time cfg flag are active, and do not affect the build when disabled.

Adds feature-gated instrumentation support for gRPC clients using google_cloud_unstable_tracing flag and DetailedTracingAttributes option.

Tested with google-cloud-storage, toggling DTA and RUSTFLAGS, running tests, clippy, and semver-checks.
@codecov
Copy link
Copy Markdown

codecov bot commented Oct 16, 2025

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 85.52%. Comparing base (16df43c) to head (69e3f8e).
⚠️ Report is 9 commits behind head on main.

Additional details and impacted files
@@            Coverage Diff             @@
##             main    #2594      +/-   ##
==========================================
+ Coverage   85.51%   85.52%   +0.01%     
==========================================
  Files         107      107              
  Lines       10798    10808      +10     
==========================================
+ Hits         9234     9244      +10     
  Misses       1234     1234              
  Partials      330      330              

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@westarle westarle marked this pull request as ready for review October 16, 2025 11:44
@westarle westarle requested a review from a team October 16, 2025 11:44
@codyoss codyoss changed the title feat(librarian): Add conditional instrumentation to gRPC clients feat(sidekick): Add conditional instrumentation to gRPC clients Oct 16, 2025
@westarle westarle merged commit 3cc63b2 into googleapis:main Oct 17, 2025
8 of 9 checks passed
ldetmer pushed a commit that referenced this pull request Oct 22, 2025
Librarian Version: v0.0.0-20251022154542-dd249212325d
Language Image:
us-central1-docker.pkg.dev/cloud-sdk-librarian-prod/images-prod/librarian-release-container:latest
<details><summary>librarian: 0.5.0</summary>

##
[0.5.0](v0.4.0...v0.5.0)
(2025-10-22)

### Features

* speed up finding changed files in commits (#2645)
([1060946](10609465))

* Can config dart `export` (#2641)
([97eacd2](97eacd29))

* minor whitespace and doc changes to the Dart templates (#2636)
([b3ac7b4](b3ac7b42))

* only generate libraries with changed APIs (#2618)
([82171be](82171bed))

* make extra modules public (#2622)
([2c94a53](2c94a53f))

* skip a GitHub release for a library (#2612)
([6258f4d](6258f4d1))

* allow skipping semver checks for rust-publish (#2584)
([739ce0d](739ce0d5))

* add ability to open pull request as a draft (#2604)
([c1f0285](c1f02859))

* capture discovery revision (#2605)
([14a1483](14a14830))

* Add conditional instrumentation to gRPC clients (#2594)
([3cc63b2](3cc63b22))

* add update-image CLI command (#2580)
([90e0f6e](90e0f6e5))

* Generate more samples for oneof main setters. (#2592)
([c55f3ce](c55f3ceb))

* Add documentation for generated service constructors (#2575)
([6a4aead](6a4aeade))

* disable some clippy warnings (#2567)
([9f51084](9f510842))

* Generate setter samples for oneof fields. (#2573)
([8c2416a](8c2416ab))

* add default Rust features option (#2562)
([892f42b](892f42b7))

* Include a correct URL for issues (#2570)
([10493ed](10493ed9))

* add ability to find the latest docker image SHA (#2539)
([62e80f1](62e80f19))

* add ability to checkout a repo at a certain commit (#2555)
([23b8ffe](23b8ffea))

* add onboarding PR body (#2552)
([e32719c](e32719cd))

### Bug Fixes

* associate bulk change to individual libraries (#2626)
([dd24921](dd249212))

* Allow `unnecessary_import`s (#2642)
([88c4379](88c43794))

* resolve issue where onboarded library can&#39;t be released (#2632)
([b300a4e](b300a4ea))

* resolve issue where commits cannot be fetched for new library (#2631)
([45652c0](45652c03))

* address a typo in the Message.ServicePlaceholder docs (#2616)
([82fda96](82fda96b))

* bad version bump edits (#2613)
([9902b1d](9902b1d5))

* use templates for update-image PR body (#2602)
([7309cad](7309cadd))

* populate configure command pr content (#2591)
([811eb8e](811eb8e2))

* shrink release PR size when there are bulk changes (#2585)
([bcb914a](bcb914ac))

* Fixes several issues with oneof main setter samples (#2589)
([e4958d0](e4958d00))

* resolve broken link in PR body (#2579)
([098c1d2](098c1d24))

* Remove double sample code blocks (#2582)
([6b10456](6b104567))

* change commit package (#2571)
([45ee48f](45ee48f0))

* show chores in release notes (#2544)
([88b62cc](88b62ccb))

* avoid work duplication when finding changes (#2558)
([0adeeac](0adeeac6))

* mangled method names and doc links (#2565)
([895dac9](895dac94))

### Reverts

* show chores in release notes (#2601)
([7e6740f](7e6740ff))

</details>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants