Snowflake의 데이터를 기반으로 경고 설정하기

이 항목에서는 Snowflake 내의 데이터를 기반으로 특정 조건에서 정기적으로 어떤 동작을 수행하는 경고를 설정하는 방법에 대해 설명합니다.

소개

경우에 따라 Snowflake의 데이터가 특정 조건을 충족할 때 알림을 받거나 조치를 취할 수도 있습니다. 예를 들어 다음과 같은 경우에 알림을 받을 수 있습니다.

  • 웨어하우스 크레딧 사용은 현재 할당량의 지정된 비율만큼 증가할 경우.

  • 파이프라인, 작업, 구체화된 뷰 등에 대한 리소스 소비가 지정된 양 이상으로 증가할 경우.

  • 데이터가 설정한 특정 비즈니스 규칙을 준수하지 못할 경우.

이를 위해 Snowflake 경고를 설정할 수 있습니다. Snowflake 경고는 다음을 지정하는 스키마 수준 오브젝트입니다.

  • 경고를 트리거하는 조건(예: 완료하는 데 1초 이상 걸리는 쿼리가 있음).

  • 조건 충족 시 수행할 동작(예: 이메일 알림 전송, 테이블에서 일부 데이터 캡처 등).

  • 조건을 평가해야 하는 시기와 빈도(예: 24시간마다, 매주 일요일 자정 등).

예를 들어 크레딧 소비가 웨어하우스에 대한 특정 한도를 초과할 때 이메일 알림을 보내려고 한다고 가정합니다. 30분마다 이를 확인한다고 가정합니다. 다음 속성을 사용하여 경고를 만들 수 있습니다.

  • 조건: 웨어하우스의 크레딧 소비(ACCOUNT_USAGEWAREHOUSE_METERING_HISTORY 뷰에 있는 credits_used 열의 합계) 스키마가 지정된 한도를 초과합니다.

  • 동작: 관리자에게 이메일을 보냅니다.

  • 빈도/일정: 30분마다 이 조건의 충족 여부를 확인합니다.

경고 생성 권한 부여하기

경고를 생성하려면 다음 권한이 있는 역할을 사용해야 합니다.

  • 계정에 대한 EXECUTE ALERT 권한.

    참고

    ACCOUNTADMIN 역할을 가진 사용자만 이 권한을 부여할 수 있습니다.

  • 경고를 만들려는 스키마에 대한 USAGE 및 CREATE ALERT 권한.

  • 스키마를 포함한 데이터베이스에 대한 USAGE 권한.

  • 경고를 실행하는 데 사용되는 웨어하우스에 대한 USAGE 권한.

역할에 이러한 권한을 부여하려면 GRANT <권한> 명령을 사용하십시오.

예를 들어 my_schema 라는 스키마에서 경고를 생성할 권한이 있는 my_alert_role 이라는 사용자 지정 역할을 생성한다고 가정합니다. 경고가 my_warehouse 웨어하우스를 사용하도록 하려고 합니다.

이를 위해 다음을 수행하십시오.

  1. ACCOUNTADMIN 역할을 가진 사용자가 다음을 수행하도록 합니다.

    1. 사용자 지정 역할을 만듭니다.

      예:

      USE ROLE ACCOUNTADMIN;
      
      CREATE ROLE my_alert_role;
      
      Copy
    2. 해당 사용자 지정 역할에 EXECUTE ALERT 전역 권한을 부여합니다.

      예:

      GRANT EXECUTE ALERT ON ACCOUNT TO ROLE my_alert_role;
      
      Copy
    3. 사용자에게 사용자 지정 역할을 부여합니다.

      예:

      GRANT ROLE my_alert_role TO USER my_user;
      
      Copy
  2. 데이터베이스, 스키마 및 웨어하우스의 소유자가 사용자 지정 역할에 대한 경고를 생성하는 데 필요한 권한을 부여하도록 합니다.

    • 스키마 소유자는 스키마에 대한 CREATE ALERT 및 USAGE 권한을 부여해야 합니다.

      GRANT CREATE ALERT ON SCHEMA my_schema TO ROLE my_alert_role;
      GRANT USAGE ON SCHEMA my_schema TO ROLE my_alert_role;
      
      Copy
    • 데이터베이스 소유자는 데이터베이스에 대한 USAGE 권한을 부여해야 합니다.

      GRANT USAGE ON DATABASE my_database TO ROLE my_alert_role;
      
      Copy
    • 웨어하우스 소유자는 웨어하우스에 대한 USAGE 권한을 부여해야 합니다.

      GRANT USAGE ON WAREHOUSE my_warehouse TO ROLE my_alert_role;
      
      Copy

