Tutoriel : Envoyer un message Slack

Dans ce tutoriel, vous allez créer un opérateur UDF SQL pour Lakeflow Designer qui publie des messages sur des canaux Slack. Pour un aperçu plus large, voir Opérateurs personnalisés dans Lakeflow Designer.

Vue d’ensemble

Cet opérateur envoie des messages à Slack à l’aide de :

  • SQL UDF : écrit dans SQL plutôt que Python.
  • Connexion HTTP du catalogue Unity : gère en toute sécurité les informations d’identification de l’API Slack.
  • Prise en charge du mode préversion : empêche les appels réels de l’API Slack pendant la préversion du flux de travail.
  • Paramètres d’expression : autorise le contenu de message dynamique à partir de colonnes DataFrame.

Pourquoi utiliser une fonction UDF SQL

Les UDF SQL peuvent appeler des API externes (comme Slack, les points de terminaison REST et les webhooks) avec cette http_request() fonction, qui s’authentifie via une connexion HTTP du catalogue Unity. La connexion stocke les identifiants, donc ils restent hors du code de fonction. Pour appeler une API depuis Python à la place, utilisez un python-run-function opérateur. Voir Tutoriel : opérateur d’expéditeur d’e-mail Gmail.

Requirements

Étape 1 : Configurer la connexion HTTP du catalogue Unity

Avant de créer la fonction UDF, vous devez configurer une connexion HTTP du catalogue Unity pour stocker en toute sécurité vos informations d’identification d’API Slack. Remplacez <xoxb-your-slack-bot-token> par votre jeton de bot Slack réel. Vous pouvez l’obtenir à partir de vos paramètres d’application Slack. Vous pouvez utiliser cette même connexion dans plusieurs fonctions définies par l’utilisateur. Pour plus d’informations, consultez Se connecter aux services HTTP externes.

CREATE CONNECTION my_slack_connection TYPE HTTP OPTIONS (
  host 'https://slack.com',
  port '443',
  base_path '/api/',
  bearer_token '<xoxb-your-slack-bot-token>'
);

Étape 2 : Créer l’opérateur YAML

À présent, créez le YAML pour l’opérateur. Pour plus de détails sur le schéma, voir référence YAML de l’opérateur personnalisé.

Le YAML pour cet opérateur inclut :

  • Paramètre d’expression (msg) : autorise le contenu de message dynamique à partir de colonnes de trame de données.
  • Paramètre de chaîne (channel) : nom/ID de canal statique.
  • Mode préversion (is_preview) : propriété de configuration avec format: is_preview laquelle permet le mode d’aperçu pour empêcher les appels d’API réels pendant le test.
schema: custom-operator-v0.1.0
type: uc-udf
name: Send Slack Message
id: send_msg
version: '1.0.0'
description: Send Slack Message to a Channel
config:
  type: object
  properties:
    msg:
      type: string
      format: expression
      title: Message
      examples:
        - 'Select message column or expression'
      x-ui:
        widget: expression
        port: input_data
    channel:
      type: string
      title: Channel
      x-ui:
        widget: input
    is_preview:
      type: boolean
      format: is_preview
      default: false
  required:
    - msg
    - channel
  additionalProperties: false
ports:
  input:
    - name: input_data
      title: Input Data
  output:
    - name: output
      title: Send Response Data

Cela inclut les éléments suivants :

