본문으로 건너뛰기

BigQuery Cloud Logging sink (ADR 0043 v1.69)

previewUnifiedDeadlines (v1.62) Cloud Logging structured log 를 BigQuery 에 export 해 영속 cost / 사용 패턴 분석 dashboard 구축.

동기

v1.55 sessionStorage fetchCount: 탭 닫으면 리셋 (단기 cost only) v1.62 Cloud Logging: gcloud filter 가능하나 30일 retention 만 (default) v1.69 BigQuery sink: 무제한 retention + SQL 분석 + Looker Studio 시각화

1. 사전 준비 (1회)

1-1. BigQuery dataset 생성

# 프로젝트 선택
gcloud config set project neohollo-pro

# dataset 생성 — `ops_logs` (Asia 멀티 리전)
bq --location=asia-northeast3 mk \
--description "ADR 0043 v1.69 — ops Cloud Logging structured events" \
ops_logs

1-2. Cloud Logging sink 생성

# sink 이름 + filter — previewUnifiedDeadlines 의 invoke + complete events
gcloud logging sinks create \
ops-deadline-preview-sink \
bigquery.googleapis.com/projects/neohollo-pro/datasets/ops_logs \
--log-filter='resource.type="cloud_function"
AND resource.labels.function_name="previewUnifiedDeadlines"
AND (jsonPayload.event="previewUnifiedDeadlines.invoke"
OR jsonPayload.event="previewUnifiedDeadlines.complete")'

1-3. 권한 부여

# sink writer 서비스 계정에 BigQuery dataset write 권한
SINK_SA=$(gcloud logging sinks describe ops-deadline-preview-sink \
--format='value(writerIdentity)')

bq add-iam-policy-binding ops_logs \
--member="$SINK_SA" \
--role=roles/bigquery.dataEditor

2. 활성화 후 검증 (5분)

2-1. 테스트 호출

# ops 콘솔에서 previewUnifiedDeadlines 1회 수동 호출
# (v1.43 UnifiedDeadlinesPreviewPanel 의 "조회" 버튼)

# 5분 대기 (sink propagation latency)

# BigQuery 에 데이터 도착 확인
bq query --use_legacy_sql=false \
'SELECT timestamp, jsonPayload.event, jsonPayload.actorEmail
FROM `ops_logs.run_googleapis_com_stdout`
WHERE jsonPayload.event LIKE "previewUnifiedDeadlines.%"
ORDER BY timestamp DESC
LIMIT 10'

3. 분석 query 예시

3-1. 운영자 별 호출 빈도 (지난 30일)

SELECT
jsonPayload.actorEmail AS actor,
COUNT(*) AS invokes,
AVG(CAST(jsonPayload.elapsedMs AS INT64)) AS avg_elapsed_ms
FROM `ops_logs.run_googleapis_com_stdout`
WHERE jsonPayload.event = "previewUnifiedDeadlines.complete"
AND timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
GROUP BY actor
ORDER BY invokes DESC

3-2. multi-source cases 추이

SELECT
DATE(timestamp) AS date,
AVG(CAST(jsonPayload.multiSourceCount AS INT64)) AS avg_multi_source
FROM `ops_logs.run_googleapis_com_stdout`
WHERE jsonPayload.event = "previewUnifiedDeadlines.complete"
GROUP BY date
ORDER BY date DESC

4. cost 모니터링

  • BigQuery storage: 로그 1KB 당 ₩0.0001/월 (Asia tier).
    • 가정: 일 100 호출 × 200B = 20KB/일 = 600KB/월 → ₩0.06/월 (무시 가능)
  • BigQuery query: 슬롯 기반 — 1TB scan 당 ₩6,500.
    • 위 query 들은 < 1MB scan → 무료 한도 내 (월 1TB free)

5. 비활성화

# sink 삭제 (BigQuery dataset + 데이터는 유지)
gcloud logging sinks delete ops-deadline-preview-sink

# dataset 도 삭제 (선택)
bq rm -r -f -d ops_logs

6. 다른 events 추가

  • v1.40 widget.deprecate.recommendation_strong audit log 도 동일 패턴으로 sink 가능
  • v1.46 autoPublishDeprecateStrongIfEnabled 결과 로그
  • v1.56 recordMultiSourceAlertIfEnabled outcome 추적

각자 별도 sink 생성 + filter 분리 권장 (분석 dashboard 별 dataset 분리).