set -euo pipefail
PROJECT_ID="your-project"
INGEST_URL="https://ingest.tryrankly.com/ingest/gcp-logsink"
TENANT_TOKEN="tnt_your_token"
TOPIC="rankly-aa-<token>-logs"
SUB="rankly-aa-<token>-push"
SINK="rankly-aa-<token>-sink"
gcloud config set project "$PROJECT_ID"
gcloud services enable pubsub.googleapis.com logging.googleapis.com
gcloud pubsub topics create "$TOPIC" 2>/dev/null || true
# Log Sink: filter to AI-bot UAs, favicon fetches, and LLM-referred humans
FILTER='(resource.type="cloud_run_revision" OR resource.type="http_load_balancer" OR resource.type="gae_app") AND (httpRequest.userAgent:("GPTBot" OR "ClaudeBot" OR "PerplexityBot" OR "Google-Extended" OR "Bytespider" OR "Amazonbot") OR httpRequest.requestUrl:("/favicon") OR httpRequest.referer:("chatgpt.com" OR "perplexity.ai" OR "claude.ai"))'
SINK_DEST="pubsub.googleapis.com/projects/$PROJECT_ID/topics/$TOPIC"
gcloud logging sinks create "$SINK" "$SINK_DEST" --log-filter="$FILTER" 2>/dev/null \
|| gcloud logging sinks update "$SINK" "$SINK_DEST" --log-filter="$FILTER"
SINK_SA=$(gcloud logging sinks describe "$SINK" --format='value(writerIdentity)')
gcloud pubsub topics add-iam-policy-binding "$TOPIC" --member="$SINK_SA" --role=roles/pubsub.publisher
gcloud pubsub subscriptions create "$SUB" \
--topic="$TOPIC" --push-endpoint="$INGEST_URL?tenant=$TENANT_TOKEN" \
--ack-deadline=30 --message-retention-duration=7d 2>/dev/null \
|| gcloud pubsub subscriptions update "$SUB" --push-endpoint="$INGEST_URL?tenant=$TENANT_TOKEN"