Clé de configuration Widget Purpose
msg expression Contenu de message dynamique à partir de données d’entrée.
channel input Canal Slack à envoyer (par exemple, #alerts).
is_preview n/a Une propriété de configuration booléenne avec format: is_preview, qui permet à l’opérateur de se comporter différemment lors d’une prévisualisation (dans ce cas, sans créer réellement de message Slack).

Étape 3 : Créer la fonction Catalogue Unity

Lors de la création de fonctions SQL définies par l’utilisateur, certains aspects sont peu courants par rapport à la plupart des requêtes SQL :

  • Utilisez la RETURN syntaxe au lieu de AS $$.
  • Incorporer la configuration YAML dans un bloc de commentaires SQL (/* ... */).
  • Peut utiliser la fonction http_request pour effectuer des appels d’API.

L’exemple crée la fonction dans main.example_output. Créez d’abord le schéma s’il n’existe pas :

CREATE SCHEMA IF NOT EXISTS main.example_output
CREATE OR REPLACE FUNCTION main.example_output.send_slack_msg(
    msg STRING,
    channel STRING,
    is_preview BOOLEAN
)
RETURNS STRING
RETURN (/*
    schema: custom-operator-v0.1.0
    type: uc-udf
    name: Send Slack Message
    id: send_msg
    version: "1.0.0"
    description: Send Slack Message to a Channel
    config:
      type: object
      properties:
        msg:
          type: string
          format: expression
          title: Message
          examples:
            - "Select message column or expression"
          x-ui:
            widget: expression
            port: input_data
        channel:
          type: string
          title: Channel
          x-ui:
            widget: input
        is_preview:
          type: boolean
          format: is_preview
          default: false
      required:
        - msg
        - channel
      additionalProperties: false
    ports:
      input:
        - name: input_data
          title: Input Data
      output:
        - name: output
          title: Send Response Data
    */
  CASE
    WHEN NOT is_preview THEN
      http_request(
        conn => 'my_slack_connection',
        method => 'POST',
        path => 'chat.postMessage',
        json => to_json(named_struct('channel', channel, 'text', msg)),
        headers => map('Content-Type', 'application/json;charset=utf-8')
      ).text
    ELSE 'Preview mode - no message sent to ' || channel
  END
);

Cette fonction SQL inclut les fonctionnalités suivantes :

Fonctionnalité Purpose
http_request() Effectue des appels HTTP aux API externes.
conn => 'my_slack_connection' Fait référence à la connexion UC pour l’authentification.
to_json() et named_struct() Construit la charge utile JSON pour l’API Slack.
Bloc de commentaires YAML Utilisé par Lakeflow Designer pour créer l’opérateur.
CASE WHEN Implémente la logique du mode d’aperçu.

Étape 4 : Tester la fonction

Ensuite, testez la fonction pour vous assurer qu’elle fonctionne avant de l’inscrire en tant qu’opérateur.

Testez d’abord en mode aperçu pour qu’aucun message ne soit envoyé. Elle retourne Preview mode - no message sent to #test-channel.

SELECT main.example_output.send_slack_msg(
  msg => 'Hello from Lakeflow Designer!',
  channel => '#test-channel',
  is_preview => true
) AS result;

Testez avec un appel API réel pour envoyer un message à Slack. Utilisez cela avec prudence : il publie sur le canal et renvoie le JSON de réponse de l’API Slack.

SELECT main.example_output.send_slack_msg(
  msg => 'Hello from Lakeflow Designer!',
  channel => '#test-channel',
  is_preview => false
) AS result;

Étape 5 : Inscrire l’opérateur

Ajoutez l’opérateur au fichier .custom_operators.yaml :

operators:
  - catalog: main
    schema: example_output
    functionName: send_slack_msg

Note

Si vous définissez ce fichier dans votre dossier utilisateur, il s’affiche uniquement pour vous. Pour plus d’informations, consultez Inscrire et déployer votre opérateur chez Lakeflow Designer.

Étape 6 : Configurer les autorisations

Pour les fonctions SQL définies par l’utilisateur qui utilisent des connexions Unity Catalog, les utilisateurs ont besoin d’une autorisation supplémentaire :

GRANT USE SCHEMA ON SCHEMA main.example_output TO `<user>`;
GRANT EXECUTE ON FUNCTION main.example_output.send_slack_msg TO `<user>`;
GRANT USE CONNECTION ON CONNECTION my_slack_connection TO `<user>`;

Important

Sans autorisation USE CONNECTION , les utilisateurs ne pourront pas effectuer d’appels d’API même s’ils peuvent exécuter la fonction.

Étape 7 : Utilisez l’opérateur dans Lakeflow Designer

  1. Dans une préparation visuelle des données, ouvrez le menu Opérateurs dans le panneau de gauche et trouvez l’opérateur Envoyer un message Slack.
  2. Faites glisser l’opérateur sur la toile et y connectez une entrée.
  3. Double-cliquez sur l’opérateur pour ouvrir son panneau de configuration, puis définissez ses champs.
  4. Sélectionnez l’opérateur pour prévisualiser ses résultats dans le panneau de sortie.

L’opérateur a :

  • Port d’entrée pour connecter votre source de données.
  • Sélecteur d’expressions pour sélectionner la colonne qui contient le contenu du message.
  • Entrée de texte pour le canal Slack.

Les utilisateurs peuvent envoyer des notifications en fonction de leurs données. Par exemple, l’alerte lorsque certains seuils sont dépassés.

Conseils et bonnes pratiques

Utilisez les exemples et directives suivants lorsque vous construisez des opérateurs qui appellent des API externes.

Cas d’usage courants

  • Alertes : envoyer des notifications lorsque des problèmes de qualité des données sont détectés.
  • Notifications : informez les équipes lorsque les flux de travail sont terminés.
  • Webhooks : appelez des API externes pour déclencher des processus en aval.
  • Journalisation : envoyer des messages d’audit à des systèmes externes.

Meilleures pratiques pour la création d’opérateurs d’appel d’API

  1. Utilisez toujours le mode d’aperçu : ajoutez une is_preview propriété de configuration avec format: is_preview pour empêcher les appels d’API accidentels.
  2. Utilisez les connexions du catalogue Unity : ne jamais coder en dur les informations d’identification dans votre UDF. Stockez-les dans une connexion HTTP Unity Catalog et appelez-la avec http_request().
  3. Gérer correctement les erreurs : les appels d’API peuvent échouer ; considérez ce qu’il faut retourner en cas d’erreur.
  4. Testez soigneusement : utilisez le mode d’aperçu pendant le développement.
  5. Documentez la configuration de la connexion : les utilisateurs doivent savoir quelle connexion créer.

Ressources supplémentaires