Snowflake Postgres-Metriken

Snowflake Postgres sammelt automatisch Instanzmetriken und speichert sie in der aktiven Ereignistabelle. Ein Monitoring-Agent erfasst Metriken etwa alle 5 bis 30 Sekunden (abhängig vom Metriktyp) und schreibt sie in SNOWFLAKE.TELEMETRY.EVENTS mit RECORD_TYPE = 'METRIC'.

Sie können diese Metriken direkt in Snowflake abfragen oder an eine externe Beobachtungsplattform wie Grafana oder Observe weiterleiten.

Bemerkung

Informationen zum Abfragen von Postgres *Protokoll*daten aus der Ereignistabelle finden Sie unter Snowflake Postgres-Protokollierung.

Verfügbare Metriken

Postgres-Metriken

Kennzahl

Typ

Beschreibung

postgres_connections

gauge

Anzahl der aktiven Backend-Verbindungen

postgres_databases_size_bytes

gauge

Gesamtgröße aller Datenbanken (Bytes)

postgres_wal_size_bytes

gauge

WAL-Verzeichnisgröße (Bytes)

postgres_log_size_bytes

gauge

Größe des Protokollverzeichnisses (Bytes)

postgres_tmp_size_bytes

gauge

Größe der temporären Datei (Bytes)

postgres_locking_transactions

gauge

Anzahl der gewährten Sperren

postgres_locked_transactions

gauge

Anzahl der wartenden/blockierten Sperren

server_version

gauge

Postgres-Version als Ganzzahl (zum Beispiel 180003 = 18.0.3)

Postgres-Prozessmetriken

Kennzahl

Typ

Einheit

Dimensionen

process.cpu.time

Summe (sum)

Sekunden

Status (Benutzer, System, Wartezeit) process.command, process.executable.name, process.owner, process.pid, process.parent_pid

process.memory.usage

Summe (sum)

bytes

process.command, process.executable.name, process.owner, process.pid, process.parent_pid

process.memory.virtual

Summe (sum)

bytes

process.command, process.executable.name, process.owner, process.pid, process.parent_pid

Bemerkung

Jeder Postgres-Prozess hat eine``process.cpu.time``-Zeile für jedenCPU-Status und jeweils eine für``process.memory.usage`` und``process.memory.virtual``.

Die process.*-Dimensionsattribute finden Sie in der Spalte``resource_attributes`` in jeder Zeile. Wie bei state-Werten für andere Metriken, befinden sich die state-Dimensionsattribute in der``record_attributes``-Spalte.

CPU-Metriken

Kennzahl

Typ

Einheit

Dimensionen

system.cpu.time

Summe (sum)

Sekunden

Status: user, system, wait, idle, nice, interrupt, softirq, steal CPU: CPU#

system.cpu.load_average.1m

gauge

Threads

-–

system.cpu.load_average.5m

gauge

Threads

-–

system.cpu.load_average.15m

gauge

Threads

-–

Bemerkung

Jede cpu# (wie cpu0 und cpu2) hat eine system.cpu.time-Zeile für jedenCPU-Status.

system.cpu.time ist ein kumulativer Zähler. Um einen Prozentsatz zu erhalten, berechnen Sie das Delta zwischen aufeinanderfolgenden Stichproben und dividieren durch das verstrichene Intervall.

Arbeitsspeicher-Metriken

Kennzahl

Typ

Einheit

Dimensionen

system.memory.usage

Summe (sum)

bytes

state: used, free, cached, buffered, slab_reclaimable, slab_unreclaimable

Bemerkung

Eine system.memory.usage-Zeile für jeden Status.

Festplattenmetriken

Kennzahl

Typ

Einheit

Dimensionen

system.filesystem.usage

Summe (sum)

bytes

Einbindungspunkt, Gerät, Status (verwendet, kostenlos), Typ, Modus

Bemerkung

Eine system.filesystem.usage-Zeile für jeden Status.

Netzwerkmetriken

Kennzahl

Typ

Einheit

Dimensionen

system.network.io

Summe (sum)

bytes

Gerät, Richtung (Senden, Empfangen)

Bemerkung

Jedes Gerät („eth0“ und „lo“) hat eine``system.network.io``-Zeile für jede Richtung.

Paging-Metriken

Kennzahl

Typ

Einheit

Dimensionen

system.paging.usage

Summe (sum)

bytes

