22
33import argparse
44import asyncio
5- import sys
65from typing import Any , Optional
76
7+ import geopy .geocoders
88import redis
99from geopy .geocoders import Nominatim # type: ignore[import-untyped]
1010from prometheus_client import start_http_server
11- from redis .exceptions import ConnectionError
1211
1312from .config import load_deny_list , load_motd_list , load_user_agent , random_message
1413from .formatting import format_meteogram , format_oneliner
@@ -89,7 +88,7 @@ async def handle_request(reader: asyncio.StreamReader, writer: asyncio.StreamWri
8988 imperial : bool = False
9089 beaufort : bool = False
9190 oneliner : bool = False
92- request_status : str = "success "
91+ request_status : str = "unknown "
9392
9493 with track_time (request_duration ):
9594 try :
@@ -98,7 +97,7 @@ async def handle_request(reader: asyncio.StreamReader, writer: asyncio.StreamWri
9897 screenwidth : int = 80
9998 wind_chill : bool = False
10099
101- logger .debug ("Request received" , ip = addr [0 ], input = user_input )
100+ logger .info ("Request received" , ip = addr [0 ], input = user_input )
102101
103102 # Deny list
104103 if addr [0 ] in denylist :
@@ -199,6 +198,12 @@ async def handle_request(reader: asyncio.StreamReader, writer: asyncio.StreamWri
199198 beaufort = beaufort ,
200199 wind_chill = wind_chill ,
201200 )
201+ request_status = "success"
202+
203+ except Exception as err :
204+ logger .error ("Error processing request" , error = str (err ))
205+ response = "Internal server error."
206+ request_status = "error"
202207
203208 finally :
204209 requests_total .labels (status = request_status ).inc ()
@@ -223,38 +228,21 @@ async def start_server(args: argparse.Namespace) -> None:
223228 denylist = load_deny_list ()
224229 motdlist = load_motd_list ()
225230 user_agent = load_user_agent ()
226- geolocator = Nominatim (user_agent = user_agent , timeout = 3 )
227231
228- # Connect to Redis with retry
229- logger .info ("Connecting to Redis" , host = args .redis_host , port = args .redis_port )
232+ # Set up geolocator, this outputs "Converted retries..."
233+ geopy .geocoders .options .timeout = 3 # type: ignore[attr-defined]
234+ geopy .geocoders .options .default_user_agent = user_agent # type: ignore[attr-defined]
235+ geolocator = Nominatim ()
236+
237+ # Connect to Redis
238+ logger .debug ("Connecting to Redis" , host = args .redis_host , port = args .redis_port )
230239 r = redis .Redis (host = args .redis_host , port = args .redis_port )
231- max_retries : int = 10
232- for attempt in range (max_retries ):
233- try :
234- r .ping ()
235- logger .info ("Redis connected" )
236- break
237- except ConnectionError :
238- if attempt < max_retries - 1 :
239- logger .warning (
240- "Redis not ready, retrying" ,
241- attempt = attempt + 1 ,
242- max_retries = max_retries ,
243- retry_delay = 2 ,
244- )
245- await asyncio .sleep (2 )
246- else :
247- logger .error (
248- "Unable to connect to Redis" , host = args .redis_host , port = args .redis_port
249- )
250- sys .exit (1 )
251240
252241 # Start Prometheus metrics server
253242 metrics_port : int = 9090
254243 start_http_server (metrics_port )
255- logger .info ("Prometheus metrics server started" , port = metrics_port )
244+ logger .debug ("Prometheus metrics server started" , port = metrics_port )
256245
257- logger .info ("Starting server" , port = args .port )
258246 server : asyncio .AbstractServer = await asyncio .start_server (
259247 handle_request , args .host , args .port
260248 )
0 commit comments