blob: ffb5da0dcf8f631e2b5ec43f774bb91eef8446d3 [file]
#!/bin/bash
usage() {
echo "Usage: $0 [-n] [-a] [-i <request_id>] [-f <trace_file>] <project> <topic> <start_date> <finish_date> <alert_id1> [<alert_id2> ...]"
echo " -n: Send notifications (default: false)"
echo " -a: Load all traces together (default: false)"
echo " -i <request_id>: Use a custom request ID (default: auto-generated UUID)"
echo " -f <trace_file>: File containing trace IDs (one per line). Use '-' to read from stdin."
echo " Example: $0 -n -a skia-public perf-anomaly-backfill-v8-perf-autopush 2026-01-01 2026-01-05 12345 67890"
echo " Example with pipe: cat traces.txt | $0 -f - skia-public perf-anomaly-backfill-v8-perf-autopush 2026-01-01 2026-01-05 12345"
exit 1
}
SEND_NOTIFICATIONS=false
LOAD_ALL_TRACES_TOGETHER=false
CUSTOM_REQUEST_ID=""
TRACE_FILE=""
while getopts "nai:f:" opt; do
case ${opt} in
n )
SEND_NOTIFICATIONS=true
;;
a )
LOAD_ALL_TRACES_TOGETHER=true
;;
i )
CUSTOM_REQUEST_ID="${OPTARG}"
;;
f )
TRACE_FILE="${OPTARG}"
;;
\? )
usage
;;
esac
done
shift $((OPTIND -1))
TRACE_ARRAY=()
if [ -n "$TRACE_FILE" ]; then
if [ "$TRACE_FILE" = "-" ]; then
echo "Reading trace IDs from stdin..."
mapfile -t TRACE_ARRAY
else
if [ ! -f "$TRACE_FILE" ]; then
echo "Error: File '$TRACE_FILE' not found."
exit 1
fi
mapfile -t TRACE_ARRAY < "$TRACE_FILE"
fi
fi
JSON_TRACE_ARRAY="[]"
if [ ${#TRACE_ARRAY[@]} -gt 0 ]; then
JSON_TRACE_ARRAY="["
for i in "${!TRACE_ARRAY[@]}"; do
JSON_TRACE_ARRAY+="\"${TRACE_ARRAY[$i]}\""
if [ $i -lt $(( ${#TRACE_ARRAY[@]} - 1 )) ]; then
JSON_TRACE_ARRAY+=","
fi
done
JSON_TRACE_ARRAY+="]"
fi
if [ "$#" -lt 5 ]; then
usage
fi
PROJECT="$1"
TOPIC="$2"
START_DATE="$3"
FINISH_DATE="$4"
shift 4
if ! date -d "$START_DATE" >/dev/null 2>&1; then
echo "Error: Invalid start date '$START_DATE'"
usage
fi
if ! date -d "$FINISH_DATE" >/dev/null 2>&1; then
echo "Error: Invalid finish date '$FINISH_DATE'"
usage
fi
ALERT_IDS=("$@")
for ALERT_ID in "${ALERT_IDS[@]}"; do
echo "Starting to publish backfill requests for alert ${ALERT_ID} from ${START_DATE} to ${FINISH_DATE} (send_notifications=${SEND_NOTIFICATIONS}, load_all_traces_together=${LOAD_ALL_TRACES_TOGETHER})"
current_date="$START_DATE"
while [ "$current_date" != "$(date -d "$FINISH_DATE + 1 day" +%Y-%m-%d)" ]; do
END_TIMESTAMP=$(date -d "$current_date" +%s)
REQUEST_ID="${CUSTOM_REQUEST_ID}"
if [ -z "${REQUEST_ID}" ]; then
REQUEST_ID=$(cat /proc/sys/kernel/random/uuid)
fi
# Construct the JSON payload
if [ ${#TRACE_ARRAY[@]} -gt 0 ]; then
MESSAGE="{\"request_id\":\"${REQUEST_ID}\",\"alert_id\":${ALERT_ID},\"end\":${END_TIMESTAMP},\"load_all_traces_together\":${LOAD_ALL_TRACES_TOGETHER},\"send_notifications\":${SEND_NOTIFICATIONS},\"trace_ids\":${JSON_TRACE_ARRAY}}"
else
MESSAGE="{\"request_id\":\"${REQUEST_ID}\",\"alert_id\":${ALERT_ID},\"end\":${END_TIMESTAMP},\"load_all_traces_together\":${LOAD_ALL_TRACES_TOGETHER},\"send_notifications\":${SEND_NOTIFICATIONS}}"
fi
echo "Publishing backfill request for alert ${ALERT_ID} date ${current_date} (timestamp: ${END_TIMESTAMP}, request_id: ${REQUEST_ID})..."
echo "Payload: ${MESSAGE}"
# Publish to Pub/Sub
gcloud pubsub topics publish "projects/${PROJECT}/topics/${TOPIC}" --message="${MESSAGE}" >/dev/null
# Move to the next day
current_date=$(date -d "$current_date + 1 day" +%Y-%m-%d)
done
done
echo "Finished publishing all requests!"