Ausgabe von Metrikdaten aus dem Handler-Code¶
Damit Ihre Prozedur oder UDF Metrikdaten ausgibt, müssen Sie keinen Code zu Ihrem Handler hinzufügen. Snowflake generiert die gesammelten Daten in einer Ereignistabelle.
Wie Metriken gemessen werden¶
Aufgrund der unterschiedlichen Umgebungen für die Ausführung von Java und Python unterscheiden sich auch die gesammelten Metrikdaten. Referenzinformationen zu den erfassten Daten finden Sie unter RECORD Spaltenreferenz.
Im Folgenden wird beschrieben, wie die erfassten Daten mit der Umgebung der Ausführung übereinstimmen.
- Java:
JVM (Java Virtual Machine) CPU und Speichermetriken werden für jede Abfrage-ID gemeldet.
Jeder gespeicherten Prozedur wird eine eigene JVM zugewiesen. Im Folgenden werden die gesammelten metrischen Daten beschrieben:
process.memory.usage
: Die Menge des Speichers in Bytes, die von JVM bei der Ausführung des Handlers für die gespeicherte Prozedur verbraucht wird.process.cpu.utilization
: CPU-Gesamtzeit geteilt durch die Wall-Clock-Zeit pro logischem CPU, gemessen als Prozentsatz, wobei 1,0 100 Prozent Auslastung bedeutet. Die CPU-Gesamtzeit ist die Gesamtzeit, die für nicht ruhende Aufgaben aufgewendet wird.
Jedes Java und Scala-UDF, das in einer Abfrage aufgerufen wird, teilt sich eine einzige JVM. Die Metrikwerte werden über jede Java- oder Scala-Funktion in der Abfrage aggregiert. Im Folgenden werden die gesammelten metrischen Daten beschrieben:
process.memory.usage
: Speicherverbrauch, dargestellt als Summe aller zugehörigen Java-Funktionen, die in der Abfrage aufgerufen werden.process.cpu.utilization
CPU-Verwendung, dargestellt als Durchschnitt aller in der Abfrage aufgerufenen Java- und Scala-Funktionen.
- Python:
CPU und Speicher-Metriken werden für jede Python-Funktion oder -Prozedur berichtet.
Jede gespeicherte Prozedur wird nur von einem Python-Prozess ausgeführt. Im Folgenden werden die gesammelten metrischen Daten beschrieben:
process.memory.usage
: Menge des Speichers in Bytes, die von dem Python-Prozess verbraucht wird, der die Ausführung des Handlers für gespeicherte Prozeduren vornimmt.process.cpu.utilization
: CPU-Gesamtzeit geteilt durch die Wall-Clock-Zeit pro logischem CPU, gemessen als Prozentsatz, wobei 1,0 100 Prozent Nutzung bedeutet. Die CPU-Gesamtzeit ist die Gesamtzeit, die für nicht ruhende Aufgaben aufgewendet wird.
Jedes UDF kann auf mehreren Python-Ausführungsprozessen ausgeführt werden. Die Werte werden über mehrere Prozesse hinweg aggregiert. Im Folgenden werden die gesammelten metrischen Daten beschrieben:
process.memory.usage
: Speicherverbrauch, dargestellt als Summe aller mit diesem UDF verbundenen Python-Prozesse.process.cpu.utilization
: Gemeldete CPU, dargestellt als Durchschnitt aller zugehörigen Python-Prozesse dieser UDF.
Python-Beispiel¶
Führen Sie die folgenden Schritte aus, um Metrik-Beispieldaten zu erzeugen.
Legen Sie den Metrikgrad für Ihre Sitzung fest. Der
METRIC_LEVEL
-Parameter steuert, ob automatisch instrumentierte Ressourcenmetrik-Datenpunkte an die Ereignistabelle gesendet werden sollen. Sie können den Parameter aufNONE
oderALL
einstellen und ihn auf Objekt- und Sitzungsebene festlegen. Weitere Informationen dazu finden Sie unter Einstellung der Grade für Protokollierung, Metriken und Ablaufverfolgung.ALTER SESSION SET METRIC_LEVEL = ALL;
Erstellen Sie eine gespeicherte Prozedur.
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} """ $$;
Führen Sie die gespeicherte Prozedur aus
CALL DEMO_SP(100);
Wenn die Abfrage abgeschlossen ist, sehen Sie sich die Metrikdaten wie unter Anzeigen von Metrikdaten beschrieben an.