Snowpark Container Services : services de surveillance¶
Accès aux journaux des conteneurs¶
Snowflake collecte tout ce que vos conteneurs d’application envoient à la sortie standard ou aux erreurs standard. Vous devez vous assurer que votre code produit des informations utiles pour déboguer un service.
Snowflake propose deux façons d’accéder à ces journaux de conteneurs de service (y compris service de tâche) :
Utilisation de la fonction système SYSTEM$GET_SERVICE_LOGS : permet d’accéder aux journaux d’un conteneur spécifique. Après la sortie d’un conteneur, vous pouvez continuer à accéder aux journaux à l’aide de la fonction système pendant une courte période. Les fonctions du système sont surtout utiles pendant le développement et les tests, lorsque vous créez un service ou une tâche. Pour plus d’informations, voir SYSTEM$GET_SERVICE_LOGS.
Utilisation d’une table d’événements : la table d’événements du compte vous donne accès aux journaux de plusieurs conteneurs pour les services qui activent la collecte de journaux dans leur spécification. Snowflake conserve les journaux dans la table d’événements pour un accès ultérieur. Les tables d’événements sont utilisées de préférence pour l’analyse rétrospective des services et des tâches. Pour plus d’informations, voir Utilisation d’une table d’événements.
Utilisation de SYSTEM$GET_SERVICE_LOGS¶
Vous fournissez le nom du service, l’ID d’instance, le nom du conteneur et, éventuellement, le nombre de lignes de journal les plus récentes à récupérer. Si une seule instance de service est en cours d’exécution, l’ID d’instance de service est 0. Par exemple, la commande d’instruction suivante récupère les 10 dernières lignes du journal d’un conteneur nommé echo
qui appartient à l’instance 0 d’un service nommé echo_service
:
SELECT SYSTEM$GET_SERVICE_LOGS('echo_service', '0', 'echo', 10);
Exemple de sortie :
+--------------------------------------------------------------------------+
| SYSTEM$GET_SERVICE_LOGS |
|--------------------------------------------------------------------------|
| 10.16.6.163 - - [11/Apr/2023 21:44:03] "GET /healthcheck HTTP/1.1" 200 - |
| 10.16.6.163 - - [11/Apr/2023 21:44:08] "GET /healthcheck HTTP/1.1" 200 - |
| 10.16.6.163 - - [11/Apr/2023 21:44:13] "GET /healthcheck HTTP/1.1" 200 - |
| 10.16.6.163 - - [11/Apr/2023 21:44:18] "GET /healthcheck HTTP/1.1" 200 - |
+--------------------------------------------------------------------------+
1 Row(s) produced. Time Elapsed: 0.878s
Si vous ne disposez pas des informations sur le service dont vous avez besoin pour appeler la fonction (comme l’ID d’instance ou le nom du conteneur), vous pouvez d’abord exécuter la commande SHOW SERVICE CONTAINERS IN SERVICE pour obtenir des informations sur les instances de service et les conteneurs exécutés dans chaque instance.
La fonction SYSTEM$GET_SERVICE_LOGS présente les limitations suivantes :
Elle fusionne les flux de sortie standard et d’erreur standard. La fonction ne fournit aucune indication sur le flux d’où provient la sortie.
Elle rapporte les données capturées pour un conteneur spécifique dans une instance de service unique.
Elle ne signale que les journaux d’un conteneur en cours d’exécution. La fonction ne peut pas récupérer les journaux d’un conteneur précédent qui a été redémarré ou d’un conteneur d’un service qui est arrêté ou supprimé.
La fonction renvoie jusqu’à 100 KB de données.
Utilisation d’une table d’événements¶
Snowflake peut capturer les journaux envoyés depuis les conteneurs vers les flux de sortie standard et d’erreur standard dans la table d’événements configurée pour votre compte. Pour plus d’informations sur la configuration d’une table d’événements, voir Journalisation, traçage et métriques.
Vous contrôlez quels flux sont collectés (tous, erreurs uniquement ou aucun) que vous souhaitez conserver dans une table d’événements en utilisant le champ spec.logExporters dans le fichier de spécification du service.
Vous pouvez ensuite interroger la table des événements pour connaître les événements. Par exemple, l’instruction SELECT suivante récupère les événements de services et de tâches Snowflake enregistrés au cours de l’heure écoulée :
SELECT TIMESTAMP, RESOURCE_ATTRIBUTES, RECORD_ATTRIBUTES, VALUE
FROM <current-event-table-for-your-account>
WHERE timestamp > dateadd(hour, -1, current_timestamp())
AND RESOURCE_ATTRIBUTES:"snow.service.name" = <service-name>
AND RECORD_TYPE = 'LOG'
ORDER BY timestamp DESC
LIMIT 10;
Snowflake recommande d’inclure un horodatage dans la clause WHERE des requêtes de tables d’événements, comme le montre cet exemple. Ceci est particulièrement important en raison du volume potentiel de données générées par les différents composants de Snowflake. En appliquant des filtres, vous pouvez extraire un sous-ensemble de données plus restreint, ce qui améliore les performances de la requête.
La table d’événements comprend les colonnes suivantes, qui fournissent des informations utiles sur les journaux collectés par Snowflake depuis votre conteneur :
TIMESTAMP : indique quand Snowflake a collecté le journal.
RESOURCE_ATTRIBUTES : fournit un objet JSON qui identifie le service Snowflake et le conteneur dans le service qui a généré le message de journal. Par exemple, il fournit des détails tels que le nom du service, le nom du conteneur et le nom du pool de calcul qui ont été spécifiés lors de l’exécution du service.
{ "snow.account.name": "SPCSDOCS1", "snow.compute_pool.id": 20, "snow.compute_pool.name": "TUTORIAL_COMPUTE_POOL", "snow.compute_pool.node.id": "a17e8157", "snow.compute_pool.node.instance_family": "CPU_X64_XS", "snow.database.id": 26, "snow.database.name": "TUTORIAL_DB", "snow.schema.id": 212, "snow.schema.name": "DATA_SCHEMA", "snow.service.container.instance": "0", "snow.service.container.name": "echo", "snow.service.container.run.id": "b30566", "snow.service.id": 114, "snow.service.name": "ECHO_SERVICE2", "snow.service.type": "Service" }
RECORD_ATTRIBUTES : pour un service Snowflake, il identifie une source d’erreur (sortie standard ou erreur standard).
{ "log.iostream": "stdout" }
VALUE : la sortie standard et l’erreur standard sont divisées en lignes, et chaque ligne génère un enregistrement dans la table d’événements.
"echo-service [2023-10-23 17:52:27,429] [DEBUG] Sending response: {'data': [[0, 'Joe said hello!']]}"
Accès aux métriques¶
Snowflake fournit des métriques pour les pools de calcul de votre compte et des services exécutés sur ces pools de calcul. Ces métriques, fournies par Snowflake, sont également appelées métriques de plateforme.
Métriques du service de table d’événements : les services individuels publient des métriques. Il s’agit d’un sous-ensemble des métriques du pool de calcul qui fournissent des informations spécifiques au service. Le cas d’utilisation cible pour cela est d’observer l’utilisation des ressources d’un service spécifique. Dans la spécification du service, vous définissez les métriques que vous souhaitez que Snowflake enregistre dans la table des événements pendant que le service est en cours d’exécution.
Métriques du pool de calcul : chaque pool de calcul publie également des métriques qui fournissent des informations sur ce qui se passe à l’intérieur de ce pool de calcul. Le cas d’utilisation cible pour cela est d’observer l’utilisation du pool de calcul. Pour accéder aux métriques de votre pool de calcul, vous devrez écrire un service qui utilise une API compatible avec Prometheus pour interroger les métriques publiées par le pool de calcul.
Accès aux métriques du service de table d’événements¶
Pour enregistrer les métriques d’un service dans la table d’événements configurée pour votre compte, incluez la section suivante dans votre spécification de service :
platformMonitor:
metricConfig:
groups:
- <group 1>
- <group 2>
- ...
Où chaque group N
fait référence à un groupe de métriques prédéfinies qui vous intéresse (par exemple, system
, network
, ou storage
). Pour plus d’informations, consultez la section spec.platformMonitor field dans la documentation sur la spécification du service.
Pendant que le service est en cours d’exécution, Snowflake enregistre ces métriques dans la table des événements de votre compte. Vous pouvez interroger votre table d’événements pour lire les métriques. La requête suivante récupère les métriques de service qui ont été enregistrées au cours de la dernière heure pour le service my_service
:
SELECT timestamp, value
FROM my_event_table_db.my_event_table_schema.my_event_table
WHERE timestamp > DATEADD(hour, -1, CURRENT_TIMESTAMP())
AND RESOURCE_ATTRIBUTES:"snow.service.name" = 'MY_SERVICE'
AND RECORD_TYPE = 'METRIC'
ORDER BY timestamp DESC
LIMIT 10;
Si vous ne connaissez pas le nom de la table d’événements active pour le compte, exécutez la commande SHOW PARAMETERS pour afficher la valeur du paramètre EVENT_TABLE au niveau du compte :
SHOW PARAMETERS LIKE 'event_table' IN ACCOUNT;
Pour plus d’informations sur les tables d’événements, voir Utilisation d’une table d’événements.
Exemple
Suivez ces étapes pour créer un exemple de service qui enregistre les métriques dans la table d’événements configurée pour votre compte.
Suivez le Tutoriel 1 pour créer un service nommé
echo_service
, avec un changement. À l’étape 3, quand vous créez un service, utilisez la commande CREATE SERVICE suivante qui ajoute le champplatformMonitor
dans la spécification de service modifiée.CREATE SERVICE echo_service IN COMPUTE POOL tutorial_compute_pool FROM SPECIFICATION $$ spec: containers: - name: echo image: /tutorial_db/data_schema/tutorial_repository/my_echo_service_image:latest env: SERVER_PORT: 8000 CHARACTER_NAME: Bob readinessProbe: port: 8000 path: /healthcheck endpoints: - name: echoendpoint port: 8000 public: true platformMonitor: metricConfig: groups: - system - system_limits $$ MIN_INSTANCES=1 MAX_INSTANCES=1;
Une fois le service exécuté, Snowflake commence à enregistrer les métriques des groupes de métriques spécifiés dans la table des événements, que vous pouvez ensuite interroger. La requête suivante récupère les métriques signalées au cours de la dernière heure par le service Echo.
SELECT timestamp, value ROM my_events WHERE timestamp > DATEADD(hour, -1, CURRENT_TIMESTAMP()) AND RESOURCE_ATTRIBUTES:"snow.service.name" = 'ECHO_SERVICE' AND RECORD_TYPE = 'METRIC' ORDER BY timestamp, group DESC LIMIT 10;
Accès aux métriques du pool de calcul¶
Les métriques du pool de calcul offrent des informations sur les nœuds du pool de calcul et les services qui y sont exécutés. Chaque nœud signale des métriques spécifiques au nœud, telles que la quantité de mémoire disponible pour les conteneurs, ainsi que des métriques de service, telles que l’utilisation de la mémoire par des conteneurs individuels. Les métriques du pool de calcul fournissent des informations du point de vue d’un nœud.
Chaque nœud dispose d’un éditeur de métriques qui écoute le port TCP 9001. D’autres services peuvent faire une requête HTTP GET avec le chemin /metrics
vers le port 9001 sur le nœud. Pour découvrir l’adresse IP du nœud, récupérez les enregistrements SRV (ou enregistrements A) des DNS pour le nom d’hôte discover.monitor.compute_pool_name.snowflakecomputing.internal
. Ensuite, créez un autre service dans votre compte qui interroge activement chaque nœud pour récupérer les métriques.
Le corps de la réponse fournit les métriques en utilisant le format Prometheus comme le montre l’exemple de métriques suivant :
# HELP node_memory_capacity Defines SPCS compute pool resource capacity on the node
# TYPE node_memory_capacity gauge
node_memory_capacity{snow_compute_pool_name="MY_POOL",snow_compute_pool_node_instance_family="CPU_X64_S",snow_compute_pool_node_id="10.244.3.8"} 1
node_cpu_capacity{snow_compute_pool_name="MY_POOL",snow_compute_pool_node_instance_family="CPU_X64_S",snow_compute_pool_node_id="10.244.3.8"} 7.21397383168e+09
Remarques :
Chaque métrique commence par
# HELP
et# TYPE
, pour fournir une brève description et le type de la métrique. Dans cet exemple, la métriquenode_memory_capacity
est de typegauge
.Elle est ensuite suivie du nom de la métrique, d’une liste de libellés décrivant une ressource spécifique (point de données) et de sa valeur. Dans cet exemple, la métrique (nommée
node_memory_capacity
) fournit des informations sur la mémoire, indiquant que le nœud dispose de 7,2 GB de mémoire disponible. La métrique comprend également des métadonnées sous forme d’étiquettes, comme indiqué :snow_compute_pool_name="MY_POOL", snow_compute_pool_node_instance_family="CPU_X64_S",snow_compute_pool_node_id="10.244.3.8"
Vous pouvez traiter ces métriques comme vous le souhaitez ; par exemple, vous pouvez stocker les métriques dans une base de données et utiliser une UI (comme un tableau de bord Grafrana) pour afficher les informations.
Note
Snowflake ne fournit aucune agrégation de métriques. Par exemple, pour obtenir des métriques pour un service donné, vous devez interroger tous les nœuds qui exécutent des instances de ce service.
Pour que vous puissiez accéder aux métriques, le pool de calcul doit avoir un nom compatible avec DNS.
Le point de terminaison exposé par un pool de calcul n’est accessible qu’à un rôle disposant du privilège OWNERSHIP ou MONITOR sur le pool de calcul.
Pour obtenir la liste des métriques de pool de calcul disponibles, consultez Métriques de plateforme disponibles.
Exemple
Pour un exemple de configuration de Prometheus pour interroger votre pool de calcul pour les métriques, consultez les tutoriels sur les métriques du pool de calcul.
Métriques de plateforme disponibles¶
Vous trouverez ci-dessous une liste des groupes de métriques de plateforme disponibles et des métriques au sein de chaque groupe. Notez que les métriques de stockage
nne sont actuellement collectées qu’à partir de volumes de stockage en blocs.
Groupe de métriques . Nom de la métrique |
Unité |
Type |
Description |
---|---|---|---|
system . container.cpu.usage |
cpu cores |
gauges |
Nombre moyen de cœurs de CPU utilisés depuis la dernière mesure. 1,0 indique une utilisation complète de 1 cœur de CPU. La valeur maximale est le nombre de cœurs de CPU disponibles pour le conteneur. |
system . container.memory.usage |
bytes |
gauge |
Mémoire utilisée, en octets. |
system . container.gpu.memory.usage |
bytes |
gauge |
Mémoire par GPU utilisée, en octets. Le GPU source est indiqué dans l’attribut “gpu”. |
system . container.gpu.utilization |
ratio |
gauge |
Ratio d’utilisation par GPU à capacité. Le GPU source est indiqué dans l’attribut “gpu”. |
system_limits . container.cpu.limit |
cpu cores |
gauge |
Limite de ressources de CPU de la spécification de service. Si aucune limite n’est définie, la valeur par défaut est la capacité du nœud. |
system_limits . container.gpu.limit |
gpus |
gauge |
Limite du nombre de GPU à partir de la spécification de service. Si aucune limite n’est définie, la métrique n’est pas émise. |
system_limits . container.memory.limit |
bytes |
gauge |
Limite de mémoire selon la spécification du service. Si aucune limite n’est définie, la valeur par défaut est la capacité du nœud. |
system_limits . container.cpu.requested |
cpu cores |
gauge |
Demande de ressource de CPU à partir de la spécification de service. Si aucune limite n’est définie, la valeur par défaut est une valeur choisie par Snowflake. |
system_limits . container.gpu.requested |
gpus |
gauge |
Nombre de GPU à partir de la spécification du service. Si aucune limite n’est définie, la métrique n’est pas émise. |
system_limits . container.memory.requested |
bytes |
gauge |
Demande de mémoire à partir de la spécification du service. Si aucune limite n’est définie, la valeur par défaut est une valeur choisie par Snowflake. |
system_limits . container.gpu.memory.capacity |
bytes |
gauge |
Capacité de mémoire par GPU. Le GPU source est indiqué dans l’attribut “gpu”. |
status . container.restarts |
restarts |
gauge |
Nombre de fois où Snowflake a redémarré le conteneur. |
status . container.state.finished |
booléen |
gauge |
Lorsque le conteneur est dans l’état « finished », cette métrique sera émise avec la valeur 1. |
status . container.state.last.finished.reason |
booléen |
gauge |
Si le conteneur a redémarré précédemment, cette métrique sera émise avec la valeur 1. L’étiquette « reason » décrit la raison pour laquelle le conteneur a été terminé la dernière fois. |
status . ontainer.state.last.finished.exitcode |
entier |
gauge |
Si un conteneur a déjà redémarré, cette métrique contiendra le code de sortie de l’exécution précédente. |
status . container.state.pending |
booléen |
gauge |
Lorsqu’un conteneur est dans l’état « en attente », cette métrique sera émise avec la valeur 1. |
status . container.state.pending.reason |
booléen |
gauge |
Lorsqu’un conteneur est dans l’état « en attente », cette métrique sera émise avec la valeur 1. L’étiquette « reason » décrit pourquoi le conteneur était récemment dans l’état en attente. |
status . container.state.running |
booléen |
gauge |
Lorsqu’un conteneur est dans l’état « running », cette métrique aura la valeur 1. |
status . container.state.started |
booléen |
gauge |
Lorsqu’un conteneur est dans l’état « started », cette métrique aura la valeur 1. |
network . network.egress.denied.packets |
packets |
gauge |
Nombre total de paquets refusés en sortie réseau en raison d’échecs de validation de politique. |
network . network.egress.received.bytes |
bytes |
gauge |
Total des octets de sortie du réseau reçus depuis des destinations distantes. |
network . network.egress.received.packets |
packets |
gauge |
Total des paquets de sortie du réseau reçus depuis des destinations distantes. |
network . network.egress.transmitted.bytes |
byte |
gauge |
Total des octets de sortie du réseau transmis vers des destinations distantes. |
network . network.egress.transmitted.packets |
packets |
gauge |
Total des paquets de sortie du réseau transmis vers des destinations distantes. |
storage . volume.capacity |
bytes |
gauge |
Taille du système de fichiers. |
storage . volume.io.inflight |
operations |
gauge |
Nombre d’opérations d’E/S actives du système de fichiers. |
storage . volume.read.throughput |
bytes/sec |
gauge |
Débit de lecture du système de fichiers en octets par seconde. |
storage . volume.read.iops |
operations/sec |
gauge |
Opérations de lecture du système de fichiers par seconde. |
storage . volume.usage |
bytes |
gauge |
Nombre total d’octets utilisés dans le système de fichiers. |
storage . volume.write.throughput |
bytes/sec |
gauge |
Débit d’écriture du système de fichiers en octets par seconde. |
storage . volume.write.iops |
operations/sec |
gauge |
Opérations d’écriture du système de fichiers par seconde. |