aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Hassan Abouelela <[email protected]>2021-02-25 12:59:37 +0300
committerGravatar Hassan Abouelela <[email protected]>2021-02-25 12:59:37 +0300
commit866f3156cb05e49a8ca2c9ebdb13688829f15914 (patch)
tree7d45d848bf0a753551420ba7d8aeb38ca940fe3e
parentAdds More Descriptive Startup Error Messages (diff)
Adds Site Readiness Checks
Attempts to connect to the site multiple times before throwing an exception to allow the site to warm up when running in docker. Signed-off-by: Hassan Abouelela <[email protected]>
-rw-r--r--bot/bot.py21
-rw-r--r--bot/constants.py2
-rw-r--r--config-default.yml2
3 files changed, 25 insertions, 0 deletions
diff --git a/bot/bot.py b/bot/bot.py
index df80868ee..cd8e26325 100644
--- a/bot/bot.py
+++ b/bot/bot.py
@@ -89,6 +89,22 @@ class Bot(commands.Bot):
for item in full_cache:
self.insert_item_into_filter_list_cache(item)
+ async def ping_services(self) -> None:
+ """A helper to make sure all the services the bot relies on are available on startup."""
+ # Connect Site/API
+ attempts = 0
+ while True:
+ try:
+ log.info(f"Attempting site connection: {attempts + 1}/{constants.URLs.connect_max_retries}")
+ await self.api_client.get("healthcheck")
+ break
+
+ except aiohttp.ClientConnectorError as e:
+ attempts += 1
+ if attempts == constants.URLs.connect_max_retries:
+ raise e
+ await asyncio.sleep(constants.URLs.connect_cooldown)
+
@classmethod
def create(cls) -> "Bot":
"""Create and return an instance of a Bot."""
@@ -231,6 +247,11 @@ class Bot(commands.Bot):
# here. Normally, this shouldn't happen.
await self.redis_session.connect()
+ try:
+ await self.ping_services()
+ except Exception as e:
+ raise StartupError(e)
+
# Build the FilterList cache
await self.cache_filter_list_data()
diff --git a/bot/constants.py b/bot/constants.py
index 69bc82b89..7cf31e835 100644
--- a/bot/constants.py
+++ b/bot/constants.py
@@ -531,6 +531,8 @@ class URLs(metaclass=YAMLGetter):
github_bot_repo: str
# Base site vars
+ connect_max_retries: int
+ connect_cooldown: int
site: str
site_api: str
site_schema: str
diff --git a/config-default.yml b/config-default.yml
index 7d9afaa0e..a9fb2262e 100644
--- a/config-default.yml
+++ b/config-default.yml
@@ -338,6 +338,8 @@ keys:
urls:
# PyDis site vars
+ connect_max_retries: 3
+ connect_cooldown: 5
site: &DOMAIN "pythondiscord.com"
site_api: &API "pydis-api.default.svc.cluster.local"
site_api_schema: "http://"