9393 set -euo pipefail
9494 test -n "$SERVICE_URL"
9595 job_name="ibkr-reconcile-${PROFILE}-${GITHUB_RUN_ID}-${GITHUB_RUN_ATTEMPT}"
96+ request_id="$(python -c 'import uuid; print(uuid.uuid4())')"
9697 requested_at="$(date -u +%Y-%m-%dT%H:%M:%SZ)"
9798 case "$PROFILE" in
9899 soxl_soxx_trend_income) delay_minutes=3 ;;
@@ -116,6 +117,7 @@ jobs:
116117 --time-zone 'Etc/UTC' \
117118 --uri "${SERVICE_URL}/reconcile" \
118119 --http-method POST \
120+ --headers "X-QSL-Reconciliation-Request-Id=${request_id}" \
119121 --oidc-service-account-email "$GCP_SCHEDULER_SERVICE_ACCOUNT" \
120122 --oidc-token-audience "$SERVICE_URL" \
121123 --attempt-deadline '300s' \
@@ -124,6 +126,7 @@ jobs:
124126 --quiet >/dev/null
125127 {
126128 echo "job_name=$job_name"
129+ echo "request_id=$request_id"
127130 echo "requested_at=$requested_at"
128131 } >> "$GITHUB_OUTPUT"
129132
@@ -135,19 +138,19 @@ jobs:
135138 env :
136139 PROFILE : ${{ matrix.profile }}
137140 SERVICE : ${{ matrix.service }}
138- SERVICE_URL : ${{ steps.audience .outputs.service_url }}
141+ REQUEST_ID : ${{ steps.scheduler .outputs.request_id }}
139142 REQUESTED_AT : ${{ steps.scheduler.outputs.requested_at }}
140143 run : |
141144 set -euo pipefail
142- test -n "$SERVICE_URL "
145+ test -n "$REQUEST_ID "
143146 test -n "$REQUESTED_AT"
144147 mkdir -p reports
145148 log_entry=''
146149 logging_read_failures=0
147- for attempt in $(seq 1 96); do
150+ for _ in $(seq 1 96); do
148151 logging_output=''
149152 logging_read_status=0
150- logging_output="$(gcloud logging read "resource.type=\"cloud_run_revision\" AND resource.labels.service_name=\"${SERVICE}\" AND timestamp>=\"${REQUESTED_AT}\" AND textPayload:\"execution_report gs://\"" --project "$GCP_PROJECT_ID" --freshness=15m --limit=10 --format=json 2>/dev/null)" || logging_read_status=$?
153+ logging_output="$(gcloud logging read "resource.type=\"cloud_run_revision\" AND resource.labels.service_name=\"${SERVICE}\" AND timestamp>=\"${REQUESTED_AT}\" AND textPayload:\"reconciliation_receipt_ready request_id=${REQUEST_ID} report_uri= gs://\"" --project "$GCP_PROJECT_ID" --freshness=15m --limit=10 --format=json 2>/dev/null)" || logging_read_status=$?
151154 if [ "$logging_read_status" -ne 0 ]; then
152155 logging_read_failures=$((logging_read_failures + 1))
153156 sleep 5
@@ -157,7 +160,7 @@ jobs:
157160 echo "reconciliation_log_query_failed class=invalid_logging_json" >&2
158161 exit 1
159162 fi
160- log_entry="$(jq -c 'first(.[] | select(.textPayload? | startswith("execution_report gs://")) | select(.resource.labels.revision_name? | type == "string" and length > 0)) // empty' <<< "$logging_output")"
163+ log_entry="$(jq -c --arg request_id "$REQUEST_ID" 'first(.[] | select(.textPayload? | type == "string") | select(.textPayload | startswith("reconciliation_receipt_ready request_id=" + $request_id + " report_uri= gs://")) | select(.resource.labels.revision_name? | type == "string" and length > 0)) // empty' <<< "$logging_output")"
161164 if [ -n "$log_entry" ]; then
162165 break
163166 fi
@@ -173,16 +176,18 @@ jobs:
173176 fi
174177 exit 1
175178 fi
176- report_uri="$(jq -er '.textPayload | capture("^execution_report (?<uri>gs://[^[:space:]]+)$").uri' <<< "$log_entry")"
179+ receipt="$(jq -cer --arg request_id "$REQUEST_ID" '.textPayload | capture("^reconciliation_receipt_ready request_id=(?<request_id>[0-9a-f-]{36}) report_uri=(?<uri>gs://[^[:space:]]+)$") | select(.request_id == $request_id)' <<< "$log_entry")"
180+ report_uri="$(jq -er '.uri' <<< "$receipt")"
177181 serving_revision="$(jq -er '.resource.labels.revision_name | select(type == "string" and length > 0)' <<< "$log_entry")"
178182 revision_labels="$(gcloud run revisions describe "$serving_revision" --project "$GCP_PROJECT_ID" --region "$GCP_REGION" --format='json(metadata.labels)')"
179183 service_revision_commit_sha="$(jq -er '."commit-sha" | select(type == "string" and test("^[0-9a-f]{40}$"))' <<< "$revision_labels")"
180184 service_deploy_run_id="$(jq -er '."github-run-id" | select(type == "string" and test("^[0-9]+$"))' <<< "$revision_labels")"
181- gcloud storage cat "$report_uri" | jq --arg profile "$PROFILE" '
185+ gcloud storage cat "$report_uri" | jq --arg profile "$PROFILE" --arg request_id "$REQUEST_ID" '
182186 .diagnostics.broker_reconciliation as $candidate
183187 | {
184188 schema_version: "ibkr_reconciliation_artifact.v1",
185189 strategy_profile: $profile,
190+ reconciliation_request_id: .diagnostics.reconciliation_request_id,
186191 report_status: .status,
187192 reconciliation: $candidate,
188193 errors: [
@@ -194,9 +199,10 @@ jobs:
194199 ]
195200 }
196201 ' > "reports/${PROFILE}.json"
197- jq -e --arg profile "$PROFILE" '
202+ jq -e --arg profile "$PROFILE" --arg request_id "$REQUEST_ID" '
198203 .schema_version == "ibkr_reconciliation_artifact.v1"
199204 and .strategy_profile == $profile
205+ and .reconciliation_request_id == $request_id
200206 and .reconciliation.schema_version == "ibkr_reconciliation_candidate.v1"
201207 and .reconciliation.evidence.platform_id == "ibkr"
202208 and .reconciliation.evidence.strategy_profile == $profile
0 commit comments