Kundenspezifische Aktionen für Budgets¶
Sie können ein Budget so konfigurieren, dass es automatisch eine gespeicherte Prozedur aufruft, wenn ein Schwellenwert für die Ausgaben erreicht ist. So können Sie als Reaktion auf den Credit-Verbrauch automatische Aktionen durchführen, z. B. das Anhalten von Warehouses, das Versenden von kundenspezifischen Alerts oder das Protokollieren von Ausgabenereignissen in einer Tabelle. Kundenspezifische Aktionen ersetzen nicht die Benachrichtigungen, die Snowflake sendet, wenn der Verbrauch voraussichtlich Ihr Budgetlimit überschreitet.
Wenn Sie eine kundenspezifische Aktion definieren, geben Sie an, ob diese die gespeicherte Prozedur auf der Grundlage des voraussichtlichen Credit-Verbrauchs oder des tatsächlichen Credit-Verbrauchs aufruft, und legen Sie dann den Schwellenwert fest. Wenn der voraussichtliche oder tatsächliche Verbrauch den Schwellenwert erreicht, wird die gespeicherte Prozedur ausgeführt.
Anforderungen an gespeicherte Prozeduren¶
Die gespeicherte Prozedur, die durch eine kundenspezifische Aktion aufgerufen wird, muss die folgenden Anforderungen erfüllen:
Die Prozedur muss mit Eigentümerrechten ausgeführt werden, nicht mit Aufruferrechten. Weitere Informationen dazu finden Sie unter Erläuterungen zu gespeicherten Prozeduren mit Aufruferrechten und Eigentümerrechten.
Das Ausführen der Prozedur darf nicht länger als 30 Minuten dauern.
Die Prozedur dar kein OUTPUT-Argument aufweisen.
Snowflake wiederholt fehlgeschlagene Aktionen einmal. Gestalten Sie Ihre Prozedur also so, dass sie mehrere Aufrufe problemlos verarbeiten kann, ohne doppelte oder unbeabsichtigte Auswirkungen zu verursachen.
Die erforderlichen Argumente der Prozedur müssen einen der folgenden Datentypen aufweisen:
Nachdem Sie eine gespeicherte Prozedur erstellt haben, die diese Anforderungen erfüllt, müssen Sie der SNOWFLAKE-Anwendung die USAGE-Berechtigung für die Prozedur und deren übergeordnete Datenbank/Schema gewähren. Wenn der vollqualifizierte Name Ihrer gespeicherten Prozedur zum Beispiel code_db.sch1.alert_team lautet, führen Sie die folgenden Befehle aus:
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;
Bemerkung
Wenn Sie die gespeicherte Prozedur aktualisieren, nachdem Sie sie zu einer kundenspezifischen Aktion hinzugefügt haben, müssen Sie der SNOWFLAKE-Anwendung die USAGE-Berechtigung für die Prozedur erneut gewähren.
Hinzufügen einer kundenspezifischen Aktion zu einem Budget¶
Sie können mehrere kundenspezifischen Aktionen zum Kontobudget oder zu einem kundenspezifischen Budget hinzufügen, Sie können jedoch nicht mehr als 10 kundenspezifische Aktionen zu demselben Budget hinzufügen. Eine kundenspezifische Aktion besteht aus den folgenden Komponenten:
Gespeicherte Prozedur: Ein Verweis auf die Prozedur, die aufgerufen werden soll.
Argumente: Ein Array von Argumenten, das an die gespeicherte Prozedur übergeben werden soll.
Schwellenwert: Der Prozentsatz des Budgetlimit, der die kundenspezifische Aktion auslöst (z. B. 75 %).
Triggertyp: Gibt an, ob die kundenspezifische Aktion auf der Grundlage des voraussichtlichen Verbrauchs oder des tatsächlichen Verbrauchs ausgelöst wird.
Um eine kundenspezifische Aktion zu einem Budget hinzuzufügen, rufen Sie die Methode ADD_CUSTOM_ACTION für die Budgetinstanz auf. Der folgende Code fügt zum Beispiel eine kundenspezifische Aktion hinzu, die die gespeicherte Prozedur send_email_notification aufruft, wenn die Ausgaben voraussichtlich 75 % des Budgetlimits überschreiten werden:
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);
Ein durchgängiges Beispiel, das das Erstellen der gespeicherten Prozedur enthält, die von der kundenspezifischen Aktion aufgerufen wird, finden Sie unter:ref:label-budget_custom_actions_extended_example.
Entfernen einer kundenspezifische Aktion aus einem Budget¶
Um eine kundenspezifische Aktion aus einem Budget zu entfernen, rufen Sie die Methode REMOVE_CUSTOM_ACTIONS für die Budgetinstanz auf. Mit dieser Methode können Sie Folgendes tun:
Alle kundenspezifischen Aktionen aus einem Budget entfernen. Beispiel:
CALL budget_db.sch1.my_budget!REMOVE_CUSTOM_ACTIONS();
Alle kundenspezifischen Aktionen entfernen, die einen bestimmten Schwellenwert haben. Um zum Beispiel alle kundenspezifischen Aktionen zu entfernen, die ausgelöst werden, wenn der Verbrauch 75 % erreicht, führen Sie den folgenden Befehl aus:
CALL budget_db.sch1.my_budget!REMOVE_CUSTOM_ACTIONS(75);
Eine angegebene kundenspezifische Aktion aus einem Budget entfernen. Um beispielsweise die kundenspezifische Aktion zu entfernen, die die gespeicherte Prozedur
my_spaufruft, wenn der Verbrauch 75 % erreicht, führen Sie den folgenden Befehl aus:CALL budget_db.sch1.my_budget!REMOVE_CUSTOM_ACTIONS(75, 'code_db.sch1.my_sp');
Tipp
Wenn Sie eine bestimmte Aktion entfernen, verwenden Sie den vollqualifizierten Prozedurnamen, der von der Methode GET_CUSTOM_ACTIONS zurückgegeben wird.
Erweitertes Beispiel¶
Das folgende Beispiel zeigt, wie Sie eine gespeicherte Prozedur schreiben, die durch eine kundenspezifische Aktion aufgerufen wird, die erforderlichen Berechtigungen für die Prozedur erteilen und dann die kundenspezifische Aktion zum Budget hinzufügen.
Erstellen Sie eine gespeicherte Prozedur, die allen Anforderungen entspricht:
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"; $$;
Erteilen Sie der SNOWFLAKE-Anwendung Berechtigungen für die gespeicherte Prozedur:
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;
Fügen Sie die kundenspezifische Aktion zum Budget hinzu, sodass sie ausgelöst wird, wenn der Verbrauch 90 % des Ausgabenlimits des Budgets erreicht:
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);
Problembehandlung bei kundenspezifischen Aktionen¶
Wenn eine kundenspezifische Aktion nicht wie erwartet funktioniert, verwenden Sie die folgenden Methoden, um das Problem zu diagnostizieren.
Überwachen der Ausführung kundenspezifischer Aktionen¶
Snowflake verwendet Aufgaben, um kundenspezifische Aktionen auszuführen. Diese Aufgaben folgen der Namenskonvention``BUDGET_CUSTOM_ACTION_TRIGGER_AT_%``. Um den Ausführungsstatus aller kundenspezifischen Aktionsaufgaben für eine Budgetinstanz zu überprüfen, führen Sie die folgende Abfrage aus:
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;
Anzeigen des Trigger-Verlaufs der Aktionen¶
Um zu ermitteln, welche kundenspezifischen Aktionen von einem bestimmten Budget in einem bestimmten Zeitraum ausgelöst wurden, führen Sie die folgende Abfrage aus:
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;
Um den Trigger-Verlauf für eine bestimmte kundenspezifische Aktion zu überprüfen, rufen Sie zunächst die Aktions-ID ab, indem Sie die Methode GET_CUSTOM_ACTIONS aufrufen:
CALL <budget_name>!GET_CUSTOM_ACTIONS();
Verwenden Sie dann die Aktions-ID in der folgenden Abfrage:
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;
Fehlerbehebung bei Aktionen, die nicht ausgelöst werden¶
Wenn eine kundenspezifische Aktion nicht wie erwartet ausgelöst wird, prüfen Sie die folgenden allgemeinen Probleme. Angenommen, Ihr kundenspezifisches Budget lautet``budget_db.sch1.my_budget``.
Gespeicherte Prozedur oder Berechtigungen geändert
Überprüfen Sie, ob die von der kundenspezifischen Aktion aufgerufene gespeicherte Prozedur noch gültig ist und dass die SNOWFLAKE-Anwendung immer noch über die erforderlichen Berechtigungen verfügt. Rufen Sie die Methode CONFIRM_CUSTOM_ACTIONS_ACCESS zur Validierung der gespeicherten Prozedur und der Zugriffssteuerungsrechte auf:
CALL budget_db.sch1.my_budget!CONFIRM_CUSTOM_ACTIONS_ACCESS();
Budget ist nicht aktiviert
Nur für Kontobudgets: Überprüfen Sie, ob das Budget aktiviert ist, indem Sie die Methode GET_CONFIG aufrufen und das Feld is_active überprüfen.
CALL budget_db.sch1.my_budget!GET_CONFIG();
Budget hat kein Ausgabenlimit
Kundenspezifische Aktionen werden nicht ausgelöst, wenn für das Budget kein Ausgabenlimit konfiguriert ist. Überprüfen des Ausgabenlimits:
CALL budget_db.sch1.my_budget!GET_SPENDING_LIMIT();
Budget verfolgt keine Ressourcen
Überprüfen Sie, ob das Budget die Ressourcen verfolgt, indem Sie den Ausgabenverlauf überprüfen:
CALL budget_db.sch1.my_budget!GET_SPENDING_HISTORY();
Kundenspezifische Aktion wurde kürzlich ausgelöst
Um ein übermäßiges Auslösen zu verhindern, begrenzt Snowflake die Häufigkeit der Ausführung einer kundenspezifischen Aktion:
Wenn die kundenspezifische Aktion ausgeführt wird, während der Credit-Verbrauch voraussichtlich einen Ausgabenschwellenwert erreicht, wird die gespeicherte Prozedur nicht mehr als einmal täglich aufgerufen.
Wenn die kundenspezifische Aktion ausgeführt wird, und der Credit-Verbrauch ein Limit der tatsächlichen Ausgaben erreicht, wird die gespeicherte Prozedur nur einmal im Monat aufgerufen.
Überprüfen Sie das Feld LAST_TRIGGER_ATTEMPT_TIME, indem Sie die Methode GET_CUSTOM_ACTIONS aufrufen.