예산에 대한 사용자 지정 작업

지출 임계값에 도달하면 저장 프로시저를 자동으로 호출하도록 예산을 구성할 수 있습니다. 이를 통해 크레딧 사용량에 대한 응답으로 웨어하우스 일시 중단, 사용자 지정 경고 전송 또는 테이블에 지출 이벤트 로깅과 같은 자동화된 작업을 수행할 수 있습니다. 사용자 지정 작업은 사용량이 예산 한도를 초과할 것으로 예상될 때 Snowflake에서 전송하는 :doc:`알림 </user-guide/budgets/notifications>`을 대체하지 않습니다.

사용자 지정 작업을 정의할 때 예상 크레딧 사용량 또는 실제 크레딧 사용량을 기반으로 저장 프로시저를 호출할지 여부를 지정한 다음, 임계값을 설정합니다. 예상 사용량 또는 실제 사용량이 임계값에 도달하면 저장 프로시저가 실행됩니다.

저장 프로시저 요구 사항

사용자 지정 작업에 의해 호출되는 저장 프로시저는 다음 요구 사항을 충족해야 합니다.

이러한 요구 사항을 충족하는 저장 프로시저를 생성한 후에는 프로시저 및 해당 상위 데이터베이스/스키마에 대한 SNOWFLAKE 애플리케이션 USAGE 권한을 부여해야 합니다. 예를 들어, 저장 프로시저의 정규화된 이름이 ``code_db.sch1.alert_team``인 경우 다음 명령을 실행합니다.

GRANT USAGE ON DATABASE code_db TO APPLICATION SNOWFLAKE;
GRANT USAGE ON SCHEMA code_db.sch1 TO APPLICATION SNOWFLAKE;
GRANT USAGE ON PROCEDURE code_db.sch1.alert_team(STRING, NUMBER) TO APPLICATION SNOWFLAKE;
Copy

참고

저장 프로시저를 사용자 지정 작업에 추가한 후 업데이트하는 경우 SNOWFLAKE 애플리케이션에 프로시저에 대한 USAGE 권한을 다시 부여해야 합니다.

예산에 사용자 지정 작업 추가

계정 예산 또는 사용자 지정 예산에 여러 사용자 지정 작업을 추가할 수 있지만, 동일한 예산에 10개 이상의 사용자 지정 작업을 추가할 수는 없습니다. 사용자 지정 작업은 다음 구성 요소로 구성됩니다.

  • 저장 프로시저: 호출할 프로시저에 대한 참조입니다.

  • 인자: 저장 프로시저에 전달할 인자의 배열입니다.

  • 임계값: 사용자 지정 작업을 트리거하는 예산 한도의 백분율(예: 75%)입니다.

  • 트리거 유형: 사용자 지정 작업이 예상 소비량 또는 실제 소비량을 기준으로 트리거되는지 여부입니다.

예산에 사용자 지정 작업을 추가하려면 예산 인스턴스에서 ADD_CUSTOM_ACTION 메서드를 호출합니다. 예를 들어, 다음 코드는 지출이 예산 한도의 75%를 초과할 것으로 예상되는 경우 send_email_notification 저장 프로시저를 호출하는 사용자 지정 작업을 추가합니다.

CALL budget_db.sch1.my_budget!ADD_CUSTOM_ACTION(
  SYSTEM$REFERENCE('PROCEDURE', 'code_db.sch1.alert_team(string, string, string)'),
  ARRAY_CONSTRUCT('admin@example.com', 'Budget Alert', 'Spending at 75% of budget limit'),
  'PROJECTED',
  75);
Copy

사용자 지정 작업에 의해 호출되는 저장 프로시저 생성을 포함하는 전체 예제는 확장된 예 섹션을 참조하세요.

예산에서 사용자 지정 작업 제거