경고 만들기

gauge 라는 테이블에 있는 하나 이상의 행이 gauge_value 열에 200을 초과하는 값이 있을 때마다 gauge_value_exceeded_history 라는 테이블에 현재 타임스탬프를 삽입하려 한다고 가정합니다.

다음과 같은 경고를 만들 수 있습니다.

  • gauge_value 가 200을 초과하는 조건을 평가하는 경고.

  • 이 조건이 true로 평가될 경우 gauge_value_exceeded_history 에 타임스탬프를 삽입하는 경고.

이러한 동작을 수행하는 my_alert 라는 경고를 생성하는 방법은 다음과 같습니다.

  1. 경고 생성 권한 이 있는 역할을 사용 중인지 확인합니다.

    해당 역할을 사용하고 있지 않은 경우 USE ROLE 명령을 실행하여 그 역할을 사용하십시오.

  2. 경고를 만들 계획인 데이터베이스와 스키마를 사용 중인지 확인하십시오.

    해당 데이터베이스와 스키마를 사용하고 있지 않은 경우 USE DATABASEUSE SCHEMA 명령을 실행하여 해당 데이터베이스와 스키마를 사용하십시오.

  3. CREATE ALERT 명령을 실행하여 경고를 생성합니다.

    CREATE OR REPLACE ALERT my_alert
      WAREHOUSE = mywarehouse
      SCHEDULE = '1 minute'
      IF( EXISTS(
        SELECT gauge_value FROM gauge WHERE gauge_value>200))
      THEN
        INSERT INTO gauge_value_exceeded_history VALUES (current_timestamp());
    
    Copy

    CREATE ALERT 명령에 대한 전체 설명은 CREATE ALERT 섹션을 참조하십시오.

    참고

    경고를 생성하면 경고가 기본적으로 일시 중단됩니다. 경고를 실행하려면 새로 만든 경고를 다시 시작해야 합니다.

  4. ALTER ALERT … RESUME 명령을 실행하여 경고를 다시 시작합니다. 예:

    ALTER ALERT my_alert RESUME;
    
    Copy

경고 일정을 기반으로 타임스탬프 지정하기

경우에 따라 경고 일정을 기반으로 조건이나 동작을 정의해야 할 수도 있습니다.

예를 들어 테이블에 행이 추가된 시간을 나타내는 타임스탬프 열이 있고, 마지막으로 성공적으로 평가된 경고와 현재 예약된 경고 사이에 새 행이 추가된 경우 경고를 보내려고 한다고 가정합니다. 즉, 다음을 평가하려고 합니다.

<now> - <last_execution_of_the_alert>
Copy

CURRENT_TIMESTAMP 와 경고 예약 시간을 사용하여 이 시간 범위를 계산하는 경우 계산된 범위에는 경고가 예약된 시간과 경고 조건이 실제로 평가되는 시간 사이의 대기 시간을 고려하지 않습니다.

대신 현재 예약 경고와 성공적으로 평가된 마지막 경고의 타임스탬프가 필요한 경우 다음 함수를 사용합니다.

  • SCHEDULED_TIME 은 현재 경고가 예약된 시간을 나타내는 타임스탬프를 반환합니다.

  • LAST_SUCCESSFUL_SCHEDULED_TIME 은 마지막으로 성공적으로 평가된 경고가 예약된 시간을 나타내는 타임스탬프를 반환합니다.

