Skip to content

Commit fb77024

Browse files
Pigbibicodex
andauthored
fix: scope runtime guard service log queries (#280)
- Prefer explicit per-environment Cloud Run services over the global target list - Add region filters to Cloud Run log queries - Cover explicit service and region filter behavior Co-Authored-By: Codex <noreply@openai.com>
1 parent e024304 commit fb77024

2 files changed

Lines changed: 75 additions & 5 deletions

File tree

scripts/cloud_run_runtime_guard.py

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,8 @@ def _load_services() -> list[str]:
4646
"CLOUD_RUN_SERVICE",
4747
):
4848
services.extend(_split_values(os.environ.get(name)))
49+
if services:
50+
return list(dict.fromkeys(services))
4951

5052
raw_targets = (os.environ.get("CLOUD_RUN_SERVICE_TARGETS_JSON") or "").strip()
5153
if raw_targets:
@@ -85,6 +87,17 @@ def _load_services() -> list[str]:
8587
return unique
8688

8789

90+
def _cloud_run_log_filter(service: str, since_text: str, region: str = "") -> str:
91+
parts = [
92+
'resource.type="cloud_run_revision"',
93+
f'resource.labels.service_name="{service}"',
94+
]
95+
if region:
96+
parts.append(f'resource.labels.location="{region}"')
97+
parts.append(f'timestamp >= "{since_text}"')
98+
return " AND ".join(parts)
99+
100+
88101
def _scheduler_job_pattern_for_services(services: list[str]) -> str:
89102
candidates: list[str] = []
90103
for service in services:
@@ -442,11 +455,7 @@ def main() -> int:
442455
for service in services:
443456
service_since = _cloud_run_log_since(project, service, since) if ignore_pre_ready_logs else since
444457
service_since_text = _format_timestamp(service_since)
445-
log_filter = (
446-
'resource.type="cloud_run_revision" '
447-
f'AND resource.labels.service_name="{service}" '
448-
f'AND timestamp >= "{service_since_text}"'
449-
)
458+
log_filter = _cloud_run_log_filter(service, service_since_text, _region_for_service(service))
450459
try:
451460
entries = _run_gcloud_logging(project, log_filter, limit)
452461
except RuntimeError as exc:

tests/test_cloud_run_runtime_guard.py

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,67 @@
88
from scripts import cloud_run_runtime_guard as guard
99

1010

11+
def _clear_runtime_guard_env(monkeypatch):
12+
for name in (
13+
"RUNTIME_GUARD_CLOUD_RUN_SERVICES",
14+
"CLOUD_RUN_SERVICES",
15+
"CLOUD_RUN_SERVICE",
16+
"CLOUD_RUN_SERVICE_TARGETS_JSON",
17+
"CLOUD_RUN_REGION",
18+
):
19+
monkeypatch.delenv(name, raising=False)
20+
21+
22+
def test_load_services_prefers_explicit_service_over_target_list(monkeypatch):
23+
_clear_runtime_guard_env(monkeypatch)
24+
monkeypatch.setenv("CLOUD_RUN_SERVICE", "longbridge-quant-hk-service")
25+
monkeypatch.setenv(
26+
"CLOUD_RUN_SERVICE_TARGETS_JSON",
27+
json.dumps(
28+
{
29+
"targets": [
30+
{"service": "longbridge-quant-paper-service"},
31+
{"service": "longbridge-quant-sg-service"},
32+
]
33+
}
34+
),
35+
)
36+
37+
assert guard._load_services() == ["longbridge-quant-hk-service"]
38+
39+
40+
def test_load_services_falls_back_to_target_list(monkeypatch):
41+
_clear_runtime_guard_env(monkeypatch)
42+
monkeypatch.setenv(
43+
"CLOUD_RUN_SERVICE_TARGETS_JSON",
44+
json.dumps(
45+
{
46+
"targets": [
47+
{"service": "longbridge-quant-paper-service"},
48+
{"runtime_target": {"service_name": "longbridge-quant-sg-service"}},
49+
]
50+
}
51+
),
52+
)
53+
54+
assert guard._load_services() == [
55+
"longbridge-quant-paper-service",
56+
"longbridge-quant-sg-service",
57+
]
58+
59+
60+
def test_cloud_run_log_filter_includes_region_when_available():
61+
log_filter = guard._cloud_run_log_filter(
62+
"longbridge-quant-paper-service",
63+
"2026-07-01T12:00:00Z",
64+
"asia-east1",
65+
)
66+
67+
assert 'resource.labels.service_name="longbridge-quant-paper-service"' in log_filter
68+
assert 'resource.labels.location="asia-east1"' in log_filter
69+
assert 'timestamp >= "2026-07-01T12:00:00Z"' in log_filter
70+
71+
1172
def test_scheduler_job_pattern_includes_service_alias():
1273
pattern = guard._scheduler_job_pattern_for_services(["longbridge-quant-hk-service"])
1374

0 commit comments

Comments
 (0)