Maison >développement back-end >Tutoriel Python >Automatisez les notifications Slack avec des graphiques à l'aide des fonctions Cloud Run et de Cloud Scheduler

Automatisez les notifications Slack avec des graphiques à l'aide des fonctions Cloud Run et de Cloud Scheduler

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-11 04:47:09789parcourir

J'ai récemment construit un système pour automatiser les notifications Slack avec des graphiques qui visualisent le nombre de sessions des 7 derniers jours. Ceci a été réalisé en combinant les fonctions Cloud Run pour le traitement des données et la génération de graphiques, ainsi que Cloud Scheduler pour planifier l'exécution.

Aperçu de la mise en œuvre

Fonction d'exécution dans le cloud

La fonction Cloud Run interroge BigQuery pour récupérer les données de session, utilise Matplotlib pour créer un graphique linéaire, puis envoie le graphique à Slack via l'API Slack. Les étapes suivantes décrivent le processus de configuration.

Voici le code de main.py. Avant d'exécuter, vous devez définir SLACK_API_TOKEN et SLACK_CHANNEL_ID comme variables d'environnement. Vous pouvez les laisser vides pour le moment, car nous les configurerons plus tard.

import os
import matplotlib.pyplot as plt
from google.cloud import bigquery
from datetime import datetime, timedelta
import io
import pytz
from slack_sdk import WebClient
from slack_sdk.errors import SlackApiError

def create_weekly_total_sessions_chart(_):
    SLACK_TOKEN = os.environ.get('SLACK_API_TOKEN')
    SLACK_CHANNEL_ID = os.environ.get('SLACK_CHANNEL_ID')

    client = bigquery.Client()

    # Calculate the date range for the last 7 days
    jst = pytz.timezone('Asia/Tokyo')
    today = datetime.now(jst)
    start_date = (today - timedelta(days=7)).strftime('%Y-%m-%d')
    end_date = (today - timedelta(days=1)).strftime('%Y-%m-%d')

    query = f"""
        SELECT 
            DATE(created_at) AS date,
            COUNT(DISTINCT session_id) AS unique_sessions
        FROM `<project>.<dataset>.summary_all`
        WHERE created_at BETWEEN '{start_date} 00:00:00' AND '{end_date} 23:59:59'
        GROUP BY date
        ORDER BY date;
    """

    query_job = client.query(query)
    results = query_job.result()

    # Prepare data for the graph
    dates = []
    session_counts = []
    for row in results:
        dates.append(row['date'].strftime('%Y-%m-%d'))
        session_counts.append(row['unique_sessions'])

    # Generate the graph
    plt.figure()
    plt.plot(dates, session_counts, marker='o')
    plt.title('Unique Session Counts (Last 7 Days)')
    plt.xlabel('Date')
    plt.ylabel('Unique Sessions')
    plt.xticks(rotation=45)
    plt.tight_layout()

    # Save the graph as an image
    image_binary = io.BytesIO()
    plt.savefig(image_binary, format='png')
    image_binary.seek(0)

    # Send the graph to Slack
    client = WebClient(token=SLACK_TOKEN)
    try:
        response = client.files_upload_v2(
            channel=SLACK_CHANNEL_ID,
            file_uploads=[{
                "file": image_binary,
                "filename": "unique_sessions.png",
                "title": "Unique Session Counts (Last 7 Days)"
            }],
            initial_comment="Here are the session counts for the last 7 days!"
        )
    except SlackApiError as e:
        return f"Error uploading file: {e.response['error']}"

    return "Success"

Dépendances

Créez un fichier exigences.txt et incluez les dépendances suivantes :

functions-framework==3.*
google-cloud-bigquery
matplotlib
slack_sdk
pytz

Accorder l'accès à la fonction Cloud Run

Pour permettre à Cloud Scheduler ou à d'autres services d'appeler votre fonction Cloud Run, vous devez attribuer le rôle rôles/run.invoker à l'entité appropriée. Utilisez la commande suivante pour ce faire :

gcloud functions add-invoker-policy-binding create-weekly-total-sessions-chart \
      --region="asia-northeast1" \
      --member="MEMBER_NAME"

Remplacez MEMBER_NAME par l'un des éléments suivants :

  • Un compte de service pour Cloud Scheduler : serviceAccount :scheduler-account@example.iam.gserviceaccount.com
  • Pour un accès public (non recommandé) : tous les utilisateurs

Configuration du planificateur cloud

Utilisez Cloud Scheduler pour automatiser l'exécution de la fonction tous les lundis à 10h00 (JST). Voici un exemple de configuration :

Automate Slack Notifications with Graphs Using Cloud Run Functions and Cloud Scheduler

Configuration de l'API Slack

Pour activer votre fonction Cloud Run afin d'envoyer des notifications Slack, procédez comme suit :

  1. Accédez à l'API Slack et créez une nouvelle application.
  2. Attribuez les étendues de jeton de robot suivantes sous OAuth et autorisations :
    • chaînes :lire
    • chat:écrire
    • fichiers :écrire

Automate Slack Notifications with Graphs Using Cloud Run Functions and Cloud Scheduler

  1. Installez l'application sur votre espace de travail Slack et copiez le Jeton OAuth de l'utilisateur du robot.

Automate Slack Notifications with Graphs Using Cloud Run Functions and Cloud Scheduler

  1. Ajoutez l'application à la chaîne Slack sur laquelle vous souhaitez publier des notifications.

Automate Slack Notifications with Graphs Using Cloud Run Functions and Cloud Scheduler

  1. Copiez l'ID du canal et collez-le, avec le jeton du bot, dans les variables d'environnement SLACK_CHANNEL_ID et SLACK_API_TOKEN pour votre fonction Cloud Run.

Automate Slack Notifications with Graphs Using Cloud Run Functions and Cloud Scheduler

Résultat final

Une fois que tout est configuré, votre chaîne Slack recevra une notification hebdomadaire avec un graphique comme celui-ci :

Automate Slack Notifications with Graphs Using Cloud Run Functions and Cloud Scheduler

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn