Source code for nameko_chassis.health
import logging
import eventlet
from nameko.rpc import Client
logger = logging.getLogger(__name__)
[docs]class ServiceTimeout(Exception):
pass
[docs]def is_service_responsive(
service_proxy: Client,
fail_gracefully=False,
timeout: float = 5,
method_name: str = "say_hello",
) -> bool:
"""
A poor man's circuit breaker for nameko service proxies.
True circuit breaker would wrap each and every RPC method and monitor
it's error rate and duration. This implementation only checks if the
service responds within ``timeout`` seconds. By default, it raises
an exception if service is unreachable. However if ``fail_gracefully``
is ``True``, function returns normally and it is up to the caller
to implement some sort of fallback mechanism.
:param service_proxy: nameko service proxy provided by ``RPCProxy``
:param fail_gracefully: if ``True``, don't raise ``ServiceTimeout``
:param timeout: timeout in seconds
:param method_name: which method to call to check if service is healthy
:raises: ServiceTimeout: if service is unresponsive and
``fail_gracefully`` is False
:return: ``True`` if service is responsive
"""
try:
with eventlet.Timeout(timeout, ServiceTimeout):
method = getattr(service_proxy, method_name)
method()
return True
except ServiceTimeout:
message = f"{service_proxy.service_name} is unreachable after {timeout} seconds"
logger.warning(message)
if fail_gracefully:
return False
else:
raise ServiceTimeout(message)