-
Notifications
You must be signed in to change notification settings - Fork 8
/
pgbouncer.py
102 lines (77 loc) · 2.8 KB
/
pgbouncer.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
import glob
import psycopg2
import psycopg2.extras
import re
from porkchop.plugin import PorkchopPlugin
def exc(conn, query, col_key = None, col_val = None):
data = {}
cursor = conn.cursor(cursor_factory=psycopg2.extras.DictCursor)
cursor.execute(query)
if col_key and col_val:
for row in cursor.fetchall():
data[row[col_key]] = row[col_val]
else:
data = cursor.fetchall()
return data
class PgbouncerPlugin(PorkchopPlugin):
def _connect(self, **kwargs):
host = kwargs.get('host', 'localhost')
port = kwargs.get('port', '6432')
user = kwargs.get('user', 'psql')
password = kwargs.get('password', '')
try:
conn_string = "host='%s' port='%s' dbname='pgbouncer' user='%s'\
password='%s'" % (host, port, user, password)
conn = psycopg2.connect(conn_string)
conn.set_isolation_level(0) # don't need transactions
except:
return None
return conn
def get_data(self):
data = self.gendict()
instances = self._get_instances()
for instance in instances.keys():
# haven't decided how to best handle auth
try:
conn = self._connect(host=instances[instance]['addr'],
port=instances[instance]['port'])
data[instance] = self._instance_stats(conn)
except:
pass
return data
def _get_instances(self):
configs = glob.glob('/etc/pgbouncer/*.ini')
r1 = re.compile('^listen_(addr|port)\s+=\s+(.*)$')
instances = self.gendict()
for file in configs:
inst = file.split('/')[3].split('.')[0]
with open(file, 'r') as f:
for line in f:
match = r1.match(line)
if match:
instances[inst].update({match.group(1): match.group(2)})
return instances
def _instance_stats(self, conn):
data = self.gendict()
for row in exc(conn, 'show stats'):
for col in [key for key in row.keys() if key != 'database']:
data[row['database']][col] = row[col]
res = exc(conn, 'show servers')
for x in xrange(len(res)):
for col in [key for key in res[x].keys()]:
data['server%d' % x][col] = res[x][col]
res = exc(conn, 'show clients')
for x in xrange(len(res)):
for col in [key for key in res[x].keys()]:
data['client%d' % x][col] = res[x][col]
for row in exc(conn, 'show pools'):
for col in [key for key in row.keys() if key != 'database']:
data[row['database']][col] = row[col]
data['lists'] = exc(conn, 'show lists', 'list', 'items')
for row in exc(conn, 'show databases'):
for col in [key for key in row.keys() if key != 'name']:
data[row['database']][col] = row[col]
for row in exc(conn, 'show fds'):
for col in [key for key in row.keys() if key != 'fd']:
data['fd%d' % row['fd']][col] = row[col]
return data