| #!/usr/bin/env python |
| # coding: UTF-8 |
| |
| # pt-xact-stat |
| # |
| # Copyright(c) 2015 Uptime Technologies, LLC. |
| |
| import sys, os |
| libpath = os.path.abspath(os.path.dirname(sys.argv[0]) + "/../lib") |
| sys.path.append(libpath) |
| |
| import copy |
| import getopt |
| import time |
| |
| import log |
| import PsqlWrapper |
| |
| class TransactionStatistics: |
| def __init__(self, psql, debug=False): |
| self.debug = debug |
| self.psql = psql |
| self.header = None |
| |
| def get(self): |
| data = [] |
| |
| for p in self.psql: |
| log.debug("get: " + p.host) |
| |
| query = ' \ |
| select \'%s\' as "HOST", \ |
| \'%d\' as "PORT", \ |
| datname as "DBNAME", \ |
| numbackends as "CONN", \ |
| xact_commit as "COMMITS", \ |
| xact_rollback as "ROLLBACKS", \ |
| blks_read AS "B_READ", \ |
| blks_hit as "B_HIT" \ |
| from pg_stat_database \ |
| where datname = current_database() \ |
| ;' % (p.host, p.port) |
| |
| log.debug(query) |
| |
| rs = p.execute_query(query, ignore_error=True) |
| if rs is None: |
| r = [] |
| r.append(p.host) |
| r.append(str(p.port)) |
| r.append(p.dbname) |
| data.append(r) |
| else: |
| if self.header is None: |
| self.header = rs[0] |
| log.debug(self.header) |
| |
| data.append(rs[1]) |
| log.debug(data) |
| |
| if self.header is None: |
| log.error("Cannot connect to any server.") |
| sys.exit(1) |
| |
| for d in data: |
| while len(d) < len(self.header): |
| d.append("") |
| log.debug(d) |
| |
| data.insert(0, self.header) |
| p.print_result(data) |
| print("") |
| |
| return True |
| |
| def usage(): |
| print "" |
| print "Usage: " + os.path.basename(sys.argv[0]) + " [option...] [delay [count]]" |
| print "" |
| print "Options:" |
| print " -h, --host=HOSTNAME Host name of the postgres server" |
| print " -p, --port=PORT Port number of the postgres server" |
| print " -H, --host-list=HOSTLIST List of pairs of hostname and port number" |
| print " (c.f. host1:port1,host2:port2)" |
| print " -U, --username=USERNAME User name to connect" |
| print " -d, --dbname=DBNAME Database name to connect" |
| print "" |
| print " --help Print this help." |
| print "" |
| |
| def parse_host_list(s): |
| host_list = [] |
| for h in s.split(','): |
| hp = h.split(':') |
| |
| a = []; |
| if len(hp) == 2: |
| a.append(hp[0]) |
| a.append(int(hp[1])) |
| if len(hp) == 1: |
| a.append(hp[0]) |
| a.append(PsqlWrapper.get_port(None)) |
| |
| log.debug("host" + str(a)) |
| host_list.append(a) |
| |
| log.debug("host_list: " + str(host_list)) |
| |
| return host_list |
| |
| if __name__ == "__main__": |
| try: |
| opts, args = getopt.getopt(sys.argv[1:], "h:p:H:U:d:", |
| ["help", "debug", "host=", "port=", "host-list=", "username=", "dbname="]) |
| except getopt.GetoptError, err: |
| print str(err) |
| usage() |
| sys.exit(2) |
| |
| host = None |
| port = None |
| host_list = None |
| username = None |
| dbname = None |
| |
| debug = None |
| |
| for o, a in opts: |
| if o in ("-h", "--host"): |
| host = a |
| elif o in ("-p", "--port"): |
| port = int(a) |
| elif o in ("-H", "--host-list"): |
| host_list = a |
| elif o in ("-U", "--username"): |
| username = a |
| elif o in ("-d", "--dbname"): |
| dbname = a |
| elif o in ("--debug"): |
| log.setLevel(log.DEBUG) |
| debug = True |
| elif o in ("--help"): |
| usage() |
| sys.exit(0) |
| else: |
| print "unknown option: " + o + "," + a |
| sys.exit(1) |
| |
| delay = None |
| count = None |
| |
| if len(args) >= 1: |
| delay = int(args[0]) |
| if len(args) >= 2: |
| count = int(args[1]) |
| |
| psql_array = [] |
| |
| if host_list is not None: |
| for h in parse_host_list(host_list): |
| log.debug("foo" + str(h)) |
| p = PsqlWrapper.PsqlWrapper(host=h[0], port=h[1], username=username, dbname=dbname, debug=debug) |
| psql_array.append(p) |
| else: |
| p = PsqlWrapper.PsqlWrapper(host=host, port=port, username=username, dbname=dbname, debug=debug) |
| psql_array.append(p) |
| |
| i = 0 |
| while True: |
| os.system("date") |
| stat = TransactionStatistics(psql_array, debug=debug) |
| stat.get() |
| i = i + 1 |
| |
| # just print once, and exit. |
| if delay is None: |
| break |
| |
| if count is not None and i >= count: |
| break |
| |
| try: |
| time.sleep(delay) |
| except KeyboardInterrupt, err: |
| log.info("Terminated.") |
| break |
| |
| sys.exit(0) |