Skip to content

Commit ce6b10d

Browse files
author
Alexey Tsitkin
committed
adding health check support
1 parent fcf3f7c commit ce6b10d

File tree

3 files changed

+46
-0
lines changed

3 files changed

+46
-0
lines changed
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import sys
2+
3+
import logging
4+
from datetime import timedelta
5+
from django.conf import settings
6+
from django.core.management import BaseCommand
7+
from django.utils import timezone
8+
from django.utils.dateparse import parse_datetime
9+
10+
logger = logging.getLogger(__name__)
11+
12+
13+
class Command(BaseCommand):
14+
help = 'Checks the SQS worker is healthy, and if not returns a failure code'
15+
16+
def add_arguments(self, parser):
17+
pass
18+
19+
def handle(self, *args, **options):
20+
try:
21+
with open(settings.HEALTHCHECK_FILE_NAME, 'r') as file:
22+
last_healthcheck_date_str = file.readlines()[0]
23+
24+
if parse_datetime(last_healthcheck_date_str) < timezone.now() - timedelta(seconds=settings.HEALTHCHECK_UNHEALTHY_PERIOD_S):
25+
self._return_failure()
26+
except Exception:
27+
self._return_failure()
28+
29+
@staticmethod
30+
def _return_failure():
31+
logger.warning('[django-eb-sqs] Health check failed')
32+
sys.exit(1)

eb_sqs/settings.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,3 +37,7 @@
3737

3838
QUEUE_MESSAGE_RETENTION = getattr(settings, 'EB_SQS_QUEUE_MESSAGE_RETENTION', '1209600') # type: str
3939
QUEUE_VISIBILITY_TIMEOUT = getattr(settings, 'EB_SQS_QUEUE_VISIBILITY_TIMEOUT', '300') # type: str
40+
41+
MIN_HEALTHCHECK_WRITE_PERIOD_S = getattr(settings, 'EB_SQS_MIN_HEALTHCHECK_WRITE_PERIOD_S', 10) # type: int
42+
HEALTHCHECK_UNHEALTHY_PERIOD_S = getattr(settings, 'EB_SQS_HEALTHCHECK_UNHEALTHY_PERIOD_S', int(QUEUE_VISIBILITY_TIMEOUT)) # type: int
43+
HEALTHCHECK_FILE_NAME = getattr(settings, 'EB_SQS_HEALTHCHECK_FILE_NAME', 'healthcheck.txt') # type: str

eb_sqs/worker/service.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,9 @@ def process_queues(self, queue_names):
4343
static_queues = queues
4444
last_update_time = timezone.now() - timedelta(seconds=settings.REFRESH_PREFIX_QUEUES_S)
4545

46+
self.write_healthcheck_file()
47+
last_healthcheck_time = timezone.now()
48+
4649
logger.debug('[django-eb-sqs] Connected to SQS: {}'.format(', '.join(queue_names)))
4750

4851
worker = WorkerFactory.default().create()
@@ -67,6 +70,9 @@ def process_queues(self, queue_names):
6770
logger.debug('[django-eb-sqs] Processing {} queues'.format(len(queues)))
6871
self.process_messages(queues, worker, static_queues)
6972

73+
if timezone.now() - timedelta(seconds=settings.MIN_HEALTHCHECK_PERIOD_S) > last_healthcheck_time:
74+
self.write_healthcheck_file()
75+
7076
def process_messages(self, queues, worker, static_queues):
7177
# type: (list, Worker, list) -> None
7278
for queue in queues:
@@ -144,3 +150,7 @@ def get_queues_by_prefixes(self, sqs, prefixes):
144150
queues += sqs.queues.filter(QueueNamePrefix=prefix)
145151

146152
return queues
153+
154+
def write_healthcheck_file(self):
155+
with open(settings.HEALTHCHECK_FILE_NAME, 'w') as file:
156+
file.write(timezone.now().isoformat())

0 commit comments

Comments
 (0)