SELECTSELECT

SELECT

Envía alertas a MS Teams desde Snowflake

By Jeff SkoldbergFeb 5, 20256 min read

Esta página también está disponible en English, Deutsch, Français, Italiano, 日本語 y Português.

Snowflake amplió hace poco sus capacidades de alertas y ahora permite enviarlas por correo electrónico o Webhook. Las alertas vía Webhook son muy potentes, porque abren la puerta a enviar notificaciones a Slack o Microsoft Teams. Esto resulta útil en una variedad de escenarios, como alertas por fallos en pipelines o alertas basadas en datos.

En este artículo encontrarás una guía paso a paso para configurar alertas de Snowflake en Microsoft Teams.

Quickstart

Paso 1: Crea un Webhook en Teams

Dentro de Teams, crea un canal nuevo o ve al canal donde quieres que lleguen las alertas.

En la esquina superior derecha del canal, haz clic en los 3 puntos y luego en "Administrar canal".

Envía alertas a MS Teams desde Snowflake

Ve a la pestaña Configuración, sección Conectores, y haz clic en Editar.

Envía alertas a MS Teams desde Snowflake

Aparecerá un listado de Conectores. Busca "Webhook" y haz clic en "Agregar".

Envía alertas a MS Teams desde Snowflake

En la siguiente pantalla puedes subir una imagen para el webhook. Yo voy a usar un buen logo de Snowflake. No olvides ponerle nombre al webhook y haz clic en "Crear".

Envía alertas a MS Teams desde Snowflake

Al hacer clic en "Crear" se mostrará la URL del webhook. Esa URL contiene tu secret, así que manéjala con cuidado. Por ahora, cópiala y pégala en un bloc de notas.

Envía alertas a MS Teams desde Snowflake

Prueba el Webhook

Puedes usar este comando CURL para probar el webhook. Si estás en Windows, usa Git Bash.

curl -X POST https://paste-your-url-with-secret-here \
-H "Content-Type: application/json" \
-d '{"text": "Hello, world"}'

Casi al instante deberías ver el mensaje "Hello, world" en tu canal de Teams.

¡Listo, tu nuevo Webhook ya funciona!

Envía alertas a MS Teams desde Snowflake

Paso 2: Crea el Secret en Snowflake

La URL del Webhook contiene un secret. Reemplaza la cadena del secret de abajo por la tuya y ejecuta este comando en Snowflake.

Recuerda: los secrets son objetos a nivel de schema. Presta atención al contexto de database y schema de tu worksheet, o usa nombres totalmente calificados.

En mi caso, creé un secret llamado gmds_teams_secret en el schema public de la database analytics.

use schmea <database>.<schema>;

CREATE OR REPLACE SECRET gmds_teams_secret
  TYPE = GENERIC_STRING
  SECRET_STRING = 'this-is-the-secret';

Para que quede claro, el secret es la última parte de la URI que se muestra aquí: https://org-name.webhook.office.com/webhookb2/webhook-id/IncomingWebhook/this-is-the-secret

Paso 3: Crea una notification integration con webhook

Ya que creamos el secret, vamos a crear la 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');

Paso 4: Envía la notificación

Para enviar una notificación usamos el stored procedure integrado SYSTEM$SEND_SNOWFLAKE_NOTIFICATION. Hay que pasarle la función SANITIZE_WEBHOOK_CONTENT al procedimiento para eliminar el placeholder (es decir, SNOWFLAKE_WEBHOOK_SECRET) del mensaje.

Este es el código que ejecuté en mi cuenta:

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 notificación llegó a Microsoft Teams al instante!

Envía alertas a MS Teams desde Snowflake

Ya tenemos las piezas básicas en su lugar; pasemos a un ejemplo real.

Ejemplo de alertas: envía una alerta cuando el uso del warehouse se dispara

Arma una consulta SQL para detectar picos de uso del warehouse y envuélvela en un task serverless

La siguiente consulta compara el uso reciente (la última hora completada) contra el uso promedio por hora de cada warehouse durante el último mes. En este caso, marcaremos los warehouses cuyo uso haya aumentado un 50%.

Usamos un task serverless porque nos ahorra dinero. Basta con omitir el nombre del warehouse para que el task sea serverless.

