Snowflake ha recentemente ampliato le funzionalità di alerting, rendendo possibile l'invio di alert via Email o Webhook. Gli alert via Webhook sono particolarmente potenti, perché permettono di recapitare le notifiche su Slack o Microsoft Teams. Una funzionalità utile in molti scenari, dagli alert sui fallimenti delle pipeline a quelli data-driven.
In questo articolo trovate una guida passo-passo per configurare gli alert di Snowflake su Microsoft Teams.
Quickstart
Passo 1: creare un Webhook in Teams
In Teams, create un nuovo canale oppure spostatevi sul canale in cui volete ricevere gli alert.
Nell'angolo in alto a destra del canale, cliccate sui 3 puntini e poi su "Gestisci canale".
Aprite la scheda Impostazioni, sezione Connettori, e cliccate su Modifica.
Vi apparirà l'elenco dei Connettori. Cercate "Webhook" e cliccate su "Aggiungi".
Nella schermata successiva potete caricare un'immagine per il webhook. Io userò un bel logo di Snowflake. Assegnate un nome al webhook e cliccate su "Crea".
Dopo aver cliccato su "Crea", verrà mostrato l'URL del webhook. L'URL contiene il vostro secret, quindi trattatelo con cura. Per ora, copiate l'URL e incollatelo in un blocco note.
Testare il Webhook
Per testare il webhook potete usare questo comando CURL. Su Windows, usate Git Bash.
curl -X POST https://paste-your-url-with-secret-here \
-H "Content-Type: application/json" \
-d '{"text": "Hello, world"}'
Dovreste vedere subito il messaggio "Hello, world" comparire nel canale Teams.
Complimenti, il vostro nuovo Webhook è operativo!
Passo 2: creare il Secret in Snowflake
L'URL del Webhook contiene un secret. Sostituite la stringa segreta qui sotto con la vostra ed eseguite questo comando in Snowflake.
Promemoria: i Secret sono oggetti a livello di schema. Fate attenzione al contesto di database e schema del worksheet, oppure usate i nomi completamente qualificati.
Nel mio caso, ho creato un secret di nome gmds_teams_secret nello schema public del database analytics.
use schmea <database>.<schema>;
CREATE OR REPLACE SECRET gmds_teams_secret
TYPE = GENERIC_STRING
SECRET_STRING = 'this-is-the-secret';
Per chiarezza: il secret è l'ultima parte dell'URI mostrato qui: https://org-name.webhook.office.com/webhookb2/webhook-id/IncomingWebhook/this-is-the-secret
Passo 3: creare una notification integration webhook
Ora che abbiamo creato il secret, passiamo alla Notification Integration:
CREATE OR REPLACE NOTIFICATION INTEGRATION gmds_teams_webhook_integration
TYPE=WEBHOOK
ENABLED=TRUE
WEBHOOK_URL='https://org-name/webhook.office.com/webhookb2/webhook-id/IncomingWebhook/SNOWFLAKE_WEBHOOK_SECRET'
WEBHOOK_SECRET=analytics.public.gmds_teams_secret
WEBHOOK_BODY_TEMPLATE='{"text": "SNOWFLAKE_WEBHOOK_MESSAGE"}'
WEBHOOK_HEADERS=('Content-Type'='application/json');
Passo 4: inviare la notifica
Per inviare una notifica usiamo la stored procedure nativa SYSTEM$SEND_SNOWFLAKE_NOTIFICATION. È necessario passare alla procedura la funzione SANITIZE_WEBHOOK_CONTENT per rimuovere il placeholder (ad esempio SNOWFLAKE_WEBHOOK_SECRET) dal messaggio.
Ecco il codice che ho eseguito nel mio account:
CALL SYSTEM$SEND_SNOWFLAKE_NOTIFICATION(
SNOWFLAKE.NOTIFICATION.TEXT_PLAIN(
SNOWFLAKE.NOTIFICATION.SANITIZE_WEBHOOK_CONTENT('This is a test Teams Alert from my Snowflake Account')
),
SNOWFLAKE.NOTIFICATION.INTEGRATION('gmds_teams_webhook_integration')
);
La notifica è arrivata su Microsoft Teams all'istante!
Ora che abbiamo gli ingranaggi di base al loro posto, passiamo a un esempio concreto.
Esempio di alert: notifica quando l'utilizzo di un warehouse va in picco
Scrivere una query SQL per individuare i picchi di utilizzo del warehouse e incapsularla in un task serverless
La query che segue confronta l'utilizzo recente (ultima ora completata) con la media oraria di utilizzo di ciascun warehouse nell'ultimo mese. In questo caso segnaleremo i warehouse con un aumento di utilizzo del 50%.
Usiamo un task serverless perché ci farà risparmiare! Basta omettere il nome del warehouse per rendere il task serverless.
A scopo dimostrativo, aggiungerò in union un record fittizio per garantire che ogni esecuzione del task produca una riga e un alert.
CREATE OR REPLACE TASK monitor_warehouse_spikes
SCHEDULE = 'USING CRON 2 * * * * America/New_York'
SERVERLESS_TASK_MIN_STATEMENT_SIZE = 'XSMALL'
SERVERLESS_TASK_MAX_STATEMENT_SIZE = 'XSMALL'
as
insert into usage_spike_alerts (warehouse_name,last_hour_credits,avg_monthly_credits,credit_diff,percent_increase)
WITH last_hour_usage AS (
SELECT
warehouse_name,
sum(credits_used) AS last_hour_credits
FROM
snowflake.account_usage.warehouse_metering_history
WHERE
start_time >= DATEADD(hour, -2, CURRENT_TIMESTAMP)
AND end_time <= CURRENT_TIMESTAMP
Espandi codice
SCHEDULE = 'USING CRON 2 * * * * America/New_York' significa 2 minuti dopo ogni ora di ogni giorno.
Creare una tabella per salvare i risultati della query
CREATE or replace TABLE usage_spike_alerts (
alert_id INT AUTOINCREMENT PRIMARY KEY,
warehouse_name STRING NOT NULL,
last_hour_credits FLOAT NOT NULL,
avg_monthly_credits FLOAT NOT NULL,
credit_diff FLOAT NOT NULL,
percent_increase FLOAT NOT NULL,
inserted_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
alert_sent boolean default false
);
Notate che questa tabella ha alcune colonne di supporto con valori di default che non compaiono nei risultati della query:
- alert_id: chiave primaria
- inserted_at: indica quando il task ha inserito il record.
- alert_sent: inizialmente false, viene impostato a true dopo l'invio dell'alert.
Testare il task e verificare i risultati
execute task monitor_warehouse_spikes;
select * from usage_spike_alerts where not alert_sent;
Creare una procedura per inviare l'alert in caso di picco
Vogliamo fare quanto segue:
- Controllare la tabella
usage_spike_alertsalla ricerca di record non ancora inviati:alert_sent==false - Se ci sono record non inviati, recapitarli su Microsoft Teams.
- Contrassegnare il record come inviato.
- Stampare il numero di alert inviati nella console SQL.
CREATE OR REPLACE PROCEDURE send_usage_spike_alerts()
RETURNS STRING
LANGUAGE PYTHON
RUNTIME_VERSION = '3.8'
PACKAGES = ('snowflake-snowpark-python')
HANDLER = 'send_alerts'
AS $$
import snowflake.snowpark as snowpark
def send_alerts(session):
query = """
SELECT warehouse_name, last_hour_credits, avg_monthly_credits, credit_diff, percent_increase
FROM usage_spike_alerts
WHERE alert_sent = FALSE
"""
Espandi codice
Testare la procedura manualmente
Abbiamo già inserito una riga di test nella tabella "spikes". Eseguiamo la stored procedure e verifichiamo che:
- I record vengano aggiornati a
alert_sent==true - Riceviamo il messaggio su Microsoft Teams
execute task monitor_warehouse_spikes; -- se non l'hai già fatto...
select * from usage_spike_alerts where not alert_sent; -- controllalo, sent = false
CALL send_usage_spike_alerts(); -- invia l'alert
-- attendi l'arrivo dell'alert
select * from usage_spike_alerts where not alert_sent; -- 0 righe
Dovreste aver ricevuto un alert in Teams!
Mettere a punto la formattazione dell'alert può essere un po' noioso. Vi invito a sperimentare con il codice Python per inviare l'alert in un formato più gradevole e a raccontarci come ci siete riusciti!
Concatenare il task e la procedura
Vogliamo che la pianificazione oraria del task monitor_warehouse_spikes gestisca l'intero processo end-to-end: assicuriamoci che, dopo l'esecuzione del task monitor_warehouse_spikes, parta anche la procedura che invia l'alert.
Prima cosa, incapsuliamo la procedura in un task serverless e attiviamolo:
CREATE TASK send_usage_spike_alerts_task
AS
CALL send_usage_spike_alerts();
alter task send_usage_spike_alerts_task resume;
Poi concateniamo i task:
ALTER TASK send_usage_spike_alerts_task
ADD AFTER monitor_warehouse_spikes;
Proviamo:
1execute task monitor_warehouse_spikes;
Questo task dovrebbe ora aggiungere i nuovi record alla tabella e inviare gli alert a Teams!
Chiamando direttamente la procedura send_usage_spike_alerts(), il messaggio compare su Microsoft Teams immediatamente. Concatenando invece send_usage_spike_alerts_task al task monitor_warehouse_spikes, l'alert può impiegare fino a 3 minuti per arrivare.
In conclusione
Inviare gli alert di Snowflake su Microsoft Teams è incredibilmente utile. I casi d'uso per questo tipo di alerting sono infiniti!
Con questo articolo avete imparato a:
- Creare un Webhook in Microsoft Teams.
- Creare un Secret in Snowflake.
- Creare una Webhook Integration in Snowflake.
- Creare un task per registrare i picchi di utilizzo del warehouse.
- Creare una procedura per inviare alert al verificarsi di una condizione, in questo caso la presenza di righe in una query.
- Incapsulare una procedura in un task.
- Concatenare i task tra loro.
Non vedo l'ora di scoprire i casi d'uso che inventerete! 🥂
Jeff è un Data and Analytics Consultant con oltre 15 anni di esperienza nell'automazione degli insight e nell'uso dei dati per governare i processi aziendali. Sul fronte tecnologico è specializzato in Snowflake + dbt + Tableau. Sul fronte dei settori, ha esperienza in Public Utility, Sperimentazioni Cliniche, Editoria, CPG e Manifatturiero. Per qualsiasi domanda, scrivetegli a [email protected].