diff --git a/handlers/docker.py b/handlers/docker.py index 3c18583..39f4ddf 100644 --- a/handlers/docker.py +++ b/handlers/docker.py @@ -100,16 +100,36 @@ async def dstats(msg: Message): await msg.answer("📈 Stats\n\n(no data)", reply_markup=docker_kb) return + alias_by_name = {v: k for k, v in DOCKER_MAP.items()} rows = [] for line in lines: parts = line.split("|") if len(parts) != 5: continue - name, cpu, mem, net, blk = parts - rows.append(f"{name}: CPU {cpu}, MEM {mem}, NET {net}, IO {blk}") + name, cpu, mem, net, blk = [p.strip() for p in parts] + display = alias_by_name.get(name, name) + try: + cpu_val = float(cpu.strip("%")) + except ValueError: + cpu_val = 0.0 + rows.append((cpu_val, display, cpu, mem, net, blk)) - body = "\n".join(rows) if rows else "(no data)" - await msg.answer(f"📈 **Docker stats**\n```\n{body}\n```", reply_markup=docker_kb, parse_mode="Markdown") + if not rows: + await msg.answer("📈 Stats\n\n(no data)", reply_markup=docker_kb) + return + + rows.sort(key=lambda r: r[0], reverse=True) + header = f"{'NAME':<18} {'CPU':>6} {'MEM':>18} {'NET':>16} {'IO':>16}" + formatted = [header] + for _cpu_val, name, cpu, mem, net, blk in rows: + formatted.append(f"{name[:18]:<18} {cpu:>6} {mem:>18} {net:>16} {blk:>16}") + + body = "\n".join(formatted) + await msg.answer( + f"📈 **Docker stats**\n```\n{body}\n```", + reply_markup=docker_kb, + parse_mode="Markdown", + ) @dp.message(F.text, F.func(lambda msg: msg.from_user and msg.from_user.id in LOG_FILTER_PENDING))