Métriques Snowflake Postgres

Snowflake Postgres collecte automatiquement les métriques d’instance et les stocke dans la :doc:` table d’événements</developer-guide/logging-tracing/event-table-setting-up>` active de votre compte. Un agent de surveillance échantillonne les métriques environ toutes les 5 à 30 secondes en fonction du type de métriques et les écrit dans SNOWFLAKE.TELEMETRY.EVENTS avec RECORD_TYPE = 'METRIC'.

Vous pouvez interroger ces métriques directement dans Snowflake ou les transmettre à une plateforme d’observabilité externe telle que Grafana ou Observe.

Note

Pour plus d’informations sur l’interrogation des données de journaux Postgres à partir de la table des événements, voir Journalisation Snowflake Postgres.

Métriques disponibles

Métriques Postgres

Métrique

Type

Description

postgres_connections

gauge

Nombre de connexions de backend actives

postgres_databases_size_bytes

gauge

Taille totale de toutes les bases de données (octets)

postgres_wal_size_bytes

gauge

Taille du répertoire WAL (octets)

postgres_log_size_bytes

gauge

Taille du répertoire du journal (octets)

postgres_tmp_size_bytes

gauge

Taille du fichier temporaire (octets)

postgres_locking_transactions

gauge

Nombre de verrous attribués

postgres_locked_transactions

gauge

Nombre de verrous en attente/bloqués

server_version

gauge

Version Postgres sous forme entière (par exemple, 180003 = 18.0.3)

Métriques de processus Postgres

Métrique

Type

Unité

Dimensions

process.cpu.time

sum

secondes

état (utilisateur, système, attente) process.command, process.executable.name, process.name, process.pi, process.parent_pi

process.memory.usage

sum

bytes

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

process.memory.virtual

sum

bytes

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

Note

Chaque processus Postgres aura une ligne process.cpu.time pour chaque état de CPU et une pour chaque process.memory.usage et process.memory.virtual.

Les attributs de dimension process.* se trouvent dans la colonne resource_attributes de chaque ligne. Comme avec les valeurs state pour les autres métriques, es attributs de dimension state se trouvent dans la colonne record_attributes.

Métriques de CPU

Métrique

Type

Unité

Dimensions

system.cpu.time

sum

secondes

état : 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

-–

Note

Chaque cpu# (comme cpu0 et cpu2) aura une ligne system.cpu.time pour chaque état de CPU.

system.cpu.time est un compteur cumulatif. Pour obtenir un pourcentage, calculez le delta entre les échantillons consécutifs et divisez par l’intervalle écoulé.

Métriques de mémoire

Métrique

Type

Unité

Dimensions

system.memory.usage

sum

bytes

état : used, free, cached, buffered, slab_reclaimable, slab_unreclaimable

Note

Une ligne system.memory.usage pour chaque état.

Métriques de disque

Métrique

Type

Unité

Dimensions

system.filesystem.usage

sum

bytes

point de montage, appareil, état (utilisé, libre), type, mode

Note

Une ligne system.filesystem.usage pour chaque état.

Métriques de réseau

Métrique

Type

Unité

Dimensions

system.network.io

sum

bytes

appareil, direction (transmettre, recevoir)

Note

Chaque appareil (“meth0” et “lo”) aura une ligne system.network.io pour chaque direction.

Métriques de page

Métrique

Type

Unité

Dimensions

system.paging.usage

sum

bytes

appareil, état (utilisé, gratuit)

Note

Une ligne system.paging.usage pour chaque état.

Attributs de ressources

Chaque ligne de métrique comprend les champs suivants dans RESOURCE_ATTRIBUTES :

Attribut

Description

Exemple

instance_id

Identificateur d’instance Postgres

4jypgsndvzd5ta6ufaryx6owja

host_name

Nom d’hôte du serveur

df6m4y5m5fgfpb5idy2pj67xrm

host.id

ID d’instance EC2

i-0f6724aef472706a3

host.type

Famille d’instances

m8g.medium

cloud.region

Région AWS

us-west-2

cloud.availability_zone

Zones de disponibilité

us-west-2b

application

Toujours postgres

postgres

os.type

Toujours linux

linux

Interrogation des métriques

Une instance donnée de Snowflake Postgres peut avoir plusieurs serveurs en cours d’exécution à un moment donné, tels qu’un serveur primaire et son serveur HA ou un remplacement de mise à niveau en attente de remplacement de la fenêtre de maintenance de l’instance. Étant donné que chacun de ces serveurs indiquera des métriques pour l’instance_id donné de l’instance vous avez aussi besoin du host_name serveur actuellement actif de l’instance.

Pour trouver l’instance_id de votre instance Postgres, utilisez:doc:/sql-reference/sql/desc-postgres-instance :

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

L’instance_id de l’instance est le premier segment de la valeur host renvoyée (tout avant la première période).

Note

Vous pouvez utiliser la colonne host de la sortie de la commande SHOW POSTGRES INSTANCES pour voir les valeurs d’hôte d’instance pour toutes les instances de Snowflake Postgres en cours d’exécution sur votre compte.

Pour trouver le host_name du serveur actuel de l’instance, utilisez une simple recherche DNS CNAME de la valeur host de l’instance.

Supposons que la valeur host renvoyée était “4jypgsndvzd5ta6udaryx6owja.sf engineering-pggtest.preprod.us-west-2.aws.postgres.snowflake.app” (nous savons donc que l’instance_id de l’instance est “4jypgsndvzd5ta6udaryx6owja”).

Voici un exemple utilisant l’utilitaire dig de la CLI pour effectuer la recherche DNS CNAME :

$ 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.

Et voici un exemple utilisant le module dns.resolver de 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.

La valeur host_name est le premier segment de cette valeur renvoyée, “df6m4y5m5fgfpb5idy2pj67xrm” dans les exemples ci-dessus.

La requête suivante renvoie la valeur la plus récente pour chaque métrique collectée au cours des 5 dernières minutes :

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;

Note

La requête ci-dessus utilise la table des événements par défaut du compte, SNOWFLAKE.TELEMETRY.EVENTS. Si vous avez configuré une table d’événements personnalisée, ajustez la requête en conséquence.

Exemples de requêtes de métriques

Connexions actives

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;

Utilisation de la mémoire par état

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;

Charges moyennes du CPU

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;

Taille de la base de données

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;

Transfert de métriques vers des outils externes

Les métriques étant stockées dans une table Snowflake standard, vous pouvez les transmettre à n’importe quelle plateforme d’observabilité qui prend en charge une connexion Snowflake. Pour une configuration étape par étape avec des outils spécifiques, voir :