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 überkrn.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 |
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.
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 |
|---|---|---|
|
|
Stabile Identität der Connection, vergeben bei der Erzeugung und unverändert bis zur Invalidierung. |
|
|
Hostname des Ziel-Servers. |
|
|
TCP-Port des Ziel-Servers. |
|
|
Momentaufnahme der Server-Metadaten zum Zeitpunkt des Connection-Aufbaus. |
|
|
Zeitstempel, als der Login abgeschlossen und die Connection in den Pool aufgenommen wurde. |
|
|
Zeitstempel des letzten nutzerseitig ausgelösten |
|
|
Anzahl der nutzerseitig ausgelösten |
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 — keinawaitnötig. Das ist beabsichtigt.
6. Siehe auch
-
definition() — Server-Objektdefinition (asobjdef)