•8 min read

Kho dữ liệu phân tích Serverless với BigQuery & Cloud Run: Từ luồng GA4 đến cảnh báo SEO tự động

Kho dữ liệu phân tích Serverless với BigQuery & Cloud Run: Từ luồng GA4 đến cảnh báo SEO tự động

Việc vận hành một blog kỹ thuật hoặc sản phẩm SaaS có lượng truy cập cao thường khiến bạn phải đối mặt với hai lựa chọn phân tích không tối ưu: hoặc trả hơn 200 đô la/tháng cho các nền tảng quan sát nặng nề, hoặc nhấp chuột thủ công trong giao diện khó hiểu của Google Analytics 4 để cố gắng giải mã xem bài đăng nào đang mất thứ hạng.

Có một cách thứ ba vượt trội, đã được chứng minh trong thực tế sản xuất: truyền trực tiếp các sự kiện thô của Google Analytics 4 vào BigQuery, chạy các phép biến đổi theo lịch trình hàng ngày vào các kho dữ liệu phân tích sạch, và kích hoạt một tác vụ Cloud Run phi máy chủ để tính toán các bất thường về CTR và gửi cảnh báo SEO có thể hành động trực tiếp đến Slack hoặc Telegram của bạn.

Tuyệt vời nhất là: vì BigQuery cung cấp 1 TB xử lý truy vấn và 10 GB lưu trữ miễn phí mỗi tháng, và Cloud Run Jobs chỉ tính phí khi thực thi (với 0 chi phí nhàn rỗi), toàn bộ quy trình sản xuất này có chi phí 0,00 đô la/tháng sau khi giai đoạn chạy thử trên đám mây của bạn kết thúc.

Audio Briefing
0:00 / 0:00
Interactive Dev Tool
100% Client-Side & Private

BigQuery Query Cost & Slot Estimator

Estimate on-demand TB pricing & compute slots before querying

Calculate BigQuery query costs across regions, partition pruning savings, and slot-hour commitments before running expensive analytical warehouse queries.

GCP CloudTB PricingPartition PruningBudget Guard

1. Kiến trúc đường ống đầu cuối

Thay vì lưu trữ một phiên bản PostgreSQL hoặc ClickHouse luôn bật và phát sinh phí VM hàng giờ, kiến trúc này tách biệt hoàn toàn tính toán khỏi lưu trữ:

┌─────────────────┐       ┌─────────────────┐       ┌─────────────────────┐
│  Web / App      │       │ Google Analytics│       │ BigQuery Raw Stream │
│  (Next.js Blog) ├──────►│ 4 (GA4 Events)  ├──────►│ `analytics_xxxxxxx` │
└─────────────────┘       └─────────────────┘       │ (Partitioned Tables)│
                                                    └──────────┬──────────┘
                                                               │
                                                 Daily Scheduled Query / View
                                                               │
                                                               ▼
┌─────────────────┐       ┌─────────────────┐       ┌─────────────────────┐
│  Telegram /     │       │ Cloud Run Job   │       │ Curated Mart:       │
│  Slack Alert    │◄──────┤ (Fast Python    │◄──────┤ `daily_seo_dropoffs`│
│  (Actionable)   │       │  Anomaly Worker)│       │ (Summary Table)     │
└─────────────────┘       └─────────────────┘       └─────────────────────┘

Các thành phần chính:

  1. Xuất GA4 Native BigQuery: Google cung cấp tính năng xuất liên tục và xuất hàng ngày từ GA4 sang BigQuery một cách tự nhiên, không cần mã.
  2. Bảng được phân vùng & phân cụm: Các bảng BigQuery được phân vùng theo _PARTITIONDATE và phân cụm theo page_path để tránh các lần quét toàn bộ bảng tốn kém.
  3. Chế độ xem tổng hợp hàng ngày: Tính toán các chỉ số như người dùng hoạt động, các trang hiển thị 0 nhấp chuột và tỷ lệ thoát.
  4. Cloud Run Job (min-instances=0): Được khởi chạy một lần mỗi ngày bởi Cloud Scheduler. Nó truy vấn BigQuery, đánh giá các bất thường (ví dụ: các trang có >500 lượt hiển thị nhưng <1% CTR), đẩy một bản tóm tắt và kết thúc ngay lập tức.

Advertisement

2. Thiết lập xuất GA4 Native sang BigQuery

Trong bảng điều khiển quản trị Google Analytics của bạn:

  1. Truy cập Quản trị → Liên kết sản phẩm → Liên kết BigQuery.
  2. Nhấp vào Liên kết và chọn dự án GCP của bạn (ví dụ: project-cf6c933d-0d23-4aae-af7).
  3. Chọn khu vực đám mây của bạn (chọn asia-southeast1 hoặc us-central1 tùy thuộc vào nơi đặt máy tính của bạn).
  4. Cấu hình luồng dữ liệu:
    • Chọn xuất Hàng ngày (bảng hàng loạt đã được làm sạch hoàn chỉnh).
    • Chọn Truyền trực tuyến (trong vòng vài giây, nếu bạn cần phát hiện bất thường theo thời gian thực).

Thao tác này tạo một tập dữ liệu có tên analytics_<PROPERTY_ID> trong dự án BigQuery của bạn với các bảng có tên events_YYYYMMDD và events_intraday_YYYYMMDD.


3. Mô hình hóa dữ liệu SQL: Mô hình hóa các truy vấn SEO có giá trị cao

Dữ liệu GA4 thô được lồng ghép sâu với các bản ghi lặp lại (ví dụ: event_params.key và event_params.value). Việc truy vấn trực tiếp các sự kiện thô cho mỗi báo cáo sẽ lãng phí hạn mức tính toán.

Đây là phép biến đổi SQL trong sản xuất để bỏ lồng và tạo một bảng tóm tắt được tối ưu hóa:

-- Create or replace curated SEO analytics table
CREATE OR REPLACE TABLE `locionic_analytics.daily_post_performance`
PARTITION BY event_date
CLUSTER BY post_slug, locale AS

WITH raw_events AS (
  SELECT
    PARSE_DATE('%Y%m%d', event_date) AS event_date,
    (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'page_location') AS full_url,
    (SELECT value.int_value FROM UNNEST(event_params) WHERE key = 'ga_session_id') AS session_id,
    user_pseudo_id,
    event_name
  FROM
    `project-cf6c933d-0d23-4aae-af7.analytics_324892182.events_*`
  WHERE
    _TABLE_SUFFIX = FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY))
),

parsed_pages AS (
  SELECT
    event_date,
    user_pseudo_id,
    session_id,
    REGEXP_EXTRACT(full_url, r'https?://[^/]+/([^/]+)/blog/([^/?#]+)') AS locale,
    REGEXP_EXTRACT(full_url, r'https?://[^/]+/[^/]+/blog/([^/?#]+)') AS post_slug
  FROM
    raw_events
  WHERE
    event_name = 'page_view'
    AND full_url LIKE '%/blog/%'
)

SELECT
  event_date,
  post_slug,
  COALESCE(locale, 'en') AS locale,
  COUNT(1) AS total_views,
  COUNT(DISTINCT user_pseudo_id) AS unique_readers,
  COUNT(DISTINCT session_id) AS total_sessions
FROM
  parsed_pages
WHERE
  post_slug IS NOT NULL
GROUP BY
  event_date,
  post_slug,
  locale;

4. Tác vụ phát hiện bất thường của Cloud Run

Thay vì chạy một bảng điều khiển tốn kém, một tác vụ Python nhỏ gọn chạy hàng ngày, tìm các bài đăng có lưu lượng truy cập giảm đột ngột và gửi cảnh báo.

Đây là tập lệnh sản xuất hoàn chỉnh (analyzer.py):

import os
import json
import requests
from google.cloud import bigquery

PROJECT_ID = os.environ.get("GOOGLE_CLOUD_PROJECT", "project-cf6c933d-0d23-4aae-af7")
TELEGRAM_BOT_TOKEN = os.environ.get("TELEGRAM_BOT_TOKEN")
TELEGRAM_CHAT_ID = os.environ.get("TELEGRAM_CHAT_ID")

