Emissão de dados de métricas do código do manipulador¶
Para fazer seu procedimento ou sua UDF emitir dados de métricas, não é necessário adicionar nenhum código ao seu manipulador. O Snowflake gera os dados coletados em uma tabela de evento.
Como as métricas são medidas¶
Devido à diferença entre os ambientes de execução Java e Python, os dados de métricas coletados também são diferentes. Para obter informações de referência sobre os dados coletados, consulte a referência da coluna RECORD.
A seguir, descrevemos como os dados capturados correspondem ao ambiente de execução.
- Java:
Métricas de CPU e memória da Java Virtual Machine (JVM) são relatadas para cada ID de consulta.
Cada procedimento armazenado recebe sua própria JVM. A seguir são descritos os dados métricos coletados:
process.memory.usage
: Quantidade de memória, em bytes, consumida pela execução JVM do manipulador do procedimento armazenado.process.cpu.utilization
: Tempo total de CPU dividido pelo tempo em hora local por CPU lógica, medido como uma porcentagem onde 1,0 indica 100 por cento de utilização. Tempo total de CPU é o tempo total gasto em tarefas não ociosas.
Cada UDF Java e Scala chamada em uma consulta compartilha uma única JVM. Os valores métricos são agregados em cada função Java ou Scala na consulta. A seguir são descritos os dados métricos coletados:
process.memory.usage
: Como usar memória, mostrado como a soma de todas as funções Java associadas chamadas na consulta.process.cpu.utilization
: uso de CPU, mostrado como a média de todas as funções Java e Scala chamadas na consulta.
- Python:
Métricas de CPU e memória são relatadas para cada função ou procedimento Python.
Cada procedimento armazenado é executado em apenas um processo Python. A seguir são descritos os dados métricos coletados:
process.memory.usage
: Quantidade de memória, em bytes, consumida pelo processo Python que executa o manipulador do procedimento armazenado.process.cpu.utilization
: Tempo total de CPU dividido pelo tempo em hora local e por CPU lógica, medido como uma porcentagem onde 1,0 indica 100 por cento de uso. Tempo total de CPU é o tempo total gasto em tarefas não ociosas.
Cada UDF pode ser executada em vários processos de execução Python. Os valores são agregados em vários processos. A seguir são descritos os dados métricos coletados:
process.memory.usage
: Como usar memória, mostrado como a soma de todos os processos Python associados a essa UDF.process.cpu.utilization
: CPU relatada, mostrada como a média de todos os processos Python associados a essa UDF.
Exemplo em Python¶
Use as etapas a seguir para gerar dados de exemplo de métricas.
Defina o nível de métricas de sua sessão. O parâmetro
METRIC_LEVEL
controla se os pontos de dados de métricas de recursos autoinstrumentados devem ser emitidos para a tabela de evento. É possível definir o parâmetro comoNONE
ouALL
e defini-lo no nível do objeto e da sessão. Para obter mais informações, consulte Definição de níveis para registro, métricas e rastreamento.ALTER SESSION SET METRIC_LEVEL = ALL;
Crie um procedimento armazenado.
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} """ $$;
Execução do procedimento armazenado
CALL DEMO_SP(100);
Quando a consulta for concluída, a exibição dos dados de métricas, conforme descrito em Visualização dos dados de métricas.