| #!/usr/bin/env python | |
| # coding: UTF-8 | |
| # pt-replication-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 ReplicationStatistics: | |
| def __init__(self, psql, debug=False): | |
| self.debug = debug | |
| self.psql = psql | |
| self.header = None | |
| def get(self): | |
| if self.psql.get_version() == 9.0: | |
| log.error("PostgreSQL 9.0 is not supported.") | |
| sys.exit(1) | |
| pidcol = "pid" | |
| if self.psql.get_version() == 9.1: | |
| pidcol = "procpid" | |
| query = ' \ | |
| select null as "PID", \ | |
| null as "NAME", \ | |
| null as "HOST", \ | |
| null as "PORT", \ | |
| \'local\' as "STATE", \ | |
| pg_current_xlog_insert_location() as "SENT", \ | |
| pg_current_xlog_location() as "WRITTTEN", \ | |
| null as "FLUSHED", \ | |
| null as "REPLAYED", \ | |
| null as "PRI", \ | |
| \'master\' as "MODE" \ | |
| union all \ | |
| select %s, \ | |
| application_name as name, \ | |
| client_addr as addr, \ | |
| client_port as port, \ | |
| state, \ | |
| sent_location as sent, \ | |
| write_location as write, \ | |
| flush_location as flush, \ | |
| replay_location as reply, \ | |
| sync_priority as pri, \ | |
| sync_state as mode \ | |
| from pg_stat_replication \ | |
| ;' % pidcol | |
| log.debug(query) | |
| rs = p.execute_query(query) | |
| if rs is None or len(rs) == 0: | |
| log.error("Cannot retreive statitics from the server. Connecting to wrong server?") | |
| sys.exit(1) | |
| else: | |
| p.print_result(rs) | |
| 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 " -U, --username=USERNAME User name to connect" | |
| print " -d, --dbname=DBNAME Database name to connect" | |
| print "" | |
| print " --help Print this help." | |
| print "" | |
| if __name__ == "__main__": | |
| try: | |
| opts, args = getopt.getopt(sys.argv[1:], "h:p:U:d:", | |
| ["help", "debug", "host=", "port=", "username=", "dbname="]) | |
| except getopt.GetoptError, err: | |
| print str(err) | |
| usage() | |
| sys.exit(2) | |
| host = None | |
| port = 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 ("-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]) | |
| p = PsqlWrapper.PsqlWrapper(host=host, port=port, username=username, dbname=dbname, debug=debug) | |
| i = 0 | |
| while True: | |
| os.system("date") | |
| stat = ReplicationStatistics(p, debug=debug) | |
| stat.get() | |
| i = i + 1 | |
| 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) |