FazBrowse GitHub Viewer | Trending |
URL:
| Home
Tools: [Download Repo ZIP]   [Original HTTPS Page]

fix(metrics): correct GFE metrics extraction and enable by default by sinhasubham · Pull Request #17561 · googleapis/google-cloud-python · GitHub

fix(metrics): correct GFE metrics extraction and enable by default - #17561

Merged
sinhasubham merged 6 commits into
mainfrom
gfe-metrics-fix
Jul 29, 2026
Merged

fix(metrics): correct GFE metrics extraction and enable by default#17561
sinhasubham merged 6 commits into
mainfrom
gfe-metrics-fix

Conversation

sinhasubham commented Jun 24, 2026
edited
Loading

Copy link
Copy Markdown
Contributor

Description

This PR enables and properly extracts Spanner Google Front End (GFE) and Application Front End (AFE) latency metrics.

Key Changes:

  • Fix Metadata Extraction Logic: Modified MetricsInterceptor and AsyncMetricsInterceptor to strictly extract server-timing data from initial_metadata().
  • Add AFE Metrics Publishing: Extended MetricsTracer to parse AFE latency (afe;\s*dur=) from the server-timing header alongside GFE metrics. Two new OpenTelemetry instruments (afe_latency and afe_missing_header_count) have been introduced to publish these.
  • Support for Streaming RPCs: Removed the manual toggle in SpannerMetricsTracerFactory. GFE and AFE metrics capture is now always-on whenever OpenTelemetry tracing is enabled.
  • Enable Frontend Metrics by Default: Removed the gfe_enabled toggle in SpannerMetricsTracerFactory. GFE metrics capture is now always-on whenever OpenTelemetry tracing is enabled.
  • Testing: Added unit tests and a new mockserver test (test_frontend_metrics.py) to ensure both GFE and AFE metrics are correctly published end-to-end.
  • Local Testing Screenshot: https://screenshot.googleplex.com/image/4tmjwuPjzdttcjW.png

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.

Choose a reason Spam Abuse Off Topic Outdated Duplicate Resolved Low Quality

Code Review

This pull request introduces deferred metrics recording for streaming and async streaming RPC responses in Google Cloud Spanner by wrapping responses in specialized wrappers. It also implements GFE latency extraction from response metadata and adds corresponding tests. The review feedback highlights several critical improvements for robustness: refining streaming response detection to check for iterator methods (next and anext) rather than iterable methods to prevent incorrect wrapping of standard iterables; wrapping telemetry and metrics recording blocks in try-except blocks to ensure telemetry failures do not disrupt the main application flow; defensively validating metadata elements before unpacking to avoid unpacking errors; and properly decoding bytes metadata values before regex matching.

parthea commented Jun 26, 2026

Copy link
Copy Markdown
Contributor

@sinhasubham, Please merge main into this branch. The presubmit failures were addressed in #17578

sinhasubham force-pushed the gfe-metrics-fix branch 6 times, most recently from a495bbb to 82f08c2 Compare July 1, 2026 09:38
sinhasubham marked this pull request as ready for review July 6, 2026 06:11
sinhasubham requested a review from a team as a code owner July 6, 2026 06:11
sinhasubham requested a review from surbhigarg92 July 6, 2026 06:11
Comment on lines +204 to +207
instrument_gfe_latency: Optional["Histogram"] = None,
instrument_gfe_missing_header_count: Optional["Counter"] = None,
instrument_afe_latency: Optional["Histogram"] = None,
instrument_afe_missing_header_count: Optional["Counter"] = None,

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.

Choose a reason Spam Abuse Off Topic Outdated Duplicate Resolved Low Quality

Why Optional ?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Choose a reason Spam Abuse Off Topic Outdated Duplicate Resolved Low Quality

Addressed

Comment on lines +442 to +443
self._tracer.record_gfe_metrics(metadata)
self._tracer.record_afe_metrics(metadata)

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.

Choose a reason Spam Abuse Off Topic Outdated Duplicate Resolved Low Quality

Both methods are extracting latency values from metadata seprarately, this can be optimized to fetch both afe and gfe latency values from the metadata once, and pass it in these recorder methods

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Choose a reason Spam Abuse Off Topic Outdated Duplicate Resolved Low Quality

