[aio] host_monitoring_v2 without a topology plugin fails the first statement on cluster-endpoint connections
Maintainer antworten meist innerhalb von 1 Tag
Bewertung
- Schwierigkeit
- 4/5
- Geschätzter Aufwand
- 3-5 Tage
- Anfängerfreundlichkeit
- 49/100
Rechercherichtung
Start with aio/wrapper.py and _build_host_list_provider, then compare the Aurora dialect provider selection in database_dialect.py with the async behavior. Trace how AsyncHostMonitoringPlugin._get_monitoring_host_info identifies and caches a host, using the described mocked reproduction as a starting point. Done when the first statement succeeds through a cluster endpoint and monitoring targets the connected instance, with regression coverage for the failure and cache behavior.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Beschreibung
Describe the bug
With the async API, host_monitoring_v2 used without a topology plugin (no failover, failover_v2, aurora_connection_tracker, ...) fails the first statement on every new connection made through an Aurora cluster endpoint, with AwsWrapperError: [HostMonitoringV2Plugin] Unable to identify the connected database instance. Later statements on that connection succeed, but the monitor watches the cluster endpoint's DNS name instead of the instance the connection is on.
Cause:
aio/wrapper.py_build_host_list_providerreturnsAsyncStaticHostListProviderwhenpluginscontains none of_TOPOLOGY_REQUIRING_PLUGINS, whatever the database dialect.host_monitoring_v2isn't in that set.- For a cluster endpoint,
AsyncHostMonitoringPlugin._get_monitoring_host_infocallsplugin_service.identify_connection. With the static provider the topology has nohost_id, so it returnsNoneand the plugin raises before running the statement. _get_monitoring_host_infoassignsself._monitoring_host_info = current_host_infobefore identifying, so on the next statement it returns the cached cluster endpoint and monitors that.
The sync wrapper doesn't hit this: Aurora dialects always use RdsHostListProvider (database_dialect.py, AuroraPgDialect.get_host_list_provider_supplier), regardless of plugins, so identify_connection resolves the instance.
Expected Behavior
As in sync, host_monitoring_v2 alone on a cluster endpoint identifies the instance the connection landed on and monitors it, and the first statement runs normally.
What plugins are used? What other connection properties were set?
wrapper_dialect=aurora-pg&wrapper_plugins=host_monitoring_v2, connecting through the cluster (writer) endpoint. With failover added, or through an instance endpoint, it works.
Current Behavior
Checked without a database by building the provider the way connect does and calling _get_monitoring_host_info with get_instance_id patched to return an instance id:
AsyncStaticHostListProvider mydb.cluster-xyz... -> 1st call: AwsWrapperError: Unable to identify the connected database instance
2nd call: monitors mydb.cluster-xyz.us-east-1.rds.amazonaws.com
AsyncStaticHostListProvider inst-1.xyz... -> monitors inst-1.xyz.us-east-1.rds.amazonaws.com
Reproduction Steps
import asyncio
from sqlalchemy import text
from sqlalchemy.ext.asyncio import create_async_engine
from aws_advanced_python_wrapper.aio import release_resources_async
async def main():
engine = create_async_engine(
"postgresql+aws_wrapper_psycopg://USER:PASSWORD@<name>.cluster-<id>.<region>.rds.amazonaws.com:5432/DB"
"?wrapper_dialect=aurora-pg&wrapper_plugins=host_monitoring_v2")
try:
async with engine.connect() as conn:
await conn.execute(text("SELECT 1")) # raises AwsWrapperError
finally:
await engine.dispose()
await release_resources_async()
asyncio.run(main())
Possible Solution
Match sync: pick the topology-aware provider from the Aurora/Multi-AZ/Global dialect even when no topology plugin is configured, or add host_monitoring_v2 (and host_monitoring) to _TOPOLOGY_REQUIRING_PLUGINS. Either way, resolve the instance (the topology monitor is shared per cluster after #1285, so this costs one monitoring connection per cluster). Separately, _get_monitoring_host_info shouldn't cache the cluster endpoint when identification fails.
Additional Information/Context
Found while answering a user question about using host_monitoring_v2 without failover. Related: #1284.
The AWS Advanced Python Wrapper version used
main at 8feea85 (3.1.0)
python version used
Python 3.14
Operating System and version
macOS (checked locally, not against a live cluster)
- Vorherrschende Sprache
- Python
- Sterne
- 99
- Forks
- 22
- Ø Merge
- 1 T. 7 Std.
- Gemergte PRs (30 T.)
- 4
Entwicklungsumgebung
- Kein Dockerfile und keine Docker-Compose-Datei
- Hat eine Pull-Request-Vorlage
- Beitragsleitfaden lesen
Erste Schritte
- Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
- Forken Sie das Repository und arbeiten Sie in einem Branch.
- Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.
Mehr aus aws/aws-advanced-python-wrapper
-
[aio] host_monitoring_v2: event loops stop each other's monitors, recreating them on every statementEvtl. vergeben @AhmadMasry hat das vor 1 Tag übernommen. Offen
Schwierigkeit 4/5 3-5 Tage Anfängerfreundlichkeit 35/100
aws/aws-advanced-python-wrapper#1287 ·
Maintainer antworten meist innerhalb von 1 Tag
-
Async: every connection opens its own topology monitor connection (pool of N holds 2N connections)Evtl. vergeben @AhmadMasry hat das vor 1 Tag übernommen. Offen
Schwierigkeit 4/5 3-5 Tage Anfängerfreundlichkeit 25/100
aws/aws-advanced-python-wrapper#1284 · 1 Kommentar ·
Maintainer antworten meist innerhalb von 1 Tag
-
bug
Schwierigkeit 5/5 Über eine Woche Anfängerfreundlichkeit 35/100
aws/aws-advanced-python-wrapper#1278 ·
Maintainer antworten meist innerhalb von 1 Tag
-
bug
Schwierigkeit 4/5 3-5 Tage Anfängerfreundlichkeit 72/100
aws/aws-advanced-python-wrapper#1276 · 2 Kommentare ·
Maintainer antworten meist innerhalb von 1 Tag
-
bug
Schwierigkeit 4/5 3-5 Tage Anfängerfreundlichkeit 48/100
aws/aws-advanced-python-wrapper#1275 · 1 Kommentar ·
Maintainer antworten meist innerhalb von 1 Tag
Alle Issues in aws/aws-advanced-python-wrapper
Ähnliche Issues
-
Schwierigkeit 1/5 Unter einer Stunde Anfängerfreundlichkeit 85/100
Vector35/community-plugins#376 ·
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 68/100
py-econometrics/pyfixest#1883 ·
Maintainer antworten meist innerhalb von 1 Tag
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 65/100
ietf-tools/rfc2html#81 ·
-
Schwierigkeit 1/5 Unter einer Stunde Anfängerfreundlichkeit 88/100
mysql/mysql-operator#60 ·
-
Python: Bug: split_plaintext_paragraph / split_markdown_paragraph can return a chunk larger than max_tokensEvtl. vergeben @xThreeh hat das heute übernommen. Offenpython triage
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 75/100
microsoft/semantic-kernel#14566 ·
Maintainer antworten meist innerhalb von 4 Tagen