NewsBlur/config/munin/postgres_space_

99 lines
2.9 KiB
Text
Raw Normal View History

2020-12-03 14:05:32 -05:00
#!/srv/newsblur/venv/newsblur3/bin/python
2011-12-02 16:22:38 -08:00
# -*- coding: utf-8 -*-
"""
Based on a plugin by BjØrn Ruberg and Moses Moore.
Plugin to monitor PostgreSQL disk usage.
"""
2016-11-11 11:06:33 -08:00
from vendor.munin.postgres import MuninPostgresPlugin
2011-12-02 16:22:38 -08:00
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()