Skip to content

Commit f0482fc

Browse files
committed
cloud run tasks
1 parent b861ce8 commit f0482fc

8 files changed

Lines changed: 19 additions & 43 deletions

File tree

README.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,6 @@ Most local contributor workflows only need defaults, but these are commonly used
133133
- `IS_IT_DOWN_PROXY_SECRET_PROJECT_ID`: GCP project containing checker proxy secrets.
134134
- `IS_IT_DOWN_DEFAULT_CHECKER_PROXY_SECRET_ID`: default proxy secret ID.
135135
- `IS_IT_DOWN_CHECKER_CONCURRENCY` (default: `10`)
136-
- `IS_IT_DOWN_CHECKER_TASK_BATCH_SIZE` (default: `50`; Cloud Run task shard batch size for scheduled checker jobs)
137136
- `IS_IT_DOWN_CHECKER_MAX_RESPONSE_BODY_BYTES` (default: `524288`)
138137
- `IS_IT_DOWN_CHECKER_MAX_JSON_RESPONSE_BODY_BYTES` (default: `1048576`)
139138
- `IS_IT_DOWN_CHECKER_INSERT_BATCH_SIZE` (default: `500`)

infra/terraform/README.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,6 @@ File layout:
4646
Checker job defaults:
4747

4848
- `checker_job_task_count = 4` (Cloud Run Job tasks and parallelism)
49-
- `checker_task_batch_size = 50` (max checker classes per shard batch in each task)
5049

5150
## Example: dev apply
5251

infra/terraform/cloud_run.tf

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -91,11 +91,6 @@ resource "google_cloud_run_v2_job" "checker" {
9191
value = tostring(var.checker_concurrency)
9292
}
9393