이러한 함수는 SNOWFLAKE.ALERT 스키마 에 정의되어 있습니다. 이러한 함수를 호출하려면 SNOWFLAKE.ALERT_VIEWER 데이터베이스 역할 이 부여된 역할을 사용해야 합니다. 이 역할을 다른 역할에 부여하려면 GRANT DATABASE ROLE 명령을 사용하십시오. 예를 들어 이 역할을 사용자 지정 역할 alert_role 에 부여하려면 다음을 실행하십시오.

GRANT DATABASE ROLE SNOWFLAKE.ALERT_VIEWER TO ROLE alert_role;
Copy

다음은 마지막으로 성공적으로 평가된 경고가 예약된 시간과 현재 경고가 예약된 시간 사이에 새 행이 my_table 에 추가된 경우 이메일 메시지를 보내는 예입니다.

CREATE OR REPLACE ALERT alert_new_rows
  WAREHOUSE = my_warehouse
  SCHEDULE = '1 MINUTE'
  IF (EXISTS (
      SELECT *
      FROM my_table
      WHERE row_timestamp BETWEEN SNOWFLAKE.ALERT.LAST_SUCCESSFUL_SCHEDULED_TIME()
       AND SNOWFLAKE.ALERT.SCHEDULED_TIME()
  ))
  THEN CALL SYSTEM$SEND_EMAIL(...);
Copy

경고 작업의 조건에 대한 SQL 문의 결과 확인하기

경고 작업 내에서 조건에 대한 SQL 문의 결과를 확인해야 하는 경우:

  1. 조건에 대한 SQL 문의 쿼리 ID를 가져오려면 GET_CONDITION_QUERY_UUID 함수를 호출하십시오.

  2. 쿼리 ID를 RESULT_SCAN 함수에 전달하여 해당 SQL 문의 실행 결과를 가져옵니다.

예:

CREATE ALERT my_alert
  WAREHOUSE = my_warehouse
  SCHEDULE = '1 MINUTE'
  IF (EXISTS (
    SELECT * FROM my_source_table))
  THEN
    BEGIN
      LET condition_result_set RESULTSET :=
        (SELECT * FROM TABLE(RESULT_SCAN(SNOWFLAKE.ALERT.GET_CONDITION_QUERY_UUID())));
      ...
    END;
Copy

수동으로 경고 실행하기

경우에 따라 경고를 수동으로 실행해야 할 수도 있습니다. 예:

  • 새 경고를 생성하는 경우 경고가 예상대로 작동하는지 확인할 수 있습니다.

  • 데이터 파이프라인의 특정 시점에서 경고를 실행할 수도 있습니다. 예를 들어 저장 프로시저 호출 종료 시 경고를 실행할 수 있습니다.

경고를 수동으로 실행하려면 EXECUTE ALERT 명령을 실행하십시오.

EXECUTE ALERT my_alert;
Copy

EXECUTE ALERT 명령은 경고에 정의된 일정과 관계없이 경고 단일 실행을 수동으로 트리거합니다.

이 명령을 대화형으로 실행할 수 있습니다. 저장 프로시저나 Snowflake Scripting 블록 내에서 이 명령을 실행할 수도 있습니다.

이 명령을 실행하는 데 필요한 권한과 이 명령이 일시 중단된 경고, 실행 중인 경고, 예약된 경고에 미치는 영향에 대한 자세한 내용은 EXECUTE ALERT 섹션을 참조하십시오.

경고 일시 중단 및 재개하기

경고가 일시적으로 실행되지 않도록 해야 할 경우 ALTER ALERT … SUSPEND 명령을 실행하여 경고를 일시 중단할 수 있습니다. 예:

ALTER ALERT my_alert SUSPEND;
Copy

일시 중단된 경고를 재개하려면 ALTER ALERT … RESUME 명령을 실행하십시오. 예:

