mirror of
https://github.com/samuelclay/NewsBlur.git
synced 2025-08-05 16:58:59 +00:00
98 lines
2.9 KiB
Python
Executable file
98 lines
2.9 KiB
Python
Executable file
#!/srv/newsblur/venv/newsblur/bin/python
|
|
# -*- coding: utf-8 -*-
|
|
|
|
"""
|
|
Based on a plugin by BjØrn Ruberg and Moses Moore.
|
|
|
|
Plugin to monitor PostgreSQL disk usage.
|
|
"""
|
|
|
|
from vendor.munin.postgres import MuninPostgresPlugin
|
|
|
|
class MuninPostgresSpacePlugin(MuninPostgresPlugin):
|
|
dbname_in_args = True
|
|
args = "-l 0 --base 1024"
|
|
vlabel = "bytes"
|
|
info = "Size of database"
|
|
fields = (
|
|
('size', dict(
|
|
label = "Database size (bytes)",
|
|
info = "Database size",
|
|
type = "GAUGE",
|
|
draw = "AREA",
|
|
)),
|
|
('indexsize', dict(
|
|
label = "Index size (bytes)",
|
|
info = "Index size",
|
|
type = "GAUGE",
|
|
draw = "AREA",
|
|
)),
|
|
('metasize', dict(
|
|
label = "Meta size (bytes)",
|
|
info = "Meta size",
|
|
type = "GAUGE",
|
|
draw = "AREA",
|
|
)),
|
|
('metaindexsize', dict(
|
|
label = "Meta Index size (bytes)",
|
|
info = "Meta Index size",
|
|
type = "GAUGE",
|
|
draw = "AREA",
|
|
)),
|
|
)
|
|
|
|
@property
|
|
def title(self):
|
|
return "Postgres size of database %s" % self.dbname
|
|
|
|
def execute(self):
|
|
c = self.cursor()
|
|
|
|
namespaces = {}
|
|
c.execute("SELECT oid, nspname FROM pg_namespace")
|
|
for row in c.fetchall():
|
|
namespaces[row[0]] = row[1]
|
|
|
|
query = (
|
|
"SELECT relname, relnamespace, relkind, relfilenode, relpages"
|
|
" FROM pg_class WHERE relkind IN ('r', 'i')")
|
|
|
|
database_pages = 0
|
|
database_indexes = 0
|
|
metadatabase_pages = 0
|
|
metadatabase_indexes = 0
|
|
|
|
c.execute(query)
|
|
for row in c.fetchall():
|
|
relname, relnamespace, relkind, relfilenode, relpages = row
|
|
ns = namespaces[relnamespace]
|
|
if ns.startswith('pg_toast'):
|
|
continue
|
|
|
|
meta = ns.startswith('pg_') or ns == "information_schema"
|
|
|
|
c2 = self.cursor()
|
|
c2.execute("SELECT SUM(relpages) FROM pg_class WHERE relname IN (%s, %s)",
|
|
("pg_toast_%s" % relfilenode, "pg_toast_%s_index" % relfilenode))
|
|
relpages2 = int(c2.fetchone()[0] or '0')
|
|
|
|
if relkind == "r": # Regular table
|
|
if meta:
|
|
metadatabase_pages += int(relpages) + relpages2
|
|
else:
|
|
database_pages += int(relpages) + relpages2
|
|
elif relkind == "i": # Index
|
|
if meta:
|
|
metadatabase_indexes += int(relpages) + relpages2
|
|
else:
|
|
database_indexes += int(relpages) + relpages2
|
|
|
|
return dict(
|
|
size = database_pages * 8192,
|
|
indexsize = database_indexes * 8192,
|
|
metasize = metadatabase_pages * 8192,
|
|
metaindexsize = metadatabase_indexes * 8192,
|
|
)
|
|
|
|
if __name__ == "__main__":
|
|
MuninPostgresSpacePlugin().run()
|