94-
env {
95-
name = "IS_IT_DOWN_CHECKER_TASK_BATCH_SIZE"
96-
value = tostring(var.checker_task_batch_size)
97-
}
98-
9994
env {
10095
name = "IS_IT_DOWN_BIGQUERY_PROJECT_ID"
10196
value = var.project[terraform.workspace]

infra/terraform/variables.tf

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -151,11 +151,6 @@ variable "checker_job_task_count" {
151151
default = 4
152152
}
153153

154-
variable "checker_task_batch_size" {
155-
type = number
156-
default = 50
157-
}
158-
159154
variable "api_cache_enabled" {
160155
type = bool
161156
default = true

src/is_it_down/checkers/services/npmjs.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,12 +54,12 @@ class NpmjsRegistryWebCheck(HtmlMarkerCheck):
5454
"""Represent `NpmjsRegistryWebCheck`."""
5555

5656
check_key = "npmjs_registryweb"
57-
endpoint_key = "https://registry.npmjs.org/react"
57+
endpoint_key = "https://registry.npmjs.org/react/latest"
5858
interval_seconds = 60
5959
timeout_seconds = 5.0
6060
required_content_type_fragment = None
6161
weight = 0.15
62-
expected_markers = ("name",)
62+
expected_markers = ("name", "version")
6363

6464

6565
class NpmjsServiceChecker(BaseServiceChecker):

src/is_it_down/scripts/run_scheduled_checks.py

Lines changed: 8 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -123,37 +123,31 @@ def _shard_service_checker_classes(
123123
*,
124124
task_index: int,
125125
task_count: int,
126-
checkers_per_task: int,
127126
) -> list[type[BaseServiceChecker]]:
128127
"""Shard service checker classes for a Cloud Run Job task.
129128
130129
Args:
131130
service_checker_classes: All checker classes sorted in deterministic order.
132131
task_index: The zero-based Cloud Run Job task index.
133132
task_count: The total number of Cloud Run Job tasks for this execution.
134-
checkers_per_task: Maximum number of checkers in each shard batch.
135133
136134
Returns:
137135
The checker classes assigned to this task.
138136
139137
Raises:
140-
RuntimeError: If there are not enough Cloud Run tasks for the configured batch size.
141-
ValueError: If `task_count` or `checkers_per_task` is not positive.
138+
ValueError: If `task_count` is not positive.
142139
"""
143140
if task_count <= 0:
144141
raise ValueError("task_count must be greater than 0.")
145-
if checkers_per_task <= 0:
146-
raise ValueError("checkers_per_task must be greater than 0.")
147142

148-
required_task_count = (len(service_checker_classes) + checkers_per_task - 1) // checkers_per_task
149-
if task_count < required_task_count:
150-
raise RuntimeError(
151-
f"Cloud Run task count ({task_count}) is too small for {len(service_checker_classes)} service checkers "
152-
f"with checkers_per_task={checkers_per_task}. Increase task_count to at least {required_task_count}."
153-
)
143+
total_checker_count = len(service_checker_classes)
144+
base_shard_size = total_checker_count // task_count
145+
remainder = total_checker_count % task_count
154146

155-
start = task_index * checkers_per_task
156-
end = start + checkers_per_task
147+
# Distribute the remainder one-by-one to the first tasks for an even split.
148+
shard_size = base_shard_size + (1 if task_index < remainder else 0)
149+
start = task_index * base_shard_size + min(task_index, remainder)
150+
end = start + shard_size
157151
return list(service_checker_classes[start:end])
158152

159153

@@ -180,20 +174,16 @@ def _resolve_service_checker_classes(
180174
return service_checker_classes
181175

182176
task_index, task_count = task_metadata
183-
settings = get_settings()
184-
checkers_per_task = max(1, settings.checker_task_batch_size)
185177
sharded_service_checker_classes = _shard_service_checker_classes(
186178
service_checker_classes,
187179
task_index=task_index,
188180
task_count=task_count,
189-
checkers_per_task=checkers_per_task,
190181
)
191182

192183
logger.info(
193184
"checker_job.task_shard_assigned",
194185
cloud_run_task_index=task_index,
195186
cloud_run_task_count=task_count,
196-
checkers_per_task=checkers_per_task,
197187
total_checker_count=len(service_checker_classes),
198188
assigned_checker_count=len(sharded_service_checker_classes),
199189
)

src/is_it_down/settings.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@ class Settings(BaseSettings):
3636
worker_lease_seconds: int = 30
3737
worker_max_attempts: int = 3
3838
checker_concurrency: int = 10
39-
checker_task_batch_size: int = 50
4039
checker_max_response_body_bytes: int = 524288
4140
checker_max_json_response_body_bytes: int = 1048576
4241
checker_insert_batch_size: int = 500

tests/test_run_scheduled_checks.py

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -131,9 +131,6 @@ def test_resolve_cloud_run_task_metadata_returns_none_without_env(monkeypatch: p
131131

132132

133133
def test_resolve_service_checker_classes_shards_by_task(monkeypatch: pytest.MonkeyPatch) -> None:
134-
monkeypatch.setenv("IS_IT_DOWN_CHECKER_TASK_BATCH_SIZE", "2")
135-
_reset_settings_cache()
136-
137134
checkers = {
138135
key: _build_dummy_checker(key)
139136
for key in ["alpha", "bravo", "charlie", "delta", "echo", "foxtrot"]
@@ -149,20 +146,22 @@ def test_resolve_service_checker_classes_shards_by_task(monkeypatch: pytest.Monk
149146
assert [checker.service_key for checker in task_two] == ["echo", "foxtrot"]
150147

151148

152-
def test_resolve_service_checker_classes_raises_when_task_count_too_low(
149+
def test_resolve_service_checker_classes_evenly_distributes_remainder(
153150
monkeypatch: pytest.MonkeyPatch,
154151
) -> None:
155-
monkeypatch.setenv("IS_IT_DOWN_CHECKER_TASK_BATCH_SIZE", "2")
156-
_reset_settings_cache()
157-
158152
checkers = {
159153
key: _build_dummy_checker(key)
160-
for key in ["alpha", "bravo", "charlie", "delta", "echo", "foxtrot"]
154+
for key in ["alpha", "bravo", "charlie", "delta", "echo", "foxtrot", "golf"]
161155
}
162156
monkeypatch.setattr(run_scheduled_checks, "discover_service_checkers", lambda: checkers)
163157

164-
with pytest.raises(RuntimeError, match="too small"):
165-
run_scheduled_checks._resolve_service_checker_classes([], task_metadata=(0, 2))
158+
task_zero = run_scheduled_checks._resolve_service_checker_classes([], task_metadata=(0, 3))
159+
task_one = run_scheduled_checks._resolve_service_checker_classes([], task_metadata=(1, 3))
160+
task_two = run_scheduled_checks._resolve_service_checker_classes([], task_metadata=(2, 3))
161+
162+
assert [checker.service_key for checker in task_zero] == ["alpha", "bravo", "charlie"]
163+
assert [checker.service_key for checker in task_one] == ["delta", "echo"]
164+
assert [checker.service_key for checker in task_two] == ["foxtrot", "golf"]
166165

167166

168167
@pytest.mark.asyncio

0 commit comments

Comments
 (0)