info()

Liefert eine Momentaufnahme der Pool-Verbindungs-Statistik. Delegiert intern an SyncPoolClient.connection_stats() bzw. AsyncPoolClient.connection_stats().

Jeder Eintrag der zurückgegebenen Liste beschreibt eine lebende Pool-Connection mit

  • Ziel-Server (Hostname/Port)

  • automatisch gecachten server_info-Metadaten (Produktversion, Plattform, …) — gesetzt direkt nach dem Login über krn.GetServerInfoEx

  • Observability-Daten: connected_at, last_call_at, call_count

  • stabiler Connection-UUID (connection_id) für Logging und Korrelation

Mehrere Connections zum selben Host erscheinen als separate Einträge. Das ist beabsichtigt — so siehst du pro Socket, wie oft er genutzt wurde und wann zuletzt. Eine Aggregation nach (hostname, port) oder product_version ist Sache des Aufrufers.

1. Signatur

  • Sync

  • Async

ecm.system.info() -> list[ConnectionStats]
ecm.system.info() -> list[ConnectionStats]

Hinweis: Der Async-Client liefert die Methode nicht als Coroutine — die Daten liegen prozess-lokal im Pool, es findet keine Netzwerk-I/O statt.

2. Parameter

Keine.

3. Rückgabewert

Eine Liste von ConnectionStats-Kopien. Die Liste ist leer, solange keine Connection im Pool existiert (z. B. direkt nach Pool-Konstruktion, bevor der erste execute()-Aufruf die erste Connection erzeugt).

Die Einträge sind unabhängige Snapshots: Mutationen daran wirken sich nicht auf den internen Pool-Zustand aus.

3.1. Felder von ConnectionStats

Feld Typ Beschreibung

connection_id

uuid.UUID

Stabile Identität der Connection, vergeben bei der Erzeugung und unverändert bis zur Invalidierung.

hostname

str

Hostname des Ziel-Servers.

port

int

TCP-Port des Ziel-Servers.

server_info

RpcServerInfo | None

Momentaufnahme der Server-Metadaten zum Zeitpunkt des Connection-Aufbaus. None, falls der Auto-Fetch fehlschlug.

connected_at

datetime

Zeitstempel, als der Login abgeschlossen und die Connection in den Pool aufgenommen wurde.

last_call_at

datetime | None

Zeitstempel des letzten nutzerseitig ausgelösten execute()-Aufrufs. None, bis der erste Aufruf erfolgt ist.

call_count

int

Anzahl der nutzerseitig ausgelösten execute()-Aufrufe auf dieser Connection. Session-Setup-Aufrufe (SessionAttach, SessionPropertiesSet, SessionLogin, GetServerInfoEx) werden nicht mitgezählt.

4. Beispiele

4.1. Pool-Status ausgeben

  • Sync

  • Async

stats = ecm.system.info()
for s in stats:
    version = s.server_info.product_version if s.server_info else "?"
    print(
        f"{s.hostname}:{s.port} v={version} "
        f"calls={s.call_count} last={s.last_call_at} id={s.connection_id}"
    )
stats = ecm.system.info()   # kein await — rein prozess-lokale Daten
for s in stats:
    version = s.server_info.product_version if s.server_info else "?"
    print(
        f"{s.hostname}:{s.port} v={version} "
        f"calls={s.call_count} last={s.last_call_at} id={s.connection_id}"
    )

4.2. Aggregation nach Host

from collections import defaultdict

calls_by_host: dict[tuple[str, int], int] = defaultdict(int)
versions_by_host: dict[tuple[str, int], set[str]] = defaultdict(set)

for s in ecm.system.info():
    key = (s.hostname, s.port)
    calls_by_host[key] += s.call_count
    if s.server_info:
        versions_by_host[key].add(s.server_info.product_version)

for host, port in calls_by_host:
    print(f"{host}:{port} calls={calls_by_host[(host, port)]} versions={versions_by_host[(host, port)]}")

4.3. Alle Hosts einer Version-Anforderung prüfen

required_major = 12
outdated = [
    (s.hostname, s.port, s.server_info.product_version)
    for s in ecm.system.info()
    if s.server_info and s.server_info.product_version_major < required_major
]
if outdated:
    raise RuntimeError(f"Found servers below v{required_major}.0: {outdated}")

5. Wichtige Hinweise

  • info() führt keinen RPC-Aufruf durch. Alle Daten liegen bereits prozess-lokal im Pool vor. Die Methode ist billig und kann in Dashboards/Health-Checks ohne Sorgen aufgerufen werden.

  • Einträge verschwinden automatisch, wenn eine Connection invalidiert wird (z. B. nach Netzwerkfehler). Eine Connection, die nicht mehr in der Liste auftaucht, wurde vom Pool aussortiert.

  • info() ist im Async-Client synchron — kein await nötig. Das ist beabsichtigt.

6. Siehe auch