Browse Source

Merge pull request #9 from BetterWorks/parallelAlert

sendalerts concurrently
pull/10/head
Pēteris Caune 9 years ago
parent
commit
4e53e06418
5 changed files with 32 additions and 23 deletions
  1. +0
    -0
      hc/api/management/__init__.py
  2. +0
    -0
      hc/api/management/commands/__init__.py
  3. +25
    -17
      hc/api/management/commands/sendalerts.py
  4. +3
    -3
      hc/api/models.py
  5. +4
    -3
      requirements.txt

+ 0
- 0
hc/api/management/__init__.py View File


+ 0
- 0
hc/api/management/commands/__init__.py View File


+ 25
- 17
hc/api/management/commands/sendalerts.py View File

@ -2,12 +2,14 @@ import logging
import sys import sys
import time import time
from concurrent.futures import ThreadPoolExecutor
from django.core.management.base import BaseCommand from django.core.management.base import BaseCommand
from django.db import connection
from django.db.models import Q from django.db.models import Q
from django.utils import timezone from django.utils import timezone
from hc.api.models import Check from hc.api.models import Check
executor = ThreadPoolExecutor(max_workers=10)
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -16,26 +18,31 @@ def _stdout(message):
sys.stdout.flush() sys.stdout.flush()
def handle_one():
""" Send an alert for a single check.
Return True if an appropriate check was selected and processed.
Return False if no checks need to be processed.
"""
def handle_many():
""" Send alerts for many checks simultaneously. """
query = Check.objects.filter(user__isnull=False) query = Check.objects.filter(user__isnull=False)
now = timezone.now() now = timezone.now()
going_down = Q(alert_after__lt=now, status="up") going_down = Q(alert_after__lt=now, status="up")
going_up = Q(alert_after__gt=now, status="down") going_up = Q(alert_after__gt=now, status="down")
query = query.filter(going_down | going_up) query = query.filter(going_down | going_up)
try:
check = query[0]
except IndexError:
checks = list(query.iterator())
if not checks:
return False return False
for future in [executor.submit(handle_one, check) for check in checks]:
future.result()
return True
def handle_one(check):
""" Send an alert for a single check.
Return True if an appropriate check was selected and processed.
Return False if no checks need to be processed.
"""
check.status = check.get_status() check.status = check.get_status()
tmpl = "\nSending alert, status=%s, code=%s\n" tmpl = "\nSending alert, status=%s, code=%s\n"
@ -54,6 +61,7 @@ def handle_one():
check.status = "paused" check.status = "paused"
finally: finally:
check.save() check.save()
connection.close()
return True return True
@ -65,10 +73,10 @@ class Command(BaseCommand):
ticks = 0 ticks = 0
while True: while True:
success = True
while success:
success = handle_one()
ticks = 0 if success else ticks + 1
if handle_many():
ticks = 0
else:
ticks += 1
time.sleep(1) time.sleep(1)
_stdout(".") _stdout(".")


+ 3
- 3
hc/api/models.py View File

@ -143,7 +143,7 @@ class Channel(models.Model):
"icon_url": "https://healthchecks.io/static/img/[email protected]" "icon_url": "https://healthchecks.io/static/img/[email protected]"
} }
r = requests.post(self.value, json=payload)
r = requests.post(self.value, json=payload, timeout=5)
n.status = r.status_code n.status = r.status_code
n.save() n.save()
@ -155,7 +155,7 @@ class Channel(models.Model):
"color": "green" if check.status == "up" else "red", "color": "green" if check.status == "up" else "red",
} }
r = requests.post(self.value, json=payload)
r = requests.post(self.value, json=payload, timeout=5)
n.status = r.status_code n.status = r.status_code
n.save() n.save()
@ -179,7 +179,7 @@ class Channel(models.Model):
} }
url = "https://events.pagerduty.com/generic/2010-04-15/create_event.json" url = "https://events.pagerduty.com/generic/2010-04-15/create_event.json"
r = requests.post(url, data=json.dumps(payload))
r = requests.post(url, data=json.dumps(payload), timeout=5)
n.status = r.status_code n.status = r.status_code
n.save() n.save()


+ 4
- 3
requirements.txt View File

@ -1,9 +1,10 @@
Django==1.8.2
django_compressor
django-appconf django-appconf
django-ses-backend django-ses-backend
psycopg2==2.6
Django==1.8.2
django_compressor
djmail djmail
futures
premailer premailer
psycopg2==2.6
pygments pygments
requests requests

Loading…
Cancel
Save