처리기 코드에서 메트릭 데이터 내보내기

프로시저나 UDF가 메트릭 데이터를 내보내도록 하려면 처리기에 코드를 추가할 필요가 없습니다. Snowflake는 이벤트 테이블에 수집된 데이터를 생성합니다.

메트릭이 측정되는 방법

Java와 Python 실행 환경의 차이로 인해 수집되는 메트릭 데이터도 다릅니다. 수집되는 데이터에 대한 참조 정보는 RECORD 열 참조 섹션을 참조하십시오.

다음은 캡처된 데이터가 실행 환경에 어떻게 대응하는지에 대해 설명합니다.

Java:

JVM(Java 가상 머신) CPU 및 각 쿼리 ID에 대한 메모리 메트릭이 보고됩니다.

각 저장 프로시저에는 고유 JVM가 할당됩니다. 다음은 수집된 메트릭 데이터에 대한 설명입니다.

  • process.memory.usage: 저장 프로시저 처리기를 실행하는 JVM이 소비하는 메모리 양(바이트)입니다.

  • process.cpu.utilization: 총 CPU 시간을 논리 CPU당 벽시계 시간으로 나눈 값으로, 백분율로 측정되며 1.0은 100% 사용률을 나타냅니다. 총 CPU 시간은 유휴 상태가 아닌 작업에 소요된 총 시간입니다.

쿼리에서 호출되는 각 Java 및 Scala UDF는 단일 JVM을 공유합니다. 메트릭 값은 쿼리의 각 Java 또는 Scala 함수에 대해 집계됩니다. 다음은 수집된 메트릭 데이터에 대한 설명입니다.

  • process.memory.usage: 쿼리에서 호출된 모든 관련 Java 함수의 합계로 표시되는 메모리 사용량입니다.

  • process.cpu.utilization: CPU 사용량으로, 쿼리에서 호출된 모든 Java 및 Scala 함수의 평균으로 표시됩니다.

Python:

CPU 및 메모리 메트릭은 각 Python 함수 또는 프로시저에 대해 보고됩니다.

각 저장 프로시저는 단 1개의 Python 프로세스에서만 실행됩니다. 다음은 수집된 메트릭 데이터에 대한 설명입니다.

  • process.memory.usage: 저장 프로시저 처리기를 실행하는 Python 프로세스에서 소비하는 메모리 양(바이트)입니다.

  • process.cpu.utilization: 총 CPU 시간을 논리 CPU당 벽시계 시간으로 나눈 값으로, 백분율로 측정되며 1.0은 100% 사용을 나타냅니다. 총 CPU 시간은 유휴 상태가 아닌 작업에 소요된 총 시간입니다.

각 UDF는 여러 Python 실행 프로세스에서 실행할 수 있습니다. 값은 여러 프로세스에 걸쳐 집계됩니다. 다음은 수집된 메트릭 데이터에 대한 설명입니다.

  • process.memory.usage: 메모리 사용량으로, 해당 UDF의 모든 관련 Python 프로세스의 합계로 표시됩니다.

  • process.cpu.utilization: 보고된 CPU로, 해당 UDF의 모든 연관된 Python 프로세스의 평균으로 표시됩니다.

Python 예제

다음 단계에 따라 메트릭 예제 데이터를 생성합니다.

  1. 세션의 메트릭 수준을 설정합니다. METRIC_LEVEL 매개 변수는 자동 측정된 리소스 메트릭 데이터 요소를 이벤트 테이블로 내보낼지 여부를 제어합니다. 매개 변수를 NONE 또는 ALL 로 설정하고 오브젝트 및 세션 수준에서 설정할 수 있습니다. 자세한 내용은 로깅, 메트릭 및 추적을 위한 수준 설정하기 섹션을 참조하십시오.

    ALTER SESSION SET METRIC_LEVEL = ALL;
    
    Copy
  2. 저장 프로시저를 만듭니다.

    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. 저장 프로시저 호출

    CALL DEMO_SP(100);
    
    Copy
  4. 쿼리가 완료되면 메트릭 데이터 보기 에 설명된 대로 메트릭 데이터를 봅니다.