Data Platform

Looker Studio Dashboard Usage Intelligence: Automated Metadata Sync via Colab Enterprise

Bagaimana saya merekayasa sistem pemantauan adopsi laporan internal dengan menyalurkan log audit akses data ke BigQuery dan menyinkronkan metadata laporan via API Looker Studio menggunakan Google Colab Enterprise.

#Looker Studio#GCP Cloud Logging#Looker Studio API#Google Colab Enterprise#BigQuery

Ringkasan Eksekutif

AstraPay menggunakan puluhan dasbor Looker Studio untuk mendukung keputusan produk, operasional, dan finansial sehari-hari. Seiring waktu, dasbor-dasbor baru terus dibuat secara organik oleh berbagai divisi. Namun, kami menghadapi tantangan ketiadaan visibilitas mengenai adopsi dasbor: dasbor mana yang benar-benar aktif digunakan oleh jajaran manajemen, siapa saja penggunanya, dan dasbor mana yang sudah usang (stale) namun masih terus memicu query BigQuery terjadwal di belakang layar secara boros.

Untuk mengatasi ini, saya merancang dan membangun sistem pelacakan otomatis Looker Studio Dashboard Usage Intelligence. Sistem ini menangkap log akses dasbor secara real-time via Cloud Logging Sink, memperkaya data hash ID laporan yang acak menggunakan Looker Studio API lewat skrip otomasi di Google Colab Enterprise, dan menyajikannya kembali dalam sebuah dasbor analisis adopsi internal yang komprehensif.


Desain Arsitektur Aliran Log & Metadata

Alur kerja pengumpulan log dan rekonsiliasi metadata dasbor dirancang agar berjalan secara otomatis dan asinkron tanpa membebani performa pembukaan laporan di sisi pengguna:

sequenceDiagram
    autonumber
    actor User as Pengguna / Management
    participant LS as Looker Studio Report
    participant CL as GCP Cloud Logging Sink
    participant BQ as BigQuery Tables
    participant Colab as Google Colab Enterprise
    
    User->>LS: Membuka / Interaksi Laporan
    LS->>CL: Pemicu log audit otomatis
    CL->>BQ: Aliran log real-time ke log_table (berisi Report ID & User Email)
    
    Note over Colab: Eksekusi Terjadwal Harian (Daily Cron)
    Colab->>LS: Request detail metadata via Looker Studio API
    LS-->>Colab: Return Metadata (Report Title, Creator, Create Date)
    Colab->>BQ: Sinkronisasi ke metadata_dim_table (Upsert)
    
    Note over BQ: JOIN log_table dengan metadata_dim_table
    BQ-->>LS: Sajikan data analitik interaktif di Dasbor Penggunaan

Implementasi Otomasi Python di Colab Enterprise

Log mentah dari GCP Cloud Logging hanya memuat hash ID laporan unik (seperti 0a1b2c3d-4e5f-6a7b-8c9d-0e1f2a3b4c5d) tanpa judul laporan manusiawi. Untuk melengkapinya, saya menulis skrip otomatisasi Python di Google Colab Enterprise yang berjalan secara harian untuk mengambil metadata asli melalui Looker Studio API.

Berikut adalah cuplikan skrip Python yang mengekstrak metadata laporan dan menulis hasilnya secara terstruktur ke tabel dimensi BigQuery menggunakan service account credentials:

import os
import time
from google.cloud import bigquery
from googleapiclient.discovery import build
import google.auth

# Inisialisasi Google Credentials & BigQuery Client
credentials, project = google.auth.default()
bq_client = bigquery.Client(credentials=credentials, project=project)

# Inisialisasi API Client Looker Studio
# (Menggunakan REST API Looker Studio versi v1)
looker_studio_service = build('lookerstudio', 'v1', credentials=credentials)

