From 33995b8cae5cfde73419b38436623b5879b1e1b3 Mon Sep 17 00:00:00 2001 From: Dalena Date: Fri, 17 Jan 2025 14:03:40 -0500 Subject: [PATCH 1/3] fix: cluster bot logs --- silverback/_cli.py | 22 +++++++++++++++------- silverback/cluster/client.py | 16 +++++++++++++--- 2 files changed, 28 insertions(+), 10 deletions(-) diff --git a/silverback/_cli.py b/silverback/_cli.py index b3b65677..0d75030f 100644 --- a/silverback/_cli.py +++ b/silverback/_cli.py @@ -1068,13 +1068,14 @@ def list_bots(cluster: "ClusterClient"): @bots.command(name="info", section="Configuration Commands") -@click.argument("bot_name", metavar="BOT") +@click.option("-n", "--network") +@click.argument("name", metavar="BOT") @cluster_client -def bot_info(cluster: "ClusterClient", bot_name: str): +def bot_info(cluster: "ClusterClient", name: str, network: str): """Get configuration information of a BOT in a CLUSTER""" - if not (bot := cluster.bots.get(bot_name)): - raise click.UsageError(f"Unknown bot '{bot_name}'.") + if not (bot := cluster.get_bot(network=network, name=name)): + raise click.UsageError(f"Unknown bot '{name}'.") # NOTE: Skip machine `.id`, and we already know it is `.name` bot_dump = bot.model_dump( @@ -1265,15 +1266,22 @@ def stop_bot(cluster: "ClusterClient", name: str): help="Return logs since N ago.", callback=timedelta_callback, ) +@click.option("-n", "--network", required=True) @cluster_client -def show_bot_logs(cluster: "ClusterClient", name: str, log_level: str, since: timedelta | None): +def show_bot_logs( + cluster: "ClusterClient", + name: str, + network: str, + log_level: str, + since: timedelta | None +): """Show runtime logs for BOT in CLUSTER""" start_time = None if since: start_time = datetime.now(tz=timezone.utc) - since - if not (bot := cluster.bots.get(name)): + if not (bot := cluster.get_bot(network=network, name=name)): raise click.UsageError(f"Unknown bot '{name}'.") try: @@ -1281,7 +1289,7 @@ def show_bot_logs(cluster: "ClusterClient", name: str, log_level: str, since: ti except KeyError: level = LogLevel.INFO - for log in bot.filter_logs(log_level=level, start_time=start_time): + for log in bot.filter_logs(network=network, log_level=level, start_time=start_time): click.echo(log) diff --git a/silverback/cluster/client.py b/silverback/cluster/client.py index 0adb0399..757708a4 100644 --- a/silverback/cluster/client.py +++ b/silverback/cluster/client.py @@ -192,11 +192,12 @@ def errors(self) -> list[str]: def filter_logs( self, + network: str, log_level: LogLevel = LogLevel.INFO, start_time: datetime | None = None, end_time: datetime | None = None, ) -> list[BotLogEntry]: - query = {"log_level": log_level.name} + log_level = "INFO" if start_time: query["start_time"] = start_time.isoformat() @@ -204,9 +205,13 @@ def filter_logs( if end_time: query["end_time"] = end_time.isoformat() - response = self.cluster.get(f"/bots/{self.name}/logs", params=query, timeout=120) + response = self.cluster.get(f"/bots/network/{network}/name/{self.name}/logs", timeout=120) handle_error_with_response(response) - return [BotLogEntry.model_validate(log) for log in response.json()] + response_data = response.json() + logs_data = response.json().get('logs', {}) + log_query = [log for logs in logs_data.values() for log in logs if log.startswith(log_level)] + breakpoint() + return log_query @property def logs(self) -> list[BotLogEntry]: @@ -296,6 +301,11 @@ def bots(self) -> dict[str, Bot]: handle_error_with_response(response) return {bot.name: bot for bot in map(Bot.model_validate, response.json())} + def get_bot(self, name: str, network: str): + response = self.get(f"/bots/network/{network}/name/{name}") + handle_error_with_response(response) + return Bot.model_validate(response.json()) + def new_bot( self, name: str, From 222d2bd5e2a4f708e969010a748e0bb70e7bf59e Mon Sep 17 00:00:00 2001 From: Dalena Date: Fri, 17 Jan 2025 14:09:33 -0500 Subject: [PATCH 2/3] chore: remove breakpoint --- silverback/cluster/client.py | 1 - 1 file changed, 1 deletion(-) diff --git a/silverback/cluster/client.py b/silverback/cluster/client.py index 75748f2d..65dd5125 100644 --- a/silverback/cluster/client.py +++ b/silverback/cluster/client.py @@ -211,7 +211,6 @@ def filter_logs( response_data = response.json() logs_data = response.json().get('logs', {}) log_query = [log for logs in logs_data.values() for log in logs if log.startswith(log_level)] - breakpoint() return log_query @property From 3e9937ea52f2ec1c97f96aca8383e06e70913ed7 Mon Sep 17 00:00:00 2001 From: Dalena Date: Fri, 17 Jan 2025 14:11:28 -0500 Subject: [PATCH 3/3] chore: remove heading --- silverback/cluster/client.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/silverback/cluster/client.py b/silverback/cluster/client.py index 65dd5125..269b4bfd 100644 --- a/silverback/cluster/client.py +++ b/silverback/cluster/client.py @@ -301,12 +301,11 @@ def bots(self) -> dict[str, Bot]: handle_error_with_response(response) return {bot.name: bot for bot in map(Bot.model_validate, response.json())} -<<<<<<< HEAD def get_bot(self, name: str, network: str): response = self.get(f"/bots/network/{network}/name/{name}") handle_error_with_response(response) return Bot.model_validate(response.json()) -======= + def bots_list(self) -> dict[str, list[Bot]]: response = self.get("/bots") handle_error_with_response(response) @@ -314,7 +313,6 @@ def bots_list(self) -> dict[str, list[Bot]]: for bot in map(Bot.model_validate, response.json()): bots_dict[bot.name].append(bot) return dict(bots_dict) ->>>>>>> upstream/main def new_bot( self,