Baru-baru ini saya membina sistem untuk mengautomasikan pemberitahuan Slack dengan graf yang menggambarkan kiraan sesi selama 7 hari yang lalu. Ini dicapai menggunakan gabungan fungsi Cloud Run untuk pemprosesan data dan penjanaan graf serta Cloud Scheduler untuk menjadualkan pelaksanaan.
Fungsi Cloud Run menanyakan BigQuery untuk mengambil data sesi, menggunakan Matplotlib untuk membuat carta garisan dan kemudian menghantar carta kepada Slack melalui API Slack. Langkah berikut menggariskan proses persediaan.
Berikut ialah kod untuk main.py. Sebelum menjalankan, anda perlu menetapkan SLACK_API_TOKEN dan SLACK_CHANNEL_ID sebagai pembolehubah persekitaran. Anda boleh membiarkannya kosong buat masa ini, kerana kami akan menyediakannya kemudian.
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"
Buat fail requirements.txt dan sertakan kebergantungan berikut:
functions-framework==3.* google-cloud-bigquery matplotlib slack_sdk pytz
Untuk membenarkan Cloud Scheduler atau perkhidmatan lain menggunakan fungsi Cloud Run anda, anda perlu menetapkan peranan roles/run.invoker kepada entiti yang sesuai. Gunakan arahan berikut untuk melakukan ini:
gcloud functions add-invoker-policy-binding create-weekly-total-sessions-chart \ --region="asia-northeast1" \ --member="MEMBER_NAME"
Ganti MEMBER_NAME dengan salah satu daripada yang berikut:
Gunakan Penjadual Awan untuk mengautomasikan pelaksanaan fungsi setiap hari Isnin pada 10:00 PG (JST). Berikut ialah contoh konfigurasi:
Untuk mendayakan fungsi Cloud Run anda menghantar pemberitahuan Slack, ikut langkah berikut:
Setelah semuanya disediakan, saluran Slack anda akan menerima pemberitahuan mingguan dengan graf seperti ini:
Atas ialah kandungan terperinci Automatikkan Pemberitahuan Slack dengan Graf Menggunakan Fungsi Cloud Run dan Cloud Scheduler. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!