예산에서 사용자 지정 작업을 제거하려면 예산 인스턴스에서 REMOVE_CUSTOM_ACTIONS 메서드를 호출합니다. 이 메서드를 사용하여 다음을 수행할 수 있습니다.

  • 예산에서 모든 사용자 지정 작업을 제거합니다. 예:

    CALL budget_db.sch1.my_budget!REMOVE_CUSTOM_ACTIONS();
    
    Copy
  • 임계값이 지정된 모든 사용자 지정 작업을 제거합니다. 예를 들어, 사용량이 75%에 도달할 때 트리거되는 모든 사용자 지정 작업을 제거하려면 다음 명령을 실행합니다.

    CALL budget_db.sch1.my_budget!REMOVE_CUSTOM_ACTIONS(75);
    
    Copy
  • 예산에서 지정된 사용자 지정 작업을 제거합니다. 예를 들어, 사용량이 75%에 도달할 때 my_sp 저장 프로시저를 호출하는 사용자 지정 작업을 제거하려면 다음 명령을 실행합니다.

    CALL budget_db.sch1.my_budget!REMOVE_CUSTOM_ACTIONS(75, 'code_db.sch1.my_sp');
    
    Copy

    특정 작업을 제거하는 경우 GET_CUSTOM_ACTIONS 메서드에서 반환되는 정규화된 프로시저 이름을 사용합니다.

확장된 예

다음 예제에서는 사용자 지정 작업으로 호출되는 저장 프로시저를 작성하고, 프로시저에 필요한 권한을 부여한 다음, 예산에 사용자 지정 작업을 추가하는 방법을 보여줍니다.

  1. :ref:`모든 요구 사항을 준수 <label-budget_custom_actions_stored_procedure>`하는 저장 프로시저를 생성합니다.

    CREATE OR REPLACE PROCEDURE code_db.sch1.alert_team(
        integration_name string,
        email_list string,
        email_subject string,
        email_content string)
    RETURNS STRING
    LANGUAGE JAVASCRIPT
    EXECUTE AS OWNER
    AS
    $$
        var sql_command = "CALL SYSTEM$SEND_EMAIL('" + INTEGRATION_NAME + "', " +
                                                "'" +  EMAIL_LIST + "', " +
                                                "'" + EMAIL_SUBJECT + "'," +
                                                "'" + EMAIL_CONTENT + "'" + ");";
        var statement1 = snowflake.createStatement({sqlText: sql_command});
        statement1.execute();
        return "alert sent";
    $$;
    
    Copy
  2. SNOWFLAKE 애플리케이션에 저장 프로시저에 대한 권한을 부여합니다.

    GRANT USAGE ON DATABASE code_db TO APPLICATION SNOWFLAKE;
    GRANT USAGE ON SCHEMA code_db.sch1 TO APPLICATION SNOWFLAKE;
    GRANT USAGE ON PROCEDURE code_db.sch1.alert_team(STRING, STRING, STRING, STRING)
      TO APPLICATION SNOWFLAKE;
    
    Copy
  3. 사용량이 예산 지출 한도의 90%에 도달할 때 트리거되도록 예산에 사용자 지정 작업을 추가합니다.

    CALL budget_db.sch1.my_budget!ADD_CUSTOM_ACTION(
      SYSTEM$REFERENCE('PROCEDURE', 'code_db.sch1.alert_team(string, string, string, string)'),
      ARRAY_CONSTRUCT('my_int', 'admin@example.com', 'Budget Alert', 'Spending at 90% of budget limit'),
      'ACTUAL',
      90);
    
    Copy

사용자 지정 작업 문제 해결하기

사용자 지정 작업이 예상대로 작동하지 않으면 다음 방법을 사용하여 문제를 진단합니다.

사용자 지정 작업 실행 모니터링

Snowflake는 태스크를 사용하여 사용자 지정 작업을 실행합니다. 이러한 작업은 명명 규칙 ``BUDGET_CUSTOM_ACTION_TRIGGER_AT_%``을 따릅니다. 예산 인스턴스에 대한 모든 사용자 지정 작업 태스크의 실행 상태를 확인하려면 다음 쿼리를 실행합니다.

SELECT th.*, ci.name AS budget_name
  FROM SNOWFLAKE.ACCOUNT_USAGE.TASK_HISTORY th
  JOIN SNOWFLAKE.ACCOUNT_USAGE.CLASS_INSTANCES ci
    ON th.instance_id = ci.id
  WHERE ci.class_name = 'BUDGET'
    AND th.name ILIKE 'BUDGET_CUSTOM_ACTION_TRIGGER_AT_%'
    AND ci.name = '<budget_name>'
  ORDER BY th.completed_time DESC
  LIMIT 10;
Copy

작업 트리거 기록 보기

일정 기간 동안 특정 예산에서 트리거된 사용자 지정 작업을 확인하려면 다음 쿼리를 실행합니다.

SELECT th.*, ci.name as budget_name
  FROM SNOWFLAKE.ACCOUNT_USAGE.TASK_HISTORY th
  JOIN SNOWFLAKE.ACCOUNT_USAGE.CLASS_INSTANCES ci
    ON th.instance_id = ci.id
  WHERE ci.class_name = 'BUDGET'
    AND th.name ILIKE 'BUDGET_CUSTOM_ACTION_TRIGGER_AT_%'
    AND ci.name = '<budget_name>'
    AND th.COMPLETED_TIME >= DATEADD('day', -7, CURRENT_TIMESTAMP())
  ORDER BY th.completed_time DESC;
Copy

특정 사용자 지정 작업에 대한 트리거 기록을 확인하려면 먼저 GET_CUSTOM_ACTIONS 메서드를 호출하여 작업 ID를 가져옵니다.

CALL <budget_name>!GET_CUSTOM_ACTIONS();
Copy

그런 다음, 다음 쿼리에서 작업 ID를 사용합니다.

SELECT th.*, ci.name AS budget_name
  FROM SNOWFLAKE.ACCOUNT_USAGE.TASK_HISTORY th
  JOIN SNOWFLAKE.ACCOUNT_USAGE.CLASS_INSTANCES ci
    ON th.instance_id = ci.id
  WHERE ci.class_name = 'BUDGET'
    AND th.name ILIKE 'BUDGET_CUSTOM_ACTION_TRIGGER_AT_%'
    AND th.query_text ILIKE '%<action_id>%'
    AND ci.name = '<budget_name>'
    AND th.COMPLETED_TIME >= DATEADD('day', -7, CURRENT_TIMESTAMP())
  ORDER BY th.completed_time DESC;
Copy

트리거되지 않는 작업 문제 해결

사용자 지정 작업이 예상대로 트리거되지 않으면 다음과 같은 일반적인 문제가 있는지 확인합니다. 사용자 지정 예산이 ``budget_db.sch1.my_budget``인 것으로 가정합니다.

저장 프로시저 또는 권한이 변경됨

사용자 지정 작업에 의해 호출된 저장 프로시저가 여전히 유효한지와 SNOWFLAKE 애플리케이션에 여전히 필요한 권한이 있는지 확인합니다. CONFIRM_CUSTOM_ACTIONS_ACCESS 메서드를 호출하여 저장 프로시저 및 액세스 제어 권한의 유효성을 검사합니다.

CALL budget_db.sch1.my_budget!CONFIRM_CUSTOM_ACTIONS_ACCESS();
Copy

예산이 활성화되지 않음

계정 예산의 경우에만 GET_CONFIG 메서드를 호출하고 is_active 필드를 확인하여 예산이 활성화되었는지 확인합니다.

CALL budget_db.sch1.my_budget!GET_CONFIG();
Copy

예산에 지출 한도가 없음

예산에 지출 한도가 구성되어 있지 않으면 사용자 지정 작업이 트리거되지 않습니다. 지출 한도를 확인합니다.

CALL budget_db.sch1.my_budget!GET_SPENDING_LIMIT();
Copy

예산이 어떤 리소스도 추적하지 않음

지출 기록을 확인하여 예산이 리소스를 추적하고 있는지 확인합니다.

CALL budget_db.sch1.my_budget!GET_SPENDING_HISTORY();
Copy

최근에 사용자 지정 작업이 트리거됨

과도한 트리거를 방지하기 위해 Snowflake는 사용자 지정 작업을 실행할 수 있는 빈도를 다음과 같이 제한합니다.

  • 크레딧 사용량이 지출 임계값에 도달할 것으로 예상될 때 사용자 지정 작업이 실행되는 경우 저장 프로시저는 하루에 두 번 이상 호출되지 않습니다.

  • 크레딧 사용량이 실제 지출 한도에 도달할 때 사용자 지정 작업이 실행되는 경우 저장 프로시저는 한 달에 한 번 이상 호출되지 않습니다.

GET_CUSTOM_ACTIONS 메서드를 호출하여 LAST_TRIGGER_ATTEMPT_TIME 필드를 확인합니다.