def sync_report_metadata():
    # 1. Ambil daftar Report ID unik yang terdeteksi di log akses BigQuery
    query_distinct_ids = """
        SELECT DISTINCT report_id 
        FROM `prd-data-ap.audit_logs.looker_access_raw`
        WHERE report_id IS NOT NULL
    """
    query_job = bq_client.query(query_distinct_ids)
    rows = query_job.result()
    report_ids = [row.report_id for row in rows]
    
    metadata_records = []
    
    # 2. Panggil API Looker Studio untuk mengambil detail metadata per Report ID
    for rid in report_ids:
        try:
            # Memanggil endpoint: lookerstudio.reports.get
            report = looker_studio_service.reports().get(name=f"reports/{rid}").execute()
            
            metadata_records.append({
                "report_id": rid,
                "title": report.get("title", "Untitled Report"),
                "creator": report.get("creatorEmail", "unknown@astrapay.com"),
                "created_time": report.get("createTime"),
                "last_updated_time": report.get("updateTime"),
                "sync_timestamp": time.time()
            })
            # Jeda singkat untuk mematuhi pembatasan API rate-limit
            time.sleep(0.2)
        except Exception as e:
            print(f"Gagal mengambil metadata untuk ID: {rid}. Error: {str(e)}")
            
    # 3. Tulis ulang / Update data metadata ke BigQuery Dimension Table
    if metadata_records:
        table_id = "prd-data-ap.audit_logs.looker_reports_metadata"
        job_config = bigquery.LoadJobConfig(
            write_disposition="WRITE_TRUNCATE" # Refresh harian skema dimensi
        )
        load_job = bq_client.load_table_from_json(
            metadata_records, table_id, job_config=job_config
        )
        load_job.result() # Tunggu hingga selesai
        print(f"Sukses menyinkronkan {len(metadata_records)} metadata laporan ke BigQuery.")

if __name__ == "__main__":
    sync_report_metadata()

Pemodelan Data & SQL Intelejen Penggunaan

Setelah data dimensi metadata dan fakta log akses terkumpul di BigQuery, saya membuat view terkompilasi yang menggabungkan kedua tabel tersebut. View ini kemudian digunakan sebagai sumber data utama dasbor pemantauan Looker Studio.

Berikut adalah kueri SQL JOIN yang digunakan di BigQuery:

SELECT
  log.timestamp AS access_time,
  DATE(log.timestamp, "Asia/Jakarta") AS access_date,
  log.user_email AS viewer_email,
  log.report_id,
  -- Gabungkan dengan tabel dimensi hasil sinkronisasi API
  COALESCE(meta.title, "Laporan Tidak Terdaftar / Dihapus") AS report_title,
  meta.creator AS report_owner,
  DATE(TIMESTAMP(meta.created_time), "Asia/Jakarta") AS report_created_date,
  -- Tandai jika dasbor diakses oleh pihak eksternal domain
  IF(REGEXP_CONTAINS(log.user_email, r'@astrapay\.com$'), 'Internal', 'Eksternal') AS user_type
FROM
  `prd-data-ap.audit_logs.looker_access_raw` log
LEFT JOIN
  `prd-data-ap.audit_logs.looker_reports_metadata` meta
ON
  log.report_id = meta.report_id
WHERE
  -- Batasi data historis untuk meminimalkan beban biaya query Looker Studio
  log.timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 90 DAY);

Dampak Bisnis & Efisiensi Biaya

Penerapan sistem Looker Studio Dashboard Usage Intelligence ini memberikan dampak nyata pada pengelolaan platform data perusahaan:

  • Decommissioning Dasbor Usang: Mengidentifikasi bahwa 32% dasbor yang aktif di GCP tidak pernah dibuka oleh satu pengguna pun dalam 90 hari terakhir. Dasbor-dasbor ini telah dihapus dengan aman.
  • Penghematan Biaya Komputasi BigQuery: Penghapusan dasbor usang secara langsung mematikan scheduled queries (kueri terjadwal) dan pembaruan ekstrak data (scheduled extract refreshes) yang berjalan di belakang layar. Hal ini menghemat ribuan GigaBytes volume data scan BigQuery harian, memangkas pengeluaran cloud bulanan GCP.
  • Audit Keamanan Data Finansial: Memungkinkan tim keamanan data platform untuk memantau jika ada Report ID sensitif yang dibagikan secara tidak sengaja ke luar domain organisasi @astrapay.com secara real-time.