From f17b6653d959893729391839d1d97e5ed4d8d28a Mon Sep 17 00:00:00 2001 From: Ayaz Abbas Date: Thu, 9 May 2024 17:09:28 +0100 Subject: [PATCH] ensure the fields are included in the log record as json --- pyth_observer/check/price_feed.py | 12 ++++++------ pyth_observer/check/publisher.py | 10 +++++----- pyth_observer/event.py | 12 ++++-------- 3 files changed, 15 insertions(+), 19 deletions(-) diff --git a/pyth_observer/check/price_feed.py b/pyth_observer/check/price_feed.py index 89b05ba..a6e287a 100644 --- a/pyth_observer/check/price_feed.py +++ b/pyth_observer/check/price_feed.py @@ -42,7 +42,7 @@ def state(self) -> PriceFeedState: def run(self) -> bool: ... - def error_message(self) -> str: + def error_message(self) -> dict: ... @@ -80,7 +80,7 @@ def run(self) -> bool: # Fail return False - def error_message(self) -> str: + def error_message(self) -> dict: distance = self.__state.latest_block_slot - self.__state.latest_trading_slot return { "msg": f"{self.__state.symbol} is offline (either non-trading/stale). Last update {distance} slots ago.", @@ -124,7 +124,7 @@ def run(self) -> bool: # Fail return False - def error_message(self) -> str: + def error_message(self) -> dict: return { "msg": f"{self.__state.symbol} is too far from Coingecko's price.", "type": "PriceFeedCheck", @@ -154,7 +154,7 @@ def run(self) -> bool: # Fail return False - def error_message(self) -> str: + def error_message(self) -> dict: return { "msg": f"{self.__state.symbol} confidence interval is too low.", "type": "PriceFeedCheck", @@ -204,7 +204,7 @@ def run(self) -> bool: # Fail return False - def error_message(self) -> str: + def error_message(self) -> dict: if self.__state.crosschain_price: publish_time = arrow.get(self.__state.crosschain_price["publish_time"]) else: @@ -263,7 +263,7 @@ def run(self) -> bool: # Fail return False - def error_message(self) -> str: + def error_message(self) -> dict: # It can never happen because of the check logic but linter could not understand it. price = ( self.__state.crosschain_price["price"] diff --git a/pyth_observer/check/publisher.py b/pyth_observer/check/publisher.py index 48202b1..eb38691 100644 --- a/pyth_observer/check/publisher.py +++ b/pyth_observer/check/publisher.py @@ -38,7 +38,7 @@ def state(self) -> PublisherState: def run(self) -> bool: ... - def error_message(self) -> str: + def error_message(self) -> dict: ... @@ -78,7 +78,7 @@ def run(self) -> bool: # Fail return False - def error_message(self) -> str: + def error_message(self) -> dict: diff = self.__state.price - self.__state.price_aggregate intervals_away = abs(diff / self.__state.confidence_interval_aggregate) return { @@ -116,7 +116,7 @@ def run(self) -> bool: # Fail return False - def error_message(self) -> str: + def error_message(self) -> dict: return { "msg": f"{self.__state.publisher_name} confidence interval is too tight.", "type": "PublisherCheck", @@ -150,7 +150,7 @@ def run(self) -> bool: # Fail return False - def error_message(self) -> str: + def error_message(self) -> dict: distance = self.__state.latest_block_slot - self.__state.slot return { "msg": f"{self.__state.publisher_name} hasn't published recently for {distance} slots.", @@ -198,7 +198,7 @@ def run(self) -> bool: # Fail return False - def error_message(self) -> str: + def error_message(self) -> dict: deviation = (self.ci_adjusted_price_diff() / self.__state.price_aggregate) * 100 return { "msg": f"{self.__state.publisher_name} price is too far from aggregate price.", diff --git a/pyth_observer/event.py b/pyth_observer/event.py index c960cda..e7c0968 100644 --- a/pyth_observer/event.py +++ b/pyth_observer/event.py @@ -1,4 +1,5 @@ import os +import sys from typing import Dict, Literal, Protocol, TypedDict, cast import aiohttp @@ -16,7 +17,6 @@ load_dotenv() - class Context(TypedDict): network: str publishers: Dict[str, Publisher] @@ -84,9 +84,6 @@ async def send(self): ) -LogEventLevel = Literal["DEBUG", "INFO", "WARNING", "ERROR"] - - class LogEvent(Event): def __init__(self, check: Check, context: Context): self.check = check @@ -95,10 +92,9 @@ def __init__(self, check: Check, context: Context): async def send(self): # Publisher checks expect the key -> name mapping of publishers when # generating the error title/message. - text = self.check.error_message() - - level = cast(LogEventLevel, os.environ.get("LOG_EVENT_LEVEL", "INFO")) - logger.log(level, text) + event = self.check.error_message() + with logger.contextualize(**event): + logger.info(event["msg"]) class TelegramEvent(Event):