A modo de ejemplo, voy a hacer un union con un registro ficticio para garantizar que cada ejecución del task produzca una fila y dispare una alerta.

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

Expandir código

SCHEDULE = 'USING CRON 2 * * * * America/New_York' significa 2 minutos después de cada hora, todos los días.

Crea una tabla para almacenar los resultados de la consulta

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
);

Ten en cuenta que esta tabla incluye algunas columnas auxiliares con valores por defecto que no provienen de los resultados de la consulta:

  • alert_id: clave primaria
  • inserted_at: nos permite saber cuándo el task insertó el registro.
  • alert_sent: arranca en false y pasa a true después de enviar la alerta.

Prueba el task y revisa los resultados

execute task monitor_warehouse_spikes;
select * from usage_spike_alerts where not alert_sent;

Envía alertas a MS Teams desde Snowflake

Crea un procedimiento que envíe la alerta si hay un pico

Esto es lo que queremos hacer:

  • Revisar la tabla usage_spike_alerts en busca de registros sin enviar: alert_sent==false
  • Si hay registros pendientes, mandarlos a Microsoft Teams.
  • Marcar el registro como enviado.
  • Mostrar la cantidad de alertas enviadas en la consola 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
    """

Expandir código

Prueba el procedimiento manualmente

Ya insertamos una fila de prueba en la tabla "spikes". Ejecutemos el sproc y comprobemos que:

  • Los registros se actualicen a alert_sent==true
  • Recibamos el mensaje en Microsoft Teams
execute task monitor_warehouse_spikes;  -- si aún no lo hiciste...
select * from usage_spike_alerts where not alert_sent; -- revísalo, sent = false
CALL send_usage_spike_alerts(); -- envía la alerta
-- espera a que llegue la alerta
select * from usage_spike_alerts where not alert_sent; -- 0 filas

¡Deberías haber recibido una alerta en Teams!

Envía alertas a MS Teams desde Snowflake

Darle formato a la alerta puede ser un poco tedioso. Te animo a experimentar con el código en Python para enviarla con un formato más vistoso. ¡Cuéntanos cómo te fue!

Encadena el task y el procedimiento

Queremos que la programación horaria del task monitor_warehouse_spikes se encargue del proceso de punta a punta; asegurémonos de que, después de ejecutar el task monitor_warehouse_spikes, también se ejecute el procedimiento que envía la alerta.

Primero, envuelve el procedimiento en un task serverless y actívalo:

CREATE TASK send_usage_spike_alerts_task
AS
CALL send_usage_spike_alerts();

alter task send_usage_spike_alerts_task resume;

Después, encadena los tasks:

ALTER TASK send_usage_spike_alerts_task
ADD AFTER monitor_warehouse_spikes;

Pruébalo:

1execute task monitor_warehouse_spikes;

¡Ahora este task debería agregar los nuevos registros a la tabla y enviar la(s) alerta(s) a Teams!

Cuando llamas al procedimiento send_usage_spike_alerts() directamente, el mensaje aparece en Microsoft Teams al instante. Al encadenar el task send_usage_spike_alerts_task con monitor_warehouse_spikes, la alerta puede tardar hasta 3 minutos en llegar.

Para cerrar

Enviar alertas de Snowflake a Microsoft Teams es de una utilidad enorme. ¡Los casos de uso para este tipo de alertas son infinitos!

Con este artículo ya sabes cómo:

  • Crear un Webhook en Microsoft Teams.
  • Crear un Secret en Snowflake.
  • Crear una Webhook Integration en Snowflake.
  • Crear un task para registrar picos de uso del warehouse.
  • Crear un procedimiento que envía alertas según una condición. En este caso, la existencia de filas en una consulta.
  • Envolver un procedimiento dentro de un task.
  • Encadenar varios tasks.

¡Tengo muchas ganas de conocer los casos de uso que se te ocurran! 🥂

Jeff es consultor de Datos y Analítica con más de 15 años de experiencia automatizando insights y aprovechando los datos para controlar procesos de negocio. En lo tecnológico, se especializa en Snowflake + dbt + Tableau. En lo sectorial, ha trabajado en Servicios Públicos, Ensayos Clínicos, Publishing, CPG y Manufactura. Escríbele cuando quieras a [email protected].