Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: cluster bot logs #189

Draft
wants to merge 4 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 15 additions & 7 deletions silverback/_cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -1089,13 +1089,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(
Expand Down Expand Up @@ -1286,23 +1287,30 @@ 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:
level = LogLevel.__dict__[log_level.upper()]
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)


Expand Down
15 changes: 12 additions & 3 deletions silverback/cluster/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -193,21 +193,25 @@ 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()

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)]
return log_query

@property
def logs(self) -> list[BotLogEntry]:
Expand Down Expand Up @@ -297,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 bots_list(self) -> dict[str, list[Bot]]:
response = self.get("/bots")
handle_error_with_response(response)
Expand Down
Loading