ALTER ALERT my_alert RESUME;
Copy

참고

자신이 경고 소유자가 아닌 경우 경고를 일시 중단하거나 재개하려면 경고에 대한 OPERATE 권한이 있어야 합니다.

경고 수정하기

경고의 속성을 수정하려면 ALTER ALERT 명령을 실행하십시오. 예:

  • my_alert 라는 경고에 대한 웨어하우스를 my_other_warehouse 로 변경하려면 다음을 실행하십시오.

    ALTER ALERT my_alert SET WAREHOUSE = my_other_warehouse;
    
    Copy
  • my_alert 라는 경고가 2분마다 평가되도록 일정을 변경하려면 다음을 실행하십시오.

    ALTER ALERT my_alert SET SCHEDULE = '2 minutes';
    
    Copy
  • gauge 라는 테이블에 있는 임의의 행에서 gauge_value 열에 300 보다 큰 값이 있는 경우 경고를 받도록 my_alert 라는 경고의 조건을 변경하려면 다음을 실행하십시오.

    ALTER ALERT my_alert MODIFY CONDITION EXISTS (SELECT gauge_value FROM gauge WHERE gauge_value>300);
    
    Copy
  • my_alert 라는 경고에 대한 동작을 CALL my_procedure() 로 변경하려면 다음을 실행하십시오.

    ALTER ALERT my_alert MODIFY ACTION CALL my_procedure();
    
    Copy

참고

경고 속성을 수정하려면 경고의 소유자여야 합니다.

경고 삭제하기

경고를 삭제하려면 DROP ALERT 명령을 실행하십시오. 예:

DROP ALERT my_alert;
Copy

경고가 존재하지 않는 경우 오류를 발생시키지 않고 경고를 삭제하려면 다음을 실행하십시오.

DROP ALERT IF EXISTS my_alert;
Copy

참고

경고를 삭제하려면 경고의 소유자여야 합니다.

경고에 대한 세부 정보 보기

계정, 데이터베이스 또는 스키마에서 생성된 경고를 나열하려면 SHOW ALERTS 명령을 실행하십시오. 예를 들어 현재 스키마에서 생성된 경고를 나열하려면 다음 명령을 실행하십시오.

SHOW ALERTS;
Copy

이 명령을 실행하면 자신이 소유한 경고와 MONITOR 또는 OPERATE 권한이 있는 경고가 나열됩니다.

특정 경고에 대한 세부 정보를 보려면 DESCRIBE ALERT 명령을 실행하십시오. 예:

DESC ALERT my_alert;
Copy

참고

자신이 경고 소유자가 아닌 경우 경고의 세부 정보를 보려면 경고에 대한 MONITOR 또는 OPERATE 권한이 있어야 합니다.

경고 실행 모니터링하기

경고 실행을 모니터링하려면 다음과 같이 하면 됩니다.

  • 경고에 대해 지정된 동작의 결과를 확인합니다. 예를 들어 해당 동작으로 테이블에 행이 삽입된 경우 테이블에서 새 행을 확인할 수 있습니다.

  • 다음 중 하나를 사용하여 경고 실행 기록을 봅니다.

    • INFORMATION_SCHEMA 스키마의 ALERT_HISTORY 테이블 함수.

      예를 들어 지난 1시간 동안의 경고 실행을 보려면 다음 문을 실행하십시오.

      SELECT *
      FROM
        TABLE(INFORMATION_SCHEMA.ALERT_HISTORY(
          SCHEDULED_TIME_RANGE_START
            =>dateadd('hour',-1,current_timestamp())))
      ORDER BY SCHEDULED_TIME DESC;
      
      Copy
    • 공유 SNOWFLAKE 데이터베이스에서 ACCOUNT_USAGE 스키마의 ALERT_HISTORY 뷰.

쿼리 기록에 쿼리를 실행한 사용자의 이름이 SYSTEM으로 표시됩니다. (경고는 시스템 서비스 에 의해 실행됩니다.)