summaryrefslogtreecommitdiff
path: root/python/pgq/status.py
diff options
context:
space:
mode:
Diffstat (limited to 'python/pgq/status.py')
-rw-r--r--python/pgq/status.py93
1 files changed, 93 insertions, 0 deletions
diff --git a/python/pgq/status.py b/python/pgq/status.py
new file mode 100644
index 00000000..2214045f
--- /dev/null
+++ b/python/pgq/status.py
@@ -0,0 +1,93 @@
+
+"""Status display.
+"""
+
+import sys, os, skytools
+
+def ival(data, as = None):
+ "Format interval for output"
+ if not as:
+ as = data.split('.')[-1]
+ numfmt = 'FM9999999'
+ expr = "coalesce(to_char(extract(epoch from %s), '%s') || 's', 'NULL') as %s"
+ return expr % (data, numfmt, as)
+
+class PGQStatus(skytools.DBScript):
+ def __init__(self, args, check = 0):
+ skytools.DBScript.__init__(self, 'pgqadm', args)
+
+ self.show_status()
+
+ sys.exit(0)
+
+ def show_status(self):
+ db = self.get_database("db", autocommit=1)
+ cx = db.cursor()
+
+ cx.execute("show server_version")
+ pgver = cx.fetchone()[0]
+ cx.execute("select pgq.version()")
+ qver = cx.fetchone()[0]
+ print "Postgres version: %s PgQ version: %s" % (pgver, qver)
+
+ q = """select f.queue_name, f.num_tables, %s, %s, %s,
+ q.queue_ticker_max_lag, q.queue_ticker_max_amount,
+ q.queue_ticker_idle_interval
+ from pgq.get_queue_info() f, pgq.queue q
+ where q.queue_name = f.queue_name""" % (
+ ival('f.rotation_delay'),
+ ival('f.ticker_lag'),
+ )
+ cx.execute(q)
+ event_rows = cx.dictfetchall()
+
+ q = """select queue_name, consumer_name, %s, %s, %s
+ from pgq.get_consumer_info()""" % (
+ ival('lag'),
+ ival('last_seen'),
+ )
+ cx.execute(q)
+ consumer_rows = cx.dictfetchall()
+
+ print "\n%-32s %s %9s %13s %6s" % ('Event queue',
+ 'Rotation', 'Ticker', 'TLag')
+ print '-' * 78
+ for ev_row in event_rows:
+ tck = "%s/%ss/%ss" % (ev_row['queue_ticker_max_amount'],
+ ev_row['queue_ticker_max_lag'],
+ ev_row['queue_ticker_idle_interval'])
+ rot = "%s/%s" % (ev_row['queue_ntables'], ev_row['queue_rotation_period'])
+ print "%-39s%7s %9s %13s %6s" % (
+ ev_row['queue_name'],
+ rot,
+ tck,
+ ev_row['ticker_lag'],
+ )
+ print '-' * 78
+ print "\n%-42s %9s %9s" % (
+ 'Consumer', 'Lag', 'LastSeen')
+ print '-' * 78
+ for ev_row in event_rows:
+ cons = self.pick_consumers(ev_row, consumer_rows)
+ self.show_queue(ev_row, cons)
+ print '-' * 78
+ db.commit()
+
+ def show_consumer(self, cons):
+ print " %-48s %9s %9s" % (
+ cons['consumer_name'],
+ cons['lag'], cons['last_seen'])
+ def show_queue(self, ev_row, consumer_rows):
+ print "%(queue_name)s:" % ev_row
+ for cons in consumer_rows:
+ self.show_consumer(cons)
+
+
+ def pick_consumers(self, ev_row, consumer_rows):
+ res = []
+ for con in consumer_rows:
+ if con['queue_name'] != ev_row['queue_name']:
+ continue
+ res.append(con)
+ return res
+