Skip to content

Commit 77ab42c

Browse files
authored
Merge pull request #35 from cuda-networks/healthcheck
Healthcheck
2 parents fcf3f7c + d4d6d71 commit 77ab42c

File tree

4 files changed

+50
-1
lines changed

4 files changed

+50
-1
lines changed
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import sys
2+
3+
import logging
4+
from datetime import timedelta
5+
6+
from django.core.management import BaseCommand
7+
from django.utils import timezone
8+
from django.utils.dateparse import parse_datetime
9+
10+
from eb_sqs import settings
11+
12+
logger = logging.getLogger(__name__)
13+
14+
15+
class Command(BaseCommand):
16+
help = 'Checks the SQS worker is healthy, and if not returns a failure code'
17+
18+
def add_arguments(self, parser):
19+
pass
20+
21+
def handle(self, *args, **options):
22+
try:
23+
with open(settings.HEALTHCHECK_FILE_NAME, 'r') as file:
24+
last_healthcheck_date_str = file.readlines()[0]
25+
26+
if parse_datetime(last_healthcheck_date_str) < timezone.now() - timedelta(seconds=settings.HEALTHCHECK_UNHEALTHY_PERIOD_S):
27+
self._return_failure()
28+
except Exception:
29+
self._return_failure()
30+
31+
@staticmethod
32+
def _return_failure():
33+
logger.warning('[django-eb-sqs] Health check failed')
34+
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: 11 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,10 @@ 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_WRITE_PERIOD_S) > last_healthcheck_time:
74+
self.write_healthcheck_file()
75+
last_healthcheck_time = timezone.now()
76+
7077
def process_messages(self, queues, worker, static_queues):
7178
# type: (list, Worker, list) -> None
7279
for queue in queues:
@@ -144,3 +151,7 @@ def get_queues_by_prefixes(self, sqs, prefixes):
144151
queues += sqs.queues.filter(QueueNamePrefix=prefix)
145152

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

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
setup(
88
name='django-eb-sqs',
9-
version='1.16',
9+
version='1.20',
1010
package_dir={'eb_sqs': 'eb_sqs'},
1111
include_package_data=True,
1212
packages=find_packages(),

0 commit comments

Comments
 (0)