From d0018a8cd39d8d9b74b83655083b33be2e2b70a7 Mon Sep 17 00:00:00 2001 From: Hemna Date: Wed, 6 Nov 2024 11:38:06 -0500 Subject: [PATCH] Added rich output for dump-stats this patch adds table formatted output for the stats in the aprsd dump-stats command. You can also show the stats in raw json/dict format by passing --raw. You can also limit the sections of the stats by passing --show-section aprsdstats --- aprsd/cmds/fetch_stats.py | 142 +++++++++++++++++++++++++++++++++++++- 1 file changed, 140 insertions(+), 2 deletions(-) diff --git a/aprsd/cmds/fetch_stats.py b/aprsd/cmds/fetch_stats.py index e037371..fa235c1 100644 --- a/aprsd/cmds/fetch_stats.py +++ b/aprsd/cmds/fetch_stats.py @@ -159,9 +159,35 @@ def fetch_stats(ctx, host, port): @cli.command() @cli_helper.add_options(cli_helper.common_options) +@click.option( + "--raw", + is_flag=True, + default=False, + help="Dump raw stats instead of formatted output.", +) +@click.option( + "--show-section", + default=["All"], + help="Show specific sections of the stats. " + " Choices: All, APRSDStats, APRSDThreadList, APRSClientStats," + " PacketList, SeenList, WatchList", + multiple=True, + type=click.Choice( + [ + "All", + "APRSDStats", + "APRSDThreadList", + "APRSClientStats", + "PacketList", + "SeenList", + "WatchList", + ], + case_sensitive=False, + ), +) @click.pass_context @cli_helper.process_standard_options -def dump_stats(ctx): +def dump_stats(ctx, raw, show_section): """Dump the current stats from the running APRSD instance.""" console = Console() console.print(f"APRSD Dump-Stats started version: {aprsd.__version__}") @@ -170,4 +196,116 @@ def dump_stats(ctx): ss = StatsStore() ss.load() stats = ss.data - console.print(stats) + if raw: + if "All" in show_section: + console.print(stats) + return + else: + for section in show_section: + console.print(f"Dumping {section} section:") + console.print(stats[section]) + return + + t = Table(title="APRSD Stats") + t.add_column("Key") + t.add_column("Value") + for key, value in stats["APRSDStats"].items(): + t.add_row(key, str(value)) + + if "All" in show_section or "APRSDStats" in show_section: + console.print(t) + + # Show the thread list + t = Table(title="Thread List") + t.add_column("Name") + t.add_column("Class") + t.add_column("Alive?") + t.add_column("Loop Count") + t.add_column("Age") + for name, value in stats["APRSDThreadList"].items(): + t.add_row( + name, + value["class"], + str(value["alive"]), + str(value["loop_count"]), + str(value["age"]), + ) + + if "All" in show_section or "APRSDThreadList" in show_section: + console.print(t) + + # Show the plugins + t = Table(title="Plugin List") + t.add_column("Name") + t.add_column("Enabled") + t.add_column("Version") + t.add_column("TX") + t.add_column("RX") + for name, value in stats["PluginManager"].items(): + t.add_row( + name, + str(value["enabled"]), + value["version"], + str(value["tx"]), + str(value["rx"]), + ) + + if "All" in show_section or "PluginManager" in show_section: + console.print(t) + + # Now show the client stats + t = Table(title="Client Stats") + t.add_column("Key") + t.add_column("Value") + for key, value in stats["APRSClientStats"].items(): + t.add_row(key, str(value)) + + if "All" in show_section or "APRSClientStats" in show_section: + console.print(t) + + # now show the packet list + packet_list = stats.get("PacketList") + t = Table(title="Packet List") + t.add_column("Key") + t.add_column("Value") + t.add_row("Total Received", str(packet_list["rx"])) + t.add_row("Total Sent", str(packet_list["tx"])) + + if "All" in show_section or "PacketList" in show_section: + console.print(t) + + # now show the seen list + seen_list = stats.get("SeenList") + sorted_seen_list = sorted( + seen_list.items(), + ) + t = Table(title="Seen List") + t.add_column("Callsign") + t.add_column("Message Count") + t.add_column("Last Heard") + for key, value in sorted_seen_list: + t.add_row( + key, + str(value["count"]), + str(value["last"]), + ) + + if "All" in show_section or "SeenList" in show_section: + console.print(t) + + # now show the watch list + watch_list = stats.get("WatchList") + sorted_watch_list = sorted( + watch_list.items(), + ) + t = Table(title="Watch List") + t.add_column("Callsign") + t.add_column("Last Heard") + for key, value in sorted_watch_list: + t.add_row( + key, + str(value["last"]), + ) + + if "All" in show_section or "WatchList" in show_section: + console.print(t)