Maison >développement back-end >Tutoriel Python >Automatisez les notifications Slack avec des graphiques à l'aide des fonctions Cloud Run et de Cloud Scheduler
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.
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"
Créez un fichier exigences.txt et incluez les dépendances suivantes :
functions-framework==3.* google-cloud-bigquery matplotlib slack_sdk pytz
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 :
Utilisez Cloud Scheduler pour automatiser l'exécution de la fonction tous les lundis à 10h00 (JST). Voici un exemple de configuration :
Pour activer votre fonction Cloud Run afin d'envoyer des notifications Slack, procédez comme suit :
Une fois que tout est configuré, votre chaîne Slack recevra une notification hebdomadaire avec un graphique comme celui-ci :
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!