Gerät, Status (verwendet, kostenlos)

Bemerkung

Eine system.paging.usage-Zeile für jeden Status.

Ressourcenattribute

Jede Metrikzeile enthält die folgenden Felder in RESOURCE_ATTRIBUTES:

Attribut

Beschreibung

Beispiel

instance_id

Bezeichner der Postgres-Instanz

4jypgsndvzd5ta6ufaryx6owja

host_name

Hostname des Servers

df6m4y5m5fgfpb5idy2pj67xrm

host.id

EC2-Instanz-ID

i-0f6724aef472706a3

host.type

Instanzfamilie

m8g.medium

cloud.region

AWS-Region

us-west-2

cloud.availability_zone

Verfügbarkeitszone

us-west-2b

application

Immer postgres

postgres

os.type

Immer linux

linux

Abfragen von Metriken

Für eine bestimmte Snowflake Postgres-Instanz können mehrere Server gleichzeitig ausgeführt werden, z. B. ein Primärserver und dessen HA-Server oder ein Ersatz-Upgrade, das darauf wartet, dass das Wartungsfenster der Instanz ausgetauscht wird. Da jeder dieser Server Metriken für die jeweilige instance_id der Instanz meldet, benötigen Sie zusätzlich den Server-host_name des aktuell aktiven Servers der Instanz.

Hier DESCRIBE POSTGRES INSTANCE finden Sie die instance_id Ihrer Postgres-Instanz:

DESCRIBE POSTGRES INSTANCE my_instance
  ->> SELECT "value"
      FROM $1
      WHERE "property" = 'host';

Die instance_id der Instanz ist das erste Segment des zurückgegebenen``host``-Werts (alles vor dem ersten Punkt).

Bemerkung

Sie können die host-Spalte der Ausgabe des SHOW POSTGRES INSTANCES-Befehls verwenden, um die Instance-Host-Werte für alle laufenden Snowflake-Postgres-Instanzen in Ihrem Account anzuzeigen.

Um den aktuell verwendeten Server-host_name der Instanz zu ermitteln, führen Sie eine einfache DNS CNAME-Abfrage des host-Werts der Instanz durch.

Nehmen wir an, der zurückgegebene host-Wert war „4jypgsndvzd5ta6ufaryx6owja.sfengineering-pgtest.preprod.us-west-2.aws.postgres.snowflake.app“ (also wissen wir, dass die instance_id der Instanz „4jypsndvzd5ta6ufaryx6owja“ lautet).

Hier ist ein Beispiel für die Verwendung des ``dig``CLI-Dienstprogramms, um die DNS CNAME-Suche auszuführen:

$ dig cname +short 4jypgsndvzd5ta6ufaryx6owja.sfengineering-pgtest.preprod.us-west-2.aws.postgres.snowflake.app
df6m4y5m5fgfpb5idy2pj67xrm.4jypgsndvzd5ta6ufaryx6owja.sfengineering-pgtest.preprod.us-west-2.aws.postgres.snowflake.app.

Hier sehen Sie ein Beispiel zur Verwendung des dns.resolver-Moduls von Python:

>>> import dns.resolver
>>> answer = dns.resolver.resolve('4jypgsndvzd5ta6ufaryx6owja.sfengineering-pgtest.preprod.us-west-2.aws.postgres.snowflake.app', 'CNAME')
>>> print(answer[0].target.to_text())
df6m4y5m5fgfpb5idy2pj67xrm.4jypgsndvzd5ta6ufaryx6owja.sfengineering-pgtest.preprod.us-west-2.aws.postgres.snowflake.app.

Der host_name-Wert ist das erste Segment des zurückgegebenen Werts: „df6m4y5m5fgfpb5idy2pj67xmer“ in den obigen Beispielen.

Die folgende Abfrage gibt den neuesten Wert für jede in den letzten 5 Minuten erfasste Metrik zurück:

SELECT TIMESTAMP as time,
  RECORD['metric']['name']::VARCHAR as metric,
  RESOURCE_ATTRIBUTES,
  RECORD_ATTRIBUTES,
  ROUND(VALUE::FLOAT, 2) AS value
FROM SNOWFLAKE.TELEMETRY.EVENTS
WHERE RESOURCE_ATTRIBUTES['application'] = 'postgres'
  AND record_type = 'METRIC'
  AND RESOURCE_ATTRIBUTES['instance_id']::VARCHAR = '<your_instance_id>'
  AND RESOURCE_ATTRIBUTES['host_name']::VARCHAR = '<instance_current_host_name>'
  AND TIMESTAMP > CURRENT_TIMESTAMP() - INTERVAL '5 MINUTES'
QUALIFY ROW_NUMBER() OVER (PARTITION BY record, record_attributes ORDER BY timestamp desc, record, record_attributes) = 1
ORDER BY timestamp desc, metric, record_attributes;

Bemerkung

Die obige Abfrage verwendet die Standard-Ereignistabelle des Kontos: SNOWFLAKE.TELEMETRY.EVENTS. Wenn Sie eine kundenspezifische Ereignistabelle eingerichtet haben, passen Sie die -Abfrage entsprechend an.

Beispiele für Metrikabfragen

Aktive Verbindungen

SELECT
    TIMESTAMP,
    VALUE::FLOAT AS connections
FROM SNOWFLAKE.TELEMETRY.EVENTS
WHERE RECORD_TYPE = 'METRIC'
  AND RECORD['metric']['name']::VARCHAR = 'postgres_connections'
  AND RESOURCE_ATTRIBUTES['instance_id']::VARCHAR = '<your_instance_id>'
  AND RESOURCE_ATTRIBUTES['host_name']::VARCHAR = '<instance_current_host_name>'
  AND TIMESTAMP > CURRENT_TIMESTAMP() - INTERVAL '1 hour'
ORDER BY TIMESTAMP DESC;

Arbeitsspeichernutzung nach Zustand

SELECT
    TIMESTAMP,
    RECORD_ATTRIBUTES['state']::VARCHAR AS state,
    ROUND(VALUE::FLOAT / (1024*1024*1024), 2) AS usage_gb
FROM SNOWFLAKE.TELEMETRY.EVENTS
WHERE RECORD_TYPE = 'METRIC'
  AND RECORD['metric']['name']::VARCHAR = 'system.memory.usage'
  AND RECORD_ATTRIBUTES['state']::VARCHAR IN ('used', 'cached', 'buffered', 'free')
  AND RESOURCE_ATTRIBUTES['instance_id']::VARCHAR = '<your_instance_id>'
  AND RESOURCE_ATTRIBUTES['host_name']::VARCHAR = '<instance_current_host_name>'
  AND TIMESTAMP > CURRENT_TIMESTAMP() - INTERVAL '1 hour'
ORDER BY TIMESTAMP DESC;

CPU-Lastdurchschnitte

SELECT
    TIMESTAMP,
    RECORD['metric']['name']::VARCHAR AS metric,
    VALUE::FLOAT AS load_avg
FROM SNOWFLAKE.TELEMETRY.EVENTS
WHERE RECORD_TYPE = 'METRIC'
  AND RECORD['metric']['name']::VARCHAR IN (
      'system.cpu.load_average.1m',
      'system.cpu.load_average.5m',
      'system.cpu.load_average.15m'
  )
  AND RESOURCE_ATTRIBUTES['instance_id']::VARCHAR = '<your_instance_id>'
  AND RESOURCE_ATTRIBUTES['host_name']::VARCHAR = '<instance_current_host_name>'
  AND TIMESTAMP > CURRENT_TIMESTAMP() - INTERVAL '1 hour'
ORDER BY TIMESTAMP;

Größe der Datenbank

SELECT
    TIMESTAMP,
    ROUND(VALUE::FLOAT / (1024*1024), 1) AS size_mb
FROM SNOWFLAKE.TELEMETRY.EVENTS
WHERE RECORD_TYPE = 'METRIC'
  AND RECORD['metric']['name']::VARCHAR = 'postgres_databases_size_bytes'
  AND RESOURCE_ATTRIBUTES['instance_id']::VARCHAR = '<your_instance_id>'
  AND RESOURCE_ATTRIBUTES['host_name']::VARCHAR = '<instance_current_host_name>'
  AND TIMESTAMP > DATEADD('hour', -1, CURRENT_TIMESTAMP())
ORDER BY TIMESTAMP DESC
LIMIT 1;

Weiterleiten von Metriken an externe Tools

Da die Metriken in einer Standard-Snowflake-Tabelle gespeichert werden, können Sie sie an jede Beobachtungsplattform weiterleiten, die eine Snowflake-Verbindung unterstützt. Eine schrittweise Einrichtung mit bestimmten Tools finden Sie unter: