I hate Redis!
- Remove redis check from our health endpoint in prod entirely - Have the redis check have a maximum timeout of 1 second
This commit is contained in:
parent
ad53bf5671
commit
c518874ded
3 changed files with 22 additions and 10 deletions
|
@ -18,7 +18,11 @@ class RedisBuildLogs(object):
|
||||||
PHASE = 'phase'
|
PHASE = 'phase'
|
||||||
|
|
||||||
def __init__(self, redis_config):
|
def __init__(self, redis_config):
|
||||||
self._redis = redis.StrictRedis(socket_connect_timeout=5, **redis_config)
|
args = dict(redis_config)
|
||||||
|
args.update({'socket_connect_timeout': 5})
|
||||||
|
|
||||||
|
self._redis_config = redis_config
|
||||||
|
self._redis = redis.StrictRedis(**args)
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _logs_key(build_id):
|
def _logs_key(build_id):
|
||||||
|
@ -94,12 +98,16 @@ class RedisBuildLogs(object):
|
||||||
|
|
||||||
def check_health(self):
|
def check_health(self):
|
||||||
try:
|
try:
|
||||||
if not self._redis.ping() == True:
|
args = dict(self._redis_config)
|
||||||
|
args.update({'socket_connect_timeout': 1, 'socket_timeout': 1})
|
||||||
|
|
||||||
|
connection = redis.StrictRedis(**args)
|
||||||
|
if not connection.ping() == True:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
# Ensure we can write and read a key.
|
# Ensure we can write and read a key.
|
||||||
self._redis.set(self._health_key(), time.time())
|
connection.set(self._health_key(), time.time())
|
||||||
self._redis.get(self._health_key())
|
connection.get(self._health_key())
|
||||||
|
|
||||||
return True
|
return True
|
||||||
except redis.ConnectionError:
|
except redis.ConnectionError:
|
||||||
|
|
|
@ -10,16 +10,17 @@ def get_healthchecker(app, config_provider):
|
||||||
|
|
||||||
|
|
||||||
class HealthCheck(object):
|
class HealthCheck(object):
|
||||||
def __init__(self, app, config_provider):
|
def __init__(self, app, config_provider, instance_skips=None):
|
||||||
self.app = app
|
self.app = app
|
||||||
self.config_provider = config_provider
|
self.config_provider = config_provider
|
||||||
|
self.instance_skips = instance_skips or []
|
||||||
|
|
||||||
def check_instance(self):
|
def check_instance(self):
|
||||||
"""
|
"""
|
||||||
Conducts a check on this specific instance, returning a dict representing the HealthCheck
|
Conducts a check on this specific instance, returning a dict representing the HealthCheck
|
||||||
output and a number indicating the health check response code.
|
output and a number indicating the health check response code.
|
||||||
"""
|
"""
|
||||||
service_statuses = check_all_services(self.app)
|
service_statuses = check_all_services(self.app, skip=self.instance_skips)
|
||||||
return self.get_instance_health(service_statuses)
|
return self.get_instance_health(service_statuses)
|
||||||
|
|
||||||
def check_endtoend(self):
|
def check_endtoend(self):
|
||||||
|
@ -80,7 +81,7 @@ class LocalHealthCheck(HealthCheck):
|
||||||
|
|
||||||
class ProductionHealthCheck(HealthCheck):
|
class ProductionHealthCheck(HealthCheck):
|
||||||
def __init__(self, app, config_provider, access_key, secret_key, db_instance='quay'):
|
def __init__(self, app, config_provider, access_key, secret_key, db_instance='quay'):
|
||||||
super(ProductionHealthCheck, self).__init__(app, config_provider)
|
super(ProductionHealthCheck, self).__init__(app, config_provider, ['redis'])
|
||||||
self.access_key = access_key
|
self.access_key = access_key
|
||||||
self.secret_key = secret_key
|
self.secret_key = secret_key
|
||||||
self.db_instance = db_instance
|
self.db_instance = db_instance
|
||||||
|
@ -92,7 +93,7 @@ class ProductionHealthCheck(HealthCheck):
|
||||||
def get_instance_health(self, service_statuses):
|
def get_instance_health(self, service_statuses):
|
||||||
# Note: We skip the redis check because if redis is down, we don't want ELB taking the
|
# Note: We skip the redis check because if redis is down, we don't want ELB taking the
|
||||||
# machines out of service. Redis is not considered a high avaliability-required service.
|
# machines out of service. Redis is not considered a high avaliability-required service.
|
||||||
skip = ['redis']
|
skip = []
|
||||||
notes = []
|
notes = []
|
||||||
|
|
||||||
# If the database is marked as unhealthy, check the status of RDS directly. If RDS is
|
# If the database is marked as unhealthy, check the status of RDS directly. If RDS is
|
||||||
|
|
|
@ -39,10 +39,13 @@ _SERVICES = {
|
||||||
'redis': _check_redis
|
'redis': _check_redis
|
||||||
}
|
}
|
||||||
|
|
||||||
def check_all_services(app):
|
def check_all_services(app, skip):
|
||||||
""" Returns a dictionary containing the status of all the services defined. """
|
""" Returns a dictionary containing the status of all the services defined. """
|
||||||
status = {}
|
status = {}
|
||||||
for name in _SERVICES:
|
for name in _SERVICES:
|
||||||
|
if name in skip:
|
||||||
|
continue
|
||||||
|
|
||||||
status[name] = _SERVICES[name](app)
|
status[name] = _SERVICES[name](app)
|
||||||
|
|
||||||
return status
|
return status
|
||||||
|
|
Reference in a new issue