SELECTSELECT

SELECT

Inviare alert a MS Teams da Snowflake

By Jeff SkoldbergFeb 5, 20256 min read

Questa pagina è disponibile anche in English, Deutsch, Español, Français, 日本語 e Português.

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".

Inviare alert a MS Teams da Snowflake

Aprite la scheda Impostazioni, sezione Connettori, e cliccate su Modifica.

Inviare alert a MS Teams da Snowflake

Vi apparirà l'elenco dei Connettori. Cercate "Webhook" e cliccate su "Aggiungi".

Inviare alert a MS Teams da Snowflake

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".

Inviare alert a MS Teams da Snowflake

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.

Inviare alert a MS Teams da Snowflake

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!

Inviare alert a MS Teams da Snowflake

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!

Inviare alert a MS Teams da Snowflake

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;

Inviare alert a MS Teams da Snowflake

Creare una procedura per inviare l'alert in caso di picco

Vogliamo fare quanto segue:

  • Controllare la tabella usage_spike_alerts alla 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!

Inviare alert a MS Teams da Snowflake

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].