def run_anomaly_check():
    client = bigquery.Client(project=PROJECT_ID)
    
    # Identify pages where views dropped by >40% compared to 7-day average
    query = """
    WITH seven_day_stats AS (
      SELECT
        post_slug,
        AVG(total_views) AS avg_views_7d
      FROM
        `locionic_analytics.daily_post_performance`
      WHERE
        event_date BETWEEN DATE_SUB(CURRENT_DATE(), INTERVAL 8 DAY) AND DATE_SUB(CURRENT_DATE(), INTERVAL 2 DAY)
      GROUP BY post_slug
      HAVING avg_views_7d >= 10
    ),
    yesterday_stats AS (
      SELECT
        post_slug,
        total_views AS views_yesterday
      FROM
        `locionic_analytics.daily_post_performance`
      WHERE
        event_date = DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY)
    )
    SELECT
      s.post_slug,
      ROUND(s.avg_views_7d, 1) AS avg_7d,
      COALESCE(y.views_yesterday, 0) AS yesterday,
      ROUND(((COALESCE(y.views_yesterday, 0) - s.avg_views_7d) / s.avg_views_7d) * 100, 1) AS pct_change
    FROM
      seven_day_stats s
    LEFT JOIN
      yesterday_stats y ON s.post_slug = y.post_slug
    WHERE
      COALESCE(y.views_yesterday, 0) < (s.avg_views_7d * 0.6)
    ORDER BY
      pct_change ASC;
    """
    
    query_job = client.query(query)
    results = list(query_job.result())
    
    if not results:
        print("No traffic anomalies detected today.")
        return

    lines = ["⚠️ *Locionic SEO Alert: Traffic Drop Detected*"]
    for row in results:
        lines.append(f"• `{row.post_slug}`: {row.yesterday} views vs {row.avg_7d} avg ({row.pct_change}%)")

    message = "\n".join(lines)
    print(message)
    
    if TELEGRAM_BOT_TOKEN and TELEGRAM_CHAT_ID:
        requests.post(
            f"https://api.telegram.org/bot{TELEGRAM_BOT_TOKEN}/sendMessage",
            json={"chat_id": TELEGRAM_CHAT_ID, "text": message, "parse_mode": "Markdown"},
            timeout=10
        )

if __name__ == "__main__":
    run_anomaly_check()

Advertisement

5. Rào chắn chi phí & An toàn khi hủy bỏ

Khi xây dựng trên các khoản tín dụng của Google Cloud, nguy hiểm là để lại các dịch vụ được cung cấp sau khi tín dụng hết hạn. Dưới đây là cách giữ cho đường ống này hoàn toàn miễn phí mãi mãi:

  1. Cloud Run Jobs so với Services:
    • Không bao giờ sử dụng gcloud run deploy với min-instances > 0.
    • Sử dụng gcloud run jobs deploy. Một tác vụ chỉ cấp phát CPU và bộ nhớ chỉ khi thực thi tập lệnh Python của bạn (thường là 15 đến 30 giây), sau đó tự động giảm xuống 0.
  2. Bảo vệ tầng miễn phí của BigQuery:
    • BigQuery bao gồm 10 GB lưu trữ hoạt động và 1 TB dữ liệu truy vấn được xử lý mỗi tháng miễn phí.
    • Đối với một blog kỹ thuật với 1.000 đến 10.000 sự kiện hàng ngày, bạn tiêu thụ ít hơn 100 MB lưu trữ mỗi năm và ít hơn 1 GB quét truy vấn mỗi tháng.
  3. Cắt tỉa phân vùng:
    • Luôn bao gồm WHERE event_date = ... hoặc WHERE _PARTITIONDATE = ... trong các truy vấn của bạn. Nếu không có cắt tỉa phân vùng, BigQuery sẽ quét mọi phân vùng lịch sử, đốt cháy hạn mức truy vấn một cách không cần thiết.

6. Danh sách kiểm tra tóm tắt

Tiêu chíCơ sở dữ liệu truyền thống (Cloud SQL / RDS)Kho dữ liệu phi máy chủ (BigQuery + Cloud Run)
Chi phí nhàn rỗi hàng tháng
Tốn 30-100 đô la/tháng ngay cả khi không có lưu lượng truy cập
0,00 đô la/tháng (được bao gồm trong tầng miễn phí)
Nút thắt cổ chai khi nhập dữ liệu
Yêu cầu điều chỉnh nhóm kết nối
Truyền trực tuyến tự nhiên có thể mở rộng đến hàng triệu sự kiện
Bảo trì
Nâng cấp lưu trữ, vá lỗi hệ điều hành, dọn dẹp
Công cụ phi máy chủ không cần bảo trì
Số phận sau khi hết tín dụng
Chuyển thành các khoản phí hàng tháng định kỳ
Hoạt động 100% trong tầng miễn phí của GCP mãi mãi

Bằng cách kết hợp tính năng truyền trực tuyến GA4 gốc, các kho dữ liệu BigQuery được phân vùng và các tác vụ Cloud Run dựa trên sự kiện, bạn tạo ra một công cụ phân tích cấp doanh nghiệp tự động giám sát thứ hạng tìm kiếm của bạn mà không tốn một xu nào.

Share this article:

Stay Updated

Get the latest posts delivered straight to your inbox.

Free Developer Utilities

Free In-Browser Developer Tools

Clean AI CLI logs, build cron expressions, decode JWTs, and calculate chmod permissions offline.

Explore Tools
Advertisement