Addressed

Comment on lines +138 to +139
if hasattr(response, "__next__"):
return _StreamingResponseWrapper(response, tracer)

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.

Choose a reason Spam Abuse Off Topic Outdated Duplicate Resolved Low Quality

Instead of checking this, cant we have interceptor listening to different events.

For eg: refer Node code, similar thing is used in Java and Go as well https://github.com/googleapis/google-cloud-node/blob/main/handwritten/spanner/src/metrics/interceptor.ts#L65

We have events like onReceiveStatus onReceiveMetadata ,

onReceiveStatus will only be called after the requests has finished execution which should trigger record_attempt_completion

onReceiveMetadata should be the place where we capture the metadata and use the value while calling record_gfe_metrics from onReceiveStatus

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Choose a reason Spam Abuse Off Topic Outdated Duplicate Resolved Low Quality

Unlike Node.js, Java or Go: Python grpc and grpc.aio client interceptor APIs do not natively expose event-based lifecycle hooks (like onReceiveMetadata or onReceiveStatus).

Copy link
Copy Markdown
Contributor

/gemini review

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.

Choose a reason Spam Abuse Off Topic Outdated Duplicate Resolved Low Quality

Code Review

This pull request adds support for collecting and exporting Application Front End (AFE) metrics alongside Google Front End (GFE) metrics, and introduces an AsyncMetricsInterceptor to handle asynchronous gRPC calls. The review feedback highlights critical issues: first, passing call_details.metadata directly to _extract_resource_from_path in the async interceptor will raise an AttributeError because it is a grpc.aio.Metadata object rather than a dictionary; second, metadata keys can be bytes in some gRPC environments, meaning str(key) will produce "b'server-timing'" and fail string comparisons in both extract_gfe_latency and extract_afe_latency.

Comment on lines +63 to +64
METRIC_NAME_AFE_LATENCY = "afe_latency"
METRIC_NAME_AFE_MISSING_HEADER_COUNT = "afe_missing_header_count"

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.

Choose a reason Spam Abuse Off Topic Outdated Duplicate Resolved Low Quality

Metric names are "gfe_latencies" and "afe_latencies" .

Not sure how were you able to export metrics to Cloud Monarch and Monitoring ? The screenshot attached shows metrics in "Generic Task" , it should be under Spanner -> Client with full name as spanner.googleapis.com/client/afe_latencies

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Choose a reason Spam Abuse Off Topic Outdated Duplicate Resolved Low Quality

Addressed. updated test screenshot

sinhasubham force-pushed the gfe-metrics-fix branch 4 times, most recently from ceaa773 to 644fe1c Compare July 26, 2026 05:14

surbhigarg92 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.

Choose a reason Spam Abuse Off Topic Outdated Duplicate Resolved Low Quality

)
method_str = call_details.method
if isinstance(method_str, bytes):
method_str = method_str.decode("utf-8")

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.

Choose a reason Spam Abuse Off Topic Outdated Duplicate Resolved Low Quality

Why do we need this ? Why would method name have the encoding ? It was not there earlier, which case was failing because of it ?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Choose a reason Spam Abuse Off Topic Outdated Duplicate Resolved Low Quality

This is needed for async flow as in the asynchronous grpc.aio library, the underlying C-extension passes call_details.method as a byte string. So this is needed in async_intercept but not mandatory for sync intercept. So i have removed this from sync intercept and kept utf-8 decoding in async_intercept.

tracer.set_method(method_name)
tracer.record_attempt_start()

if os.environ.get("SPANNER_DISABLE_AFE_SERVER_TIMING", "").lower() != "true":

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.

Choose a reason Spam Abuse Off Topic Outdated Duplicate Resolved Low Quality

Instead of getting this from ENV for every call, can we fetch it once during client init and pass it to the interceptor ?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Choose a reason Spam Abuse Off Topic Outdated Duplicate Resolved Low Quality

Addressed

Comment on lines +138 to +142
if os.environ.get("SPANNER_DISABLE_AFE_SERVER_TIMING", "").lower() != "true":
metadata = list(call_details.metadata or [])
metadata.append(("x-goog-spanner-enable-afe-server-timing", "true"))
call_details = call_details._replace(metadata=metadata)

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.

