mirror of
https://github.com/django-q2/django-q2.git
synced 2026-09-29 15:58:11 +08:00
85 lines
3.9 KiB
Python
85 lines
3.9 KiB
Python
# Django
|
|
from django.core.management.base import BaseCommand
|
|
from django.utils import timezone
|
|
|
|
# External
|
|
from blessed import Terminal
|
|
|
|
# Local
|
|
from django_q.core import Stat, redis_client
|
|
from django_q.conf import Conf
|
|
|
|
# TODO add name argument to monitor different clusters
|
|
|
|
class Command(BaseCommand):
|
|
help = "Monitors cluster activity"
|
|
|
|
def handle(self, *args, **options):
|
|
monitor()
|
|
|
|
|
|
def monitor(run_once=False):
|
|
term = Terminal()
|
|
r = redis_client
|
|
with term.fullscreen(), term.hidden_cursor(), term.cbreak():
|
|
val = None
|
|
start_width = int(term.width / 8)
|
|
while val not in (u'q', u'Q',):
|
|
col_width = int(term.width / 8)
|
|
# In case of resize
|
|
if col_width != start_width:
|
|
print(term.clear)
|
|
start_width = col_width
|
|
print(term.move(0, 0) + term.black_on_green(term.center('Host', width=col_width - 1)))
|
|
print(term.move(0, 1 * col_width) + term.black_on_green(term.center('Id', width=col_width - 1)))
|
|
print(term.move(0, 2 * col_width) + term.black_on_green(term.center('Status', width=col_width - 1)))
|
|
print(term.move(0, 3 * col_width) + term.black_on_green(term.center('Pool', width=col_width - 1)))
|
|
print(term.move(0, 4 * col_width) + term.black_on_green(term.center('TQ', width=col_width - 1)))
|
|
print(term.move(0, 5 * col_width) + term.black_on_green(term.center('RQ', width=col_width - 1)))
|
|
print(term.move(0, 6 * col_width) + term.black_on_green(term.center('RC', width=col_width - 1)))
|
|
print(term.move(0, 7 * col_width) + term.black_on_green(term.center('Up', width=col_width - 1)))
|
|
i = 2
|
|
stats = Stat.get_all(r=r)
|
|
print(term.clear_eos())
|
|
for stat in stats:
|
|
# color status
|
|
if stat.status == Conf.WORKING:
|
|
status = term.green(Conf.WORKING)
|
|
elif stat.status == Conf.STOPPED:
|
|
status = term.red(Conf.STOPPED)
|
|
elif stat.status == Conf.IDLE:
|
|
status = Conf.IDLE
|
|
else:
|
|
status = term.yellow(stat.status)
|
|
# color q's
|
|
tasks = stat.task_q_size
|
|
if tasks > 0:
|
|
tasks = term.cyan(str(tasks))
|
|
results = stat.done_q_size
|
|
if results > 0:
|
|
results = term.cyan(str(results))
|
|
# color workers
|
|
workers = len(stat.workers)
|
|
if workers < Conf.WORKERS:
|
|
workers = term.yellow(str(workers))
|
|
# format uptime
|
|
uptime = (timezone.now() - stat.tob).total_seconds()
|
|
hours, remainder = divmod(uptime, 3600)
|
|
minutes, seconds = divmod(remainder, 60)
|
|
uptime = '%d:%02d:%02d' % (hours, minutes, seconds)
|
|
# print to the terminal
|
|
print(term.move(i, 0) + term.center(stat.host[:col_width - 1], width=col_width - 1))
|
|
print(term.move(i, 1 * col_width) + term.center(stat.cluster_id, width=col_width - 1))
|
|
print(term.move(i, 2 * col_width) + term.center(status, width=col_width - 1))
|
|
print(term.move(i, 3 * col_width) + term.center(workers, width=col_width - 1))
|
|
print(term.move(i, 4 * col_width) + term.center(tasks, width=col_width - 1))
|
|
print(term.move(i, 5 * col_width) + term.center(results, width=col_width - 1))
|
|
print(term.move(i, 6 * col_width) + term.center(stat.reincarnations, width=col_width - 1))
|
|
print(term.move(i, 7 * col_width) + term.center(uptime, width=col_width - 1))
|
|
i += 1
|
|
# for testing
|
|
if run_once:
|
|
return Stat.get_all(r=r)
|
|
print(term.move(i + 2, 0) + term.center('[Press q to quit]'))
|
|
val = term.inkey(timeout=1)
|