Émission de données de métriques à partir du code du gestionnaire¶
Pour que votre procédure ou UDF émette des données de métriques, vous n’avez pas besoin d’ajouter de code à votre gestionnaire. Snowflake génère les données collectées dans une table d’événements.
Comment les métriques sont mesurées¶
En raison de la différence entre les environnements d’exécution Java et Python, les données de métriques collectées diffèrent également. Pour obtenir des informations de référence sur les données collectées, voir la référence de colonne RECORD.
Ce qui suit décrit comment les données capturées correspondent à l’environnement d’exécution.
- Java:
Les métriques de CPU JVM (Machine virtuelle Java) et de mémoire sont signalées pour chaque ID de requête.
Chaque procédure stockée se voit attribuer son propre JVM. Ce qui suit décrit les données de métriques collectées :
process.memory.usage
: quantité de mémoire, en octets, consommée par l’exécution JVM du gestionnaire de procédure stockée.process.cpu.utilization
: temps de CPU total divisé par le temps de l’horloge murale par CPU logique, mesuré en pourcentage où 1,0 indique une utilisation à 100 pour cent. Le temps total de CPU est le temps total passé sur des tâches non inactives.
Chaque UDF Java et Scala appelée dans une requête partage un seul JVM. Les valeurs de métriques sont agrégées sur chaque fonction Java ou Scala de la requête. Ce qui suit décrit les données de métriques collectées :
process.memory.usage
: utilisation de la mémoire, affichée comme la somme de toutes les fonctions Java associées appelées dans la requête.process.cpu.utilization
: utilisation du CPU, affichée comme la moyenne de toutes les fonctions Java et Scala appelées dans la requête.
- Python:
Les métriques de CPU et de mémoire sont signalées pour chaque fonction ou procédure Python.
Chaque procédure stockée s’exécute sur un seul processus Python. Ce qui suit décrit les données de métriques collectées :
process.memory.usage
: quantité de mémoire, en octets, consommée par le processus Python exécutant le gestionnaire de procédure stockée.process.cpu.utilization
: temps de CPU total divisé par le temps de l’horloge murale par CPU logique, mesuré en pourcentage où 1,0 indique une utilisation à 100 pour cent. Le temps total de CPU est le temps total passé sur des tâches non inactives.
Chaque UDF peut être exécutée sur plusieurs processus d’exécution Python. Les valeurs sont agrégées sur plusieurs processus. Ce qui suit décrit les données de métriques collectées :
process.memory.usage
: utilisation de la mémoire, affichée comme la somme de tous les processus Python associés à cette UDF.process.cpu.utilization
: CPU signalé, représenté par la moyenne de tous les processus Python associés à cette UDF.
Exemple Python¶
Utilisez les étapes suivantes pour générer des exemples de données de métriques.
Définissez le niveau des métriques de votre session. Le paramètre
METRIC_LEVEL
contrôle s’il faut émettre des points de données de métriques de ressources auto-instrumentées vers la table d’événements. Vous pouvez définir le paramètre surNONE
ouALL
, et le définir au niveau de l’objet et de la session. Pour plus d’informations, voir Définition des niveaux de journalisation, des métriques et du traçage.ALTER SESSION SET METRIC_LEVEL = ALL;
Créez une procédure stockée.
CREATE OR REPLACE PROCEDURE DEMO_SP(n_queries number) RETURNS VARCHAR(16777216) LANGUAGE PYTHON RUNTIME_VERSION = '3.10' PACKAGES = ('snowflake-snowpark-python', 'snowflake-telemetry-python==0.2.0') HANDLER = 'my_handler' AS $$ import time def my_handler(session, n_queries): import snowflake.snowpark from snowflake.snowpark.functions import col, udf from snowflake import telemetry session.sql('create or replace stage udf_stage;').collect() @udf(name='example_udf', is_permanent=True, stage_location='@udf_stage', replace=True) def example_udf(x: int) -> int: # This UDF will consume 1GB of memory to illustrate the memory consumption metric one_gb_list = [0] * (1024**3 // 8) return x pandas_grouped_df = session.table('snowflake.account_usage.query_history').select( col('total_elapsed_time'), col('rows_written_to_result'), col('database_name'), example_udf(col('bytes_scanned')) ).limit(n_queries)\ .to_pandas()\ .groupby('DATABASE_NAME') mean_time = pandas_grouped_df['TOTAL_ELAPSED_TIME'].mean() mean_rows_written = pandas_grouped_df['ROWS_WRITTEN_TO_RESULT'].mean() return f""" {mean_time} {mean_rows_written} """ $$;
Exécuter la procédure stockée
CALL DEMO_SP(100);
Une fois la requête terminée, affichez les données de métriques comme décrit dans Affichage des données métriques.