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.

  1. 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 como NONE ou ALL 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;
    
    Copy
  2. 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}
      """
    $$;
    
    Copy
  3. Execução do procedimento armazenado

    CALL DEMO_SP(100);
    
    Copy
  4. Quando a consulta for concluída, a exibição dos dados de métricas, conforme descrito em Visualização dos dados de métricas.