Skip to content

Commit 577db25

Browse files
Add healthcheck task
1 parent 79de730 commit 577db25

7 files changed

Lines changed: 161 additions & 1 deletion

File tree

.env.template

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,3 +29,10 @@ SOLESEARCH_STOCKX_CALLBACK_URL=
2929
SOLESEARCH_STOCKX_CALLBACK_STATE=
3030
SOLESEARCH_SESSION_SECRET=
3131
# ===================
32+
33+
# === AWS ===
34+
AWS_HEALTHCHECK_URL=
35+
AWS_ACCESS_KEY_ID=
36+
AWS_SECRET_ACCESS_KEY=
37+
AWS_REGION=
38+
# ===============

poetry.lock

Lines changed: 84 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pyproject.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ redis = "^5.2.0"
2121
logfire = { extras = ["fastapi", "celery", "sqlalchemy"], version = "^3.4.0" }
2222
beautifulsoup4 = "^4.13.3"
2323
debugpy = "^1.8.13"
24+
boto3 = "^1.37.13"
25+
requests-aws4auth = "^1.3.1"
2426

2527
[tool.poetry.group.dev.dependencies]
2628
ruff = "^0.9.4"

src/solesearch_api/config.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,20 @@
2020
if not ENVIRONMENT:
2121
raise OSError("ENVIRONMENT environment variable not set.")
2222

23+
AWS_HEALTHCHECK_URL = os.environ.get("AWS_HEALTHCHECK_URL")
24+
AWS_ACCESS_KEY_ID = os.environ.get("AWS_ACCESS_KEY_ID")
25+
AWS_SECRET_ACCESS_KEY = os.environ.get("AWS_SECRET_ACCESS_KEY")
26+
AWS_REGION = os.environ.get("AWS_REGION", "us-east-1")
27+
28+
if not AWS_HEALTHCHECK_URL:
29+
raise OSError("AWS_HEALTHCHECK_URL environment variable not set.")
30+
31+
if not AWS_ACCESS_KEY_ID:
32+
raise OSError("AWS_ACCESS_KEY_ID environment variable not set.")
33+
34+
if not AWS_SECRET_ACCESS_KEY:
35+
raise OSError("AWS_SECRET_ACCESS_KEY environment variable not set.")
36+
2337
DATA_DIR = "/var/data/solesearch"
2438
HTML_DIR = os.path.join(DATA_DIR, "html")
2539
JSON_DIR = os.path.join(DATA_DIR, "json")

src/solesearch_api/tasks/__init__.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,4 +28,28 @@ def init_beat(*args, **kwargs):
2828
config_source=CeleryConfig,
2929
)
3030

31+
app.conf.beat_schedule = {
32+
"adidas-new-releases-every-4-hours": {
33+
"task": "solesearch_api.tasks.scraping.retail.adidas.new_releases",
34+
"schedule": 4 * 60 * 60, # every 4 hours
35+
},
36+
"adidas-pdp-every-4-hours": {
37+
"task": "solesearch_api.tasks.scraping.retail.adidas.pdp",
38+
"schedule": 4 * 60 * 60, # every 4 hours
39+
},
40+
"nike-new-releases-every-4-hours": {
41+
"task": "solesearch_api.tasks.scraping.retail.nike.new_releases",
42+
"schedule": 4 * 60 * 60, # every 4 hours
43+
},
44+
"nike-in-stock-every-4-hours": {
45+
"task": "solesearch_api.tasks.scraping.retail.nike.in_stock",
46+
"schedule": 4 * 60 * 60, # every 4 hours
47+
},
48+
"healthcheck-every-minute": {
49+
"task": "solesearch_api.tasks.alerting.healthcheck",
50+
"schedule": 60 * 10, # every 10 minutes
51+
},
52+
}
53+
3154
import solesearch_api.tasks.scraping
55+
import solesearch_api.tasks.alerting.healthcheck

src/solesearch_api/tasks/alerting/__init__.py

Whitespace-only changes.
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import logging
2+
import requests
3+
from requests_aws4auth import AWS4Auth
4+
5+
from solesearch_api.config import (
6+
AWS_ACCESS_KEY_ID,
7+
AWS_HEALTHCHECK_URL,
8+
AWS_SECRET_ACCESS_KEY,
9+
AWS_REGION,
10+
)
11+
from solesearch_api.tasks import app
12+
13+
logger = logging.getLogger(__name__)
14+
15+
auth = AWS4Auth(
16+
AWS_ACCESS_KEY_ID,
17+
AWS_SECRET_ACCESS_KEY,
18+
AWS_REGION,
19+
"execute-api",
20+
)
21+
22+
23+
@app.task(name="solesearch_api.tasks.alerting.healthcheck")
24+
def healthcheck():
25+
response = requests.post(
26+
AWS_HEALTHCHECK_URL,
27+
json={"ping": True},
28+
auth=auth,
29+
)
30+
response.raise_for_status()

0 commit comments

Comments
 (0)