Choose a reason Spam Abuse Off Topic Outdated Duplicate Resolved Low Quality

nit: Good to create a method in helpers file for appending metadata like we have for all other headers

https://github.com/googleapis/google-cloud-python/blob/main/packages/google-cloud-spanner/google/cloud/spanner_v1/_helpers.py#L803

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Choose a reason Spam Abuse Off Topic Outdated Duplicate Resolved Low Quality

Addressed

if os.environ.get("SPANNER_DISABLE_AFE_SERVER_TIMING", "").lower() != "true":
metadata = list(call_details.metadata or [])
metadata.append(("x-goog-spanner-enable-afe-server-timing", "true"))
call_details = call_details._replace(metadata=metadata)

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.

Choose a reason Spam Abuse Off Topic Outdated Duplicate Resolved Low Quality

Instead of doing call_details._replace which might be a little expensive operation , this can be done with all other metadata.

Eg: We could do this where we are appending prefix metadata which is already called for every operation

https://github.com/googleapis/google-cloud-python/blob/main/packages/google-cloud-spanner/google/cloud/spanner_v1/_helpers.py#L710C5-L710C26

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Choose a reason Spam Abuse Off Topic Outdated Duplicate Resolved Low Quality

Addressed

)
self.enabled = enabled
self.gfe_enabled = gfe_enabled
self.gfe_enabled = True

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.

Choose a reason Spam Abuse Off Topic Outdated Duplicate Resolved Low Quality

nit: We could remove this

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Choose a reason Spam Abuse Off Topic Outdated Duplicate Resolved Low Quality

Addressed removed gfe_enabled completely

not self.enabled
or not HAS_OPENTELEMETRY_INSTALLED
or not getattr(self, "_instrument_afe_latency", None)
or os.environ.get("SPANNER_DISABLE_AFE_SERVER_TIMING", "").lower() == "true"

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.

Choose a reason Spam Abuse Off Topic Outdated Duplicate Resolved Low Quality

nit: Same here, dont fetch from ENV for every call, have a static property and use it.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Choose a reason Spam Abuse Off Topic Outdated Duplicate Resolved Low Quality

Addressed

header_vals = []
for key, val in items:
key_str = key.decode("utf-8") if isinstance(key, bytes) else str(key)
if key_str and key_str.lower() in ("server-timing", "server_timing"):

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.

Choose a reason Spam Abuse Off Topic Outdated Duplicate Resolved Low Quality

We are only capturing "server-timing" in all other clients not "server_timing"

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Choose a reason Spam Abuse Off Topic Outdated Duplicate Resolved Low Quality

Addressed

pass

if afe_latency is None:
match = re.search(r"afe(?:t4t7)?;\s*dur=([0-9.]+)", header_val)

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.

Choose a reason Spam Abuse Off Topic Outdated Duplicate Resolved Low Quality

nit: Optional "t4t7" is not required, it will always be like "/afe; dur=([0-9]+).*/"

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Choose a reason Spam Abuse Off Topic Outdated Duplicate Resolved Low Quality

Addressed

sinhasubham merged commit abf1178 into main Jul 29, 2026
39 checks passed
sinhasubham deleted the gfe-metrics-fix branch July 29, 2026 08:45
release-please Bot mentioned this pull request Jul 29, 2026
zhumin8 mentioned this pull request Jul 29, 2026
sofisl pushed a commit that referenced this pull request Aug 6, 2026
🤖 I have created a release *beep* *boop*
---


<details><summary>bigquery-magics: 0.15.1</summary>

##
[0.15.1](bigquery-magics-v0.15.0...bigquery-magics-v0.15.1)
(2026-08-06)


### Bug Fixes

* bump grpcio to 1.59.0; require Python 3.10+
([#17351](#17351))
([a53487a](a53487a))
* require Protobuf 6.33.5+
([#17743](#17743))
([d267342](d267342))
</details>

<details><summary>gapic-generator: 1.38.0</summary>

##
[1.38.0](gapic-generator-v1.37.1...gapic-generator-v1.38.0)
(2026-08-06)


### Features

* **generator:** delegate REST transcoding to google-api-core
([#17766](#17766))
([7b05aab](7b05aab))
* **generator:** gapic generator centralization routing
([#17816](#17816))
([32a2442](32a2442))


### Bug Fixes

* add typing for header_params
([#17914](#17914))
([9e98b93](9e98b93))
* **api-core:** use truthiness check in setup_request_id to support
proto-plus messages
([#18000](#18000))
([ad8f93c](ad8f93c))
* avoid retaining routing parameter instances in cache
([#17961](#17961))
([f64ada2](f64ada2))
* bump aiohttp from 3.13.5 to 3.14.3 in /packages/gapic-generator
([#17990](#17990))
([6ff5815](6ff5815))
* bump cryptography from 48.0.1 to 50.0.0 in /packages/gapic-generator
([#17991](#17991))
([d607f25](d607f25))
* bump grpcio to 1.59.0; require Python 3.10+
([#17351](#17351))
([a53487a](a53487a))
* **generator:** use flat_ref_types in test templates and delete
remove-unused-imports
([#17900](#17900))
([395f764](395f764))
* require Protobuf 6.33.5+
([#17743](#17743))
([d267342](d267342))
* resolve collision with reserved words in samples
([#17912](#17912))
([588cda9](588cda9))
* upgrade Protobuf and gRPC in WORKSPACE
([#17882](#17882))
([5b5ece5](5b5ece5))
</details>

<details><summary>gcp-sphinx-docfx-yaml: 3.3.1</summary>

##
[3.3.1](gcp-sphinx-docfx-yaml-v3.3.0...gcp-sphinx-docfx-yaml-v3.3.1)
(2026-08-06)


### Bug Fixes

* bump grpcio to 1.59.0; require Python 3.10+
([#17351](#17351))
([a53487a](a53487a))
* require Protobuf 6.33.5+
([#17743](#17743))
([d267342](d267342))
</details>

<details><summary>google-ads-admanager: 0.10.1</summary>

##
[0.10.1](google-ads-admanager-v0.10.0...google-ads-admanager-v0.10.1)
(2026-08-06)


### Features

* update googleapis and regenerate
([#17893](#17893))
([e70ab6f](e70ab6f))
</details>

<details><summary>google-api-core: 2.34.0</summary>

##
[2.34.0](google-api-core-v2.33.0...google-api-core-v2.34.0)
(2026-08-06)


### Features

* Add Feature Gating configuration helpers.
([#17524](#17524))
([eceea95](eceea95))
* **api-core:** centralize rest transcoding helpers
([#17765](#17765))
([4f21b8b](4f21b8b))


### Bug Fixes

* **api-core:** use truthiness check in setup_request_id to support
proto-plus messages
([#18000](#18000))
([ad8f93c](ad8f93c))
* bump grpcio to 1.59.0; require Python 3.10+
([#17351](#17351))
([a53487a](a53487a))
* deduplicate x-goog-api-client headers
([#17616](#17616))
([6167e41](6167e41))
* require Protobuf 6.33.5+
([#17743](#17743))
([d267342](d267342))
</details>

<details><summary>google-apps-chat: 0.10.4</summary>

##
[0.10.4](google-apps-chat-v0.10.3...google-apps-chat-v0.10.4)
(2026-08-06)


### Features

* update googleapis and regenerate
([#17893](#17893))
([e70ab6f](e70ab6f))
</details>

<details><summary>google-auth: 2.56.3</summary>

##
[2.56.3](google-auth-v2.56.2...google-auth-v2.56.3)
(2026-08-06)


### Bug Fixes

* **auth:** avoid creating mTLS SSL context for custom async transports
([#17825](#17825))
([fbe33f9](fbe33f9)),
refs
[#17622](#17622)
* **auth:** only trigger mTLS certificate rotation on mTLS endpoints
([#17928](#17928))
([f7b49ea](f7b49ea))
* **auth:** properly extract stdout from gnubby webauthn plugin failures
([#17885](#17885))
([744e826](744e826))
* deduplicate x-goog-api-client headers
([#17616](#17616))
([6167e41](6167e41))
* **oauth2:** avoid redundant JWKS network fetches
([#17891](#17891))
([de53298](de53298))


### Performance Improvements

* **auth:** use generator expression in any() to allow short-circuiting
([735e565](735e565))
* **auth:** use generator expression in any() to allow short-circuiting
([#17937](#17937))
([735e565](735e565))
</details>

<details><summary>google-auth-httplib2: 0.4.1</summary>

##
[0.4.1](google-auth-httplib2-v0.4.0...google-auth-httplib2-v0.4.1)
(2026-08-06)


### Bug Fixes

* require Protobuf 6.33.5+
([#17743](#17743))
([d267342](d267342))
</details>

<details><summary>google-cloud-access-context-manager: 0.6.1</summary>

##
[0.6.1](google-cloud-access-context-manager-v0.6.0...google-cloud-access-context-manager-v0.6.1)
(2026-08-06)


### Bug Fixes

* bump grpcio to 1.59.0; require Python 3.10+
([#17351](#17351))
([a53487a](a53487a))
* require Protobuf 6.33.5+
([#17743](#17743))
([d267342](d267342))
</details>

<details><summary>google-cloud-agentidentitycredentials: 0.1.1</summary>

##
[0.1.1](google-cloud-agentidentitycredentials-v0.1.0...google-cloud-agentidentitycredentials-v0.1.1)
(2026-08-06)


### Features

* **google/cloud/agentidentitycredentials/v1beta:** add
google-cloud-agentidentitycredentials v1beta
([#17898](#17898))
([b692dae](b692dae))
* update googleapis and regenerate
([#17893](#17893))
([e70ab6f](e70ab6f))
</details>

<details><summary>google-cloud-audit-log: 0.6.1</summary>

##
[0.6.1](google-cloud-audit-log-v0.6.0...google-cloud-audit-log-v0.6.1)
(2026-08-06)


### Bug Fixes

* bump grpcio to 1.59.0; require Python 3.10+
([#17351](#17351))
([a53487a](a53487a))
* require Protobuf 6.33.5+
([#17743](#17743))
([d267342](d267342))
</details>

<details><summary>google-cloud-backupdr: 0.10.1</summary>

##
[0.10.1](google-cloud-backupdr-v0.10.0...google-cloud-backupdr-v0.10.1)
(2026-08-06)


### Features

* update googleapis and regenerate
([#17893](#17893))
([e70ab6f](e70ab6f))
</details>

<details><summary>google-cloud-batch: 0.22.2</summary>

##
[0.22.2](google-cloud-batch-v0.22.1...google-cloud-batch-v0.22.2)
(2026-08-06)


### Features

* update googleapis and regenerate
([#17893](#17893))
([e70ab6f](e70ab6f))
</details>

<details><summary>google-cloud-biglake: 0.5.1</summary>

##
[0.5.1](google-cloud-biglake-v0.5.0...google-cloud-biglake-v0.5.1)
(2026-08-06)


### Features

* update googleapis and regenerate
([#17893](#17893))
([e70ab6f](e70ab6f))
</details>

<details><summary>google-cloud-biglake-hive: 0.3.2</summary>

##
[0.3.2](google-cloud-biglake-hive-v0.3.1...google-cloud-biglake-hive-v0.3.2)
(2026-08-06)


### Features

* update googleapis and regenerate
([#17893](#17893))
([e70ab6f](e70ab6f))
</details>

<details><summary>google-cloud-bigquery: 3.43.0</summary>

##
[3.43.0](google-cloud-bigquery-v3.42.3...google-cloud-bigquery-v3.43.0)
(2026-08-06)


### Features

* add pandas-gbq capability helper
([#17957](#17957))
([2207ca6](2207ca6))


### Bug Fixes

* **bigquery:** Fix bigquery socket leak
([#17953](#17953))
([8c26b38](8c26b38))
* remove stray debug print in RangeQueryParameter constructor
([#17973](#17973))
([fe7bfd0](fe7bfd0))


### Documentation

* add connector libraries overview table to package README
([#17939](#17939))
([71bc622](71bc622))
* correct return type in CellDataParser.time_to_py docstring
([#17972](#17972))
([bd1e224](bd1e224))
</details>

<details><summary>google-cloud-bigquery-storage: 2.40.0</summary>

##
[2.40.0](google-cloud-bigquery-storage-v2.39.0...google-cloud-bigquery-storage-v2.40.0)
(2026-08-06)


### Features

* delegate ReadRowsPage.to_arrow to pandas_gbq.arrow
([#17938](#17938))
([aedc66f](aedc66f))


### Bug Fixes

* bump grpcio to 1.59.0; require Python 3.10+
([#17351](#17351))
([a53487a](a53487a))
</details>

<details><summary>google-cloud-binary-authorization: 1.19.1</summary>

##
[1.19.1](google-cloud-binary-authorization-v1.19.0...google-cloud-binary-authorization-v1.19.1)
(2026-08-06)


### Bug Fixes

* require Protobuf 6.33.5+
([#17743](#17743))
([d267342](d267342))
</details>

<details><summary>google-cloud-build: 3.38.1</summary>

##
[3.38.1](google-cloud-build-v3.38.0...google-cloud-build-v3.38.1)
(2026-08-06)


### Bug Fixes

* require Protobuf 6.33.5+
([#17743](#17743))
([d267342](d267342))
</details>

<details><summary>google-cloud-commerceproducer: 0.1.1</summary>

##
[0.1.1](google-cloud-commerceproducer-v0.1.0...google-cloud-commerceproducer-v0.1.1)
(2026-08-06)


### Features

* update googleapis and regenerate
([#17893](#17893))
([e70ab6f](e70ab6f))
</details>

<details><summary>google-cloud-containeranalysis: 2.22.1</summary>

##
[2.22.1](google-cloud-containeranalysis-v2.22.0...google-cloud-containeranalysis-v2.22.1)
(2026-08-06)


### Bug Fixes

* require Protobuf 6.33.5+
([#17743](#17743))
([d267342](d267342))
</details>

<details><summary>google-cloud-core: 2.6.1</summary>

##
[2.6.1](google-cloud-core-v2.6.0...google-cloud-core-v2.6.1)
(2026-08-06)


### Bug Fixes

* bump grpcio to 1.59.0; require Python 3.10+
([#17351](#17351))
([a53487a](a53487a))
* require Protobuf 6.33.5+
([#17743](#17743))
([d267342](d267342))
</details>

<details><summary>google-cloud-documentai-toolbox: 0.17.2</summary>

##
[0.17.2](google-cloud-documentai-toolbox-v0.17.1...google-cloud-documentai-toolbox-v0.17.2)
(2026-08-06)


### Bug Fixes

* require Protobuf 6.33.5+
([#17743](#17743))
([d267342](d267342))
</details>

<details><summary>google-cloud-filestore: 1.17.1</summary>

##
[1.17.1](google-cloud-filestore-v1.17.0...google-cloud-filestore-v1.17.1)
(2026-08-06)


### Bug Fixes

* require Protobuf 6.33.5+
([#17743](#17743))
([d267342](d267342))
</details>

<details><summary>google-cloud-firestore: 2.28.1</summary>

##
[2.28.1](google-cloud-firestore-v2.28.0...google-cloud-firestore-v2.28.1)
(2026-08-06)


### Bug Fixes

* **firestore:** BulkWriter pop from an empty deque
([#17490](#17490))
([8e826f0](8e826f0))
* **firestore:** preserve async limit_to_last ordering
([#17879](#17879))
([caf2fdb](caf2fdb))
</details>

<details><summary>google-cloud-gke-hub: 1.25.1</summary>

##
[1.25.1](google-cloud-gke-hub-v1.25.0...google-cloud-gke-hub-v1.25.1)
(2026-08-06)


### Bug Fixes

* require Protobuf 6.33.5+
([#17743](#17743))
([d267342](d267342))
</details>

<details><summary>google-cloud-iam: 2.24.1</summary>

##
[2.24.1](google-cloud-iam-v2.24.0...google-cloud-iam-v2.24.1)
(2026-08-06)


### Bug Fixes

* require Protobuf 6.33.5+
([#17743](#17743))
([d267342](d267342))
</details>

<details><summary>google-cloud-logging: 3.16.2</summary>

##
[3.16.2](google-cloud-logging-v3.16.1...google-cloud-logging-v3.16.2)
(2026-08-06)


### Bug Fixes

* bump grpcio to 1.59.0; require Python 3.10+
([#17351](#17351))
([a53487a](a53487a))
* require Protobuf 6.33.5+
([#17743](#17743))
([d267342](d267342))
</details>

<details><summary>google-cloud-memorystore: 0.5.4</summary>

##
[0.5.4](google-cloud-memorystore-v0.5.3...google-cloud-memorystore-v0.5.4)
(2026-08-06)


### Features

* update googleapis and regenerate
([#17893](#17893))
([e70ab6f](e70ab6f))
</details>

<details><summary>google-cloud-ndb: 2.5.1</summary>

##
[2.5.1](google-cloud-ndb-v2.5.0...google-cloud-ndb-v2.5.1)
(2026-08-06)


### Bug Fixes

* require Protobuf 6.33.5+
([#17743](#17743))
([d267342](d267342))
</details>

<details><summary>google-cloud-network-connectivity: 2.17.0</summary>

##
[2.17.0](google-cloud-network-connectivity-v2.16.0...google-cloud-network-connectivity-v2.17.0)
(2026-08-06)


### Features

* update googleapis and regenerate
([#17893](#17893))
([e70ab6f](e70ab6f))
</details>

<details><summary>google-cloud-network-services: 0.10.2</summary>

##
[0.10.2](google-cloud-network-services-v0.10.1...google-cloud-network-services-v0.10.2)
(2026-08-06)


### Features

* update googleapis and regenerate
([#17893](#17893))
([e70ab6f](e70ab6f))
* update googleapis and regenerate
([#17933](#17933))
([f7a23a0](f7a23a0))
</details>

<details><summary>google-cloud-pubsub: 2.39.1</summary>

##
[2.39.1](google-cloud-pubsub-v2.39.0...google-cloud-pubsub-v2.39.1)
(2026-08-06)


### Bug Fixes

* bump grpcio to 1.59.0; require Python 3.10+
([#17351](#17351))
([a53487a](a53487a))
</details>

<details><summary>google-cloud-quotas: 0.6.2</summary>

##
[0.6.2](google-cloud-quotas-v0.6.1...google-cloud-quotas-v0.6.2)
(2026-08-06)


### Features

* update googleapis and regenerate
([#17893](#17893))
([e70ab6f](e70ab6f))
</details>

<details><summary>google-cloud-redis-cluster: 0.5.2</summary>

##
[0.5.2](google-cloud-redis-cluster-v0.5.1...google-cloud-redis-cluster-v0.5.2)
(2026-08-06)


### Features

* update googleapis and regenerate
([#17893](#17893))
([e70ab6f](e70ab6f))
</details>

<details><summary>google-cloud-service-control: 1.21.0</summary>

##
[1.21.0](google-cloud-service-control-v1.20.0...google-cloud-service-control-v1.21.0)
(2026-08-06)


### Features

* update googleapis and regenerate
([#17893](#17893))
([e70ab6f](e70ab6f))
</details>

<details><summary>google-cloud-spanner: 3.69.1</summary>

##
[3.69.1](google-cloud-spanner-v3.69.0...google-cloud-spanner-v3.69.1)
(2026-08-06)


### Bug Fixes

* bump grpcio to 1.59.0; require Python 3.10+
([#17351](#17351))
([a53487a](a53487a))
* **metrics:** fix GFE and AFE metrics publishing
([#17561](#17561))
([abf1178](abf1178))
* **spanner:** escape embedded backticks in dbapi escape_name
([#17810](#17810))
([c8b0b28](c8b0b28))
* **spanner:** implement dict protocol and nested unwrapping for
JsonObject
([#17915](#17915))
([06c1f05](06c1f05)),
refs
[#15870](#15870)
</details>

<details><summary>google-cloud-storage: 3.13.1</summary>

##
[3.13.1](google-cloud-storage-v3.13.0...google-cloud-storage-v3.13.1)
(2026-08-06)


### Bug Fixes

* bump grpcio to 1.59.0; require Python 3.10+
([#17351](#17351))
([a53487a](a53487a))
* require Protobuf 6.33.5+
([#17743](#17743))
([d267342](d267342))
</details>

<details><summary>google-cloud-storage-control: 1.13.0</summary>

##
[1.13.0](google-cloud-storage-control-v1.12.0...google-cloud-storage-control-v1.13.0)
(2026-08-06)


### Features

* update googleapis and regenerate
([#17893](#17893))
([e70ab6f](e70ab6f))
</details>

<details><summary>google-cloud-support: 0.5.2</summary>

##
[0.5.2](google-cloud-support-v0.5.1...google-cloud-support-v0.5.2)
(2026-08-06)


### Features

* update googleapis and regenerate
([#17933](#17933))
([f7a23a0](f7a23a0))
</details>

<details><summary>google-cloud-tasks: 2.24.0</summary>

##
[2.24.0](google-cloud-tasks-v2.23.0...google-cloud-tasks-v2.24.0)
(2026-08-06)


### Features

* update googleapis and regenerate
([#17893](#17893))
([e70ab6f](e70ab6f))
</details>

<details><summary>google-cloud-testutils: 1.9.2</summary>

##
[1.9.2](google-cloud-testutils-v1.9.1...google-cloud-testutils-v1.9.2)
(2026-08-06)


### Bug Fixes

* require Protobuf 6.33.5+
([#17743](#17743))
([d267342](d267342))
</details>

<details><summary>google-developer-knowledge: 0.1.1</summary>

##
[0.1.1](google-developer-knowledge-v0.1.0...google-developer-knowledge-v0.1.1)
(2026-08-06)


### Features

* update googleapis and regenerate
([#17893](#17893))
([e70ab6f](e70ab6f))
</details>

<details><summary>google-maps-navconnect: 0.2.1</summary>

##
[0.2.1](google-maps-navconnect-v0.2.0...google-maps-navconnect-v0.2.1)
(2026-08-06)


### Features

* update googleapis and regenerate
([#17893](#17893))
([e70ab6f](e70ab6f))
</details>

<details><summary>google-resumable-media: 2.10.1</summary>

##
[2.10.1](google-resumable-media-v2.10.0...google-resumable-media-v2.10.1)
(2026-08-06)


### Bug Fixes

* require Protobuf 6.33.5+
([#17743](#17743))
([d267342](d267342))
</details>

<details><summary>googleapis-common-protos: 1.75.1</summary>

##
[1.75.1](googleapis-common-protos-v1.75.0...googleapis-common-protos-v1.75.1)
(2026-08-06)


### Bug Fixes

* bump grpcio to 1.59.0; require Python 3.10+
([#17351](#17351))
([a53487a](a53487a))
* require Protobuf 6.33.5+
([#17743](#17743))
([d267342](d267342))
</details>

<details><summary>grafeas: 1.24.0</summary>

##
[1.24.0](grafeas-v1.23.0...grafeas-v1.24.0)
(2026-08-06)


### Features

* update googleapis and regenerate
([#17933](#17933))
([f7a23a0](f7a23a0))
</details>

<details><summary>grpc-google-iam-v1: 0.14.5</summary>

##
[0.14.5](grpc-google-iam-v1-v0.14.4...grpc-google-iam-v1-v0.14.5)
(2026-08-06)


### Bug Fixes

* bump grpcio to 1.59.0; require Python 3.10+
([#17351](#17351))
([a53487a](a53487a))
* require Protobuf 6.33.5+
([#17743](#17743))
([d267342](d267342))
</details>

<details><summary>proto-plus: 1.28.3</summary>

##
[1.28.3](proto-plus-v1.28.2...proto-plus-v1.28.3)
(2026-08-06)


### Bug Fixes

* bump grpcio to 1.59.0; require Python 3.10+
([#17351](#17351))
([a53487a](a53487a))
* **proto-plus:** add context to TypeErrors during message manipulation
([#17682](#17682))
([08f21a6](08f21a6))
* require Protobuf 6.33.5+
([#17743](#17743))
([d267342](d267342))
</details>

<details><summary>sqlalchemy-bigquery: 1.17.2</summary>

##
[1.17.2](sqlalchemy-bigquery-v1.17.1...sqlalchemy-bigquery-v1.17.2)
(2026-08-06)


### Bug Fixes

* require Protobuf 6.33.5+
([#17743](#17743))
([d267342](d267342))
</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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants


Back | FazBrowse Home | New Git URL