Observability-Metriken
Dieses Dokument beschreibt die Prometheus-Metriken, die von PostgreSQL (via pg_exporter) für den Managed Database Service exportiert werden. Alle Metriken enthalten das Label node_type="primary", da der Dienst mit Patroni für Hochverfügbarkeit konfiguriert ist.
Datenbankgröße
Abschnitt betitelt „Datenbankgröße“pg_database_size_bytes
Abschnitt betitelt „pg_database_size_bytes“Größe der Datenbank-Datei in Bytes (Typ: Gauge)
| Label | Beschreibung | Beispiel-Werte |
|---|---|---|
datname | Name der Datenbank | nextcloud, wordpress, crm |
node_type | Typ des Datenbank-Knotens | primary |
Diese Metrik zeigt die aktuelle Größe jeder Datenbank auf dem Server an und ist wichtig für die Kapazitätsplanung und zeigt auf das Wachstum bezogene Trends.
Sperren (Locks)
Abschnitt betitelt „Sperren (Locks)“pg_locks_count
Abschnitt betitelt „pg_locks_count“Anzahl der Sperren nach Modus und Datenbank (Typ: Gauge)
| Label | Beschreibung | Mögliche Werte |
|---|---|---|
datname | Name der Datenbank | nextcloud, wordpress, crm |
mode | Sperrmodus | Siehe Tabelle unten |
node_type | Typ des Datenbank-Knotens | primary |
Sperrmodi
Abschnitt betitelt „Sperrmodi“| Sperrmodus | Verwendung | Konflikt mit |
|---|---|---|
AccessShareLock | SELECT-Abfragen | AccessExclusiveLock |
RowShareLock | SELECT FOR UPDATE/SHARE | Exclusive, ShareRowExclusive, AccessExclusive |
RowExclusiveLock | INSERT, UPDATE, DELETE | Share, ShareRowExclusive, Exclusive, AccessExclusive |
ShareUpdateExclusiveLock | VACUUM, CREATE INDEX CONCURRENTLY | ShareUpdateExclusive und höher |
ShareLock | CREATE INDEX | RowExclusive und höher |
ShareRowExclusiveLock | Selten verwendet | RowExclusive und höher |
ExclusiveLock | Blockiert allen gleichzeitigen Zugriff | RowExclusive und höher |
AccessExclusiveLock | ALTER TABLE, DROP TABLE, TRUNCATE | Alle Modi |
Hohe Zahlen an Sperren können auf Konflikte und Performance-Probleme hinweisen. Unter normalen Bedingungen sollten die meisten Sperren bei 0 liegen.
Verbindungen
Abschnitt betitelt „Verbindungen“pg_settings_max_connections
Abschnitt betitelt „pg_settings_max_connections“Maximale Anzahl gleichzeitiger Verbindungen zum Datenbankserver (Typ: Gauge)
| Label | Beschreibung |
|---|---|
node_type | Typ des Datenbank-Knotens |
Das System verwendet bis zu 15 Verbindungen für interne essenzielle Prozesse wie zum Beispiel Backup und Monitoring. Diese Verbindungen werden gegen das max_connections-Limit gezählt. Wenn man sich diesem Limit nähert, sollte Connection-Pooling in Betracht gezogen werden.
pg_stat_activity_count
Abschnitt betitelt „pg_stat_activity_count“Anzahl der Verbindungen, gruppiert nach verschiedenen Attributen (Typ: Gauge)
| Label | Beschreibung | Mögliche Werte |
|---|---|---|
datname | Name der Datenbank | nextcloud, wordpress, crm |
state | Status der Verbindung | Siehe Tabelle unten |
application_name | Name der Client-Anwendung | Patroni heartbeat, Patroni restapi, pg_exporter |
backend_type | Typ des Backend-Prozesses | client backend |
usename | Datenbankbenutzer | api, 2178329, christian.walther |
wait_event | Ereignis, auf das gewartet wird | ClientRead |
wait_event_type | Ereignis-Typ | Client |
node_type | Typ des Datenbank-Knotens | primary |
Status der Verbindung
Abschnitt betitelt „Status der Verbindung“| Status | Bedeutung |
|---|---|
active | Abfrage wird gerade ausgeführt |
idle | Verbindung offen, aber keine Abfrage aktiv |
idle in transaction | Verbindung in Transaktion, aber keine aktuelle Abfrage |
idle in transaction (aborted) | Transaktion fehlgeschlagen, wartet auf ROLLBACK |
fastpath function call | Client führt Fast-Path-Funktion aus |
disabled | Tracking für diese Verbindung deaktiviert |
idle in transaction über längere Zeiträume deutet auf Probleme auf Anwendungsebene hin. Viele idle-Verbindungen zeigt das ineffiziente Verwalten von Verbindungen.
Datenbank-Statistiken
Abschnitt betitelt „Datenbank-Statistiken“pg_stat_database_blks_hit
Abschnitt betitelt „pg_stat_database_blks_hit“Anzahl der angeforderten Zugriffe auf den Massenspeicher, die bereits im Cache gefunden wurden (Typ: Counter)
| Label | Beschreibung |
|---|---|
datname | Name der Datenbank |
node_type | Typ des Datenbank-Knotens |
Die Cache-Hit-Ratio wird als blks_hit / (blks_hit + blks_read) berechnet. Ziel ist eine Cache-Hit-Ratio von >99 % für eine gute Performance.
pg_stat_database_blks_read
Abschnitt betitelt „pg_stat_database_blks_read“Anzahl der Festplattenblöcke, die von der Festplatte gelesen werden mussten (Typ: Counter)
| Label | Beschreibung |
|---|---|
datname | Name der Datenbank |
node_type | Typ des Datenbank-Knotens |
Niedrige Werte im Verhältnis zu blks_hit sind optimal. Hohe Werte weisen auf unzureichende Shared Buffers oder einen kalten Cache hin.
pg_stat_database_conflicts
Abschnitt betitelt „pg_stat_database_conflicts“Anzahl der Abfragen, die aufgrund von Konflikten mit der Wiederherstellung abgebrochen wurden (Typ: Counter)
| Label | Beschreibung |
|---|---|
datname | Name der Datenbank |
node_type | Typ des Datenbank-Knotens |
Diese Metrik ist hauptsächlich auf Standby-/Replica-Servern relevant. Ein Wert von 0 ist für primäre Knoten normal.
pg_stat_database_temp_bytes
Abschnitt betitelt „pg_stat_database_temp_bytes“Gesamtmenge der in temporäre Dateien geschriebenen Daten (in Bytes) (Typ: Counter)
| Label | Beschreibung |
|---|---|
datname | Name der Datenbank |
node_type | Typ des Datenbank-Knotens |
Hohe Werte weisen auf Abfragen hin, die mehr RAM benötigen, als work_mem zulässt. Häufige Nutzung temporärer Dateien sollte durch Erhöhung von work_mem oder Optimierung der Abfragen behoben werden.
pg_stat_database_tup_deleted
Abschnitt betitelt „pg_stat_database_tup_deleted“Anzahl der durch Abfragen gelöschten Zeilen (Typ: Counter)
| Label | Beschreibung |
|---|---|
datname | Name der Datenbank |
node_type | Typ des Datenbank-Knotens |
Zeigt DELETE-Aktivitäten in der Datenbank an. Hohe Löschraten erfordern regelmäßige VACUUM-Operationen.
pg_stat_database_tup_fetched
Abschnitt betitelt „pg_stat_database_tup_fetched“Anzahl der durch Abfragen abgerufenen Zeilen (Typ: Counter)
| Label | Beschreibung |
|---|---|
datname | Name der Datenbank |
node_type | Typ des Datenbank-Knotens |
Misst die Anzahl der tatsächlich zurückgegebenen Zeilen. Hohe Werte zeigen eine intensive Leseaktivität.
pg_stat_database_tup_inserted
Abschnitt betitelt „pg_stat_database_tup_inserted“Anzahl der durch Abfragen eingefügten Zeilen (Typ: Counter)
| Label | Beschreibung |
|---|---|
datname | Name der Datenbank |
node_type | Typ des Datenbank-Knotens |
Zeigt INSERT-Aktivitäten in der Datenbank an.
pg_stat_database_tup_updated
Abschnitt betitelt „pg_stat_database_tup_updated“Anzahl der durch Abfragen aktualisierten Zeilen (Typ: Counter)
| Label | Beschreibung |
|---|---|
datname | Name der Datenbank |
node_type | Typ des Datenbank-Knotens |
Updates erzeugen neue Versionen von Zeilen (MVCC), daher ist VACUUM wichtig. Hohe Update-Raten können zu Tabellen-Bloat führen.
pg_stat_database_xact_commit
Abschnitt betitelt „pg_stat_database_xact_commit“Anzahl der erfolgreich abgeschlossenen Transaktionen (Typ: Counter)
| Label | Beschreibung |
|---|---|
datname | Name der Datenbank |
node_type | Typ des Datenbank-Knotens |
Zeigt die Anzahl der erfolgreichen Transaktionen an. Hohe Werte deuten auf eine intensive Datenbankaktivität hin.
Verfügbarkeit des Dienstes
Abschnitt betitelt „Verfügbarkeit des Dienstes“Gibt an, ob der letzte Scrape erfolgreich eine Verbindung zum Server hergestellt hat (Typ: Gauge)
| Label | Beschreibung | Werte |
|---|---|---|
node_type | Typ des Datenbank-Knotens | 1 = Verbindung erfolgreich, 0 = Verbindung fehlgeschlagen |
Dies ist die wichtigste Metrik für das Alerting. Wenn der Wert 0 ist, sind alle anderen Metriken nicht verfügbar.
Empfohlene Alerts
Abschnitt betitelt „Empfohlene Alerts“| Alert | Bedingung | Schweregrad |
|---|---|---|
| PostgreSQL Down | pg_up == 0 | Critical |
| Connection Limit | pg_stat_activity_count / pg_settings_max_connections > 0.8 | Warning |
| Connection Limit Critical | pg_stat_activity_count / pg_settings_max_connections > 0.9 | Critical |
| Low Cache Hit Ratio | rate(pg_stat_database_blks_hit) / (rate(pg_stat_database_blks_hit) + rate(pg_stat_database_blks_read)) < 0.95 | Warning |
| Temp File Usage | rate(pg_stat_database_temp_bytes[5m]) > 0 | Warning |
| Too Many Locks | pg_locks_count > 100 | Warning |
| Long Running Transactions | pg_stat_activity_count{state="idle in transaction"} > 0 für > 5 Min. | Warning |
Best Practices für das Monitoring
Abschnitt betitelt „Best Practices für das Monitoring“- Cache-Effizienz überwachen: Das Verhältnis
blks_hit / (blks_hit + blks_read)sollte konsistent >99 % sein. - Connection-Pooling: Wenn man sich
max_connectionsnähert, sollte eine Connection-Pool-Bibliothek/-Anwendung (z. B.pgBouncer) eingesetzt werden. - Nutzung temporärer Dateien: Sollte bei 0 bleiben. Wenn nicht,
work_memerhöhen oder Abfragen optimieren. - Sperren-Monitoring: Regelmäßige Sperren können auf Designfehler hinweisen.
- Idle in transaction: Diese Verbindungen sollten nicht länger als ein paar Sekunden bestehen bleiben.
Hinweise
Abschnitt betitelt „Hinweise“- Alle Metriken werden über den
pg_exporterbereitgestellt und von Prometheus erfasst. - Der Dienst läuft mit Patroni für Hochverfügbarkeit, daher das Label
node_type="primary". - Die aufgelisteten Metriken bilden die Grundlage für Monitoring und Alerting. Zusätzliche Metriken für Replikation, Background-Writer und WAL-Archivierung können je nach Setup verfügbar sein.