Skip to content

Commit

Permalink
Add ping endpoint, closes #155
Browse files Browse the repository at this point in the history
  • Loading branch information
dougppaz committed Jul 9, 2018
1 parent 72de5fa commit b4f1648
Show file tree
Hide file tree
Showing 6 changed files with 65 additions and 0 deletions.
Empty file added bothub/health/__init__.py
Empty file.
5 changes: 5 additions & 0 deletions bothub/health/apps.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
from django.apps import AppConfig


class HealthConfig(AppConfig):
name = 'health'
23 changes: 23 additions & 0 deletions bothub/health/checks.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
def check_database_connection(**kwargs):
from django.db import connections
from django.db.utils import OperationalError
db_conn = connections['default']
if not db_conn:
return False
try:
db_conn.cursor()
return True
except OperationalError as e:
return False


def check_accessible_api(request, **kwargs):
import requests
HTTP_HOST = request.META.get('HTTP_HOST')
repositories_url = 'http://{}/api/repositories/'.format(HTTP_HOST)
request = requests.get(repositories_url)
try:
request.raise_for_status()
return True
except requests.HTTPError as e:
return False
1 change: 1 addition & 0 deletions bothub/health/tests.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# from django.test import TestCase
34 changes: 34 additions & 0 deletions bothub/health/views.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
from collections import OrderedDict
from functools import reduce

from django.http import HttpResponse
from rest_framework import status

from .checks import check_database_connection
from .checks import check_accessible_api

CHECKS = [
check_database_connection,
check_accessible_api,
]


def ping(request):
checks_status = OrderedDict(map(
lambda check: (check.__name__, check(request=request)),
CHECKS))
healthy = reduce(
lambda current, status: current and status,
checks_status.values(),
True)
content = '{}\n{}'.format(
'OK' if healthy else 'something wrong happened',
'\n'.join(map(
lambda x: '{}: {}'.format(*x),
checks_status.items())))
status_code = status.HTTP_200_OK \
if healthy else status.HTTP_503_SERVICE_UNAVAILABLE
return HttpResponse(
content=content,
content_type='text/plain',
status=status_code)
2 changes: 2 additions & 0 deletions bothub/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,14 @@
from rest_framework.documentation import include_docs_urls

from bothub.api.routers import router as bothub_api_routers
from bothub.health.views import ping


urlpatterns = [
path('api/', include(bothub_api_routers.urls)),
path('docs/', include_docs_urls(title='API Documentation')),
path('admin/', admin.site.urls),
path('ping/', ping, name='ping'),
]

if settings.DEBUG:
Expand Down

0 comments on commit b4f1648

Please sign in to comment.