Skip to content

Commit 3134dfb

Browse files
committed
2.3.2 release:
- bootstrap new options: -M (mamonsu non-priviledged user), -v(verbose) - get oldest query xid and age via functions - fix missing UpdateExisting for applications in Zabbix API 3.4
1 parent 65656fa commit 3134dfb

File tree

10 files changed

+338
-234
lines changed

10 files changed

+338
-234
lines changed

Makefile.pkg

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ build/all: build/pkg_debian build/pkg_ubuntu build/pkg_centos
3737
build/pkg_debian: build/pkg_debian_7 build/pkg_debian_8
3838
@echo Debian: done
3939

40-
build/pkg_ubuntu: build/pkg_ubuntu_14_04 build/pkg_ubuntu_15_10 build/pkg_ubuntu_16_04 build/pkg_ubuntu_16_10
40+
build/pkg_ubuntu: build/pkg_ubuntu_14_04 build/pkg_ubuntu_16_04
4141
@echo Ubuntu: done
4242

4343
build/pkg_centos: build/pkg_centos_6 build/pkg_centos_7
@@ -72,18 +72,10 @@ build/pkg_ubuntu_14_04:
7272
$(call build_deb,ubuntu,trusty)
7373
touch build/pkg_ubuntu_14_04
7474

75-
build/pkg_ubuntu_15_10:
76-
$(call build_deb,ubuntu,wily)
77-
touch build/pkg_ubuntu_15_10
78-
7975
build/pkg_ubuntu_16_04:
8076
$(call build_deb,ubuntu,xenial)
8177
touch build/pkg_ubuntu_16_04
8278

83-
build/pkg_ubuntu_16_10:
84-
$(call build_deb,ubuntu,yakkety)
85-
touch build/pkg_ubuntu_16_10
86-
8779
build/pkg_centos_6:
8880
$(call build_rpm,centos,6)
8981
touch build/pkg_centos_6

Makefile.tests

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1-
test: run_functional_tests
1+
test: run_builds run_functional_tests
22

3-
run_functional_tests:
3+
run_builds:
44
docker run --rm -v "$(WORKDIR)":/var/tmp centos:7 /bin/bash -ex "/var/tmp/tests/build_rpm.sh"
55
docker run --rm -v "$(WORKDIR)":/var/tmp debian:7 /bin/bash -ex "/var/tmp/tests/build_deb.sh"
6-
docker run --rm -v "$(WORKDIR)":/var/tmp centos:6 /bin/bash -ex "/var/tmp/tests/check.sh"
6+
7+
run_functional_tests:
8+
docker run --rm -v "$(WORKDIR)":/var/tmp centos:6 /bin/bash -ex "/var/tmp/tests/check.sh"

mamonsu/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
__author__ = 'Dmitry Vasilyev'
22
__author_email__ = '[email protected]'
33
__description__ = 'Monitoring agent for PostgreSQL'
4-
__version__ = '2.3.1'
4+
__version__ = '2.3.2'
55
__licence__ = 'BSD'
66

77
__url__ = 'https://github.com/postgrespro/mamonsu'

mamonsu/plugins/pgsql/driver/pool.py

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ def __init__(self, params={}):
4444
self._connections = {}
4545
self._cache = {
4646
'server_version': {'storage': {}},
47-
'bootstrap': {'storage': {}, 'counter': 0, 'cache': 10},
47+
'bootstrap': {'storage': {}, 'counter': 0, 'cache': 10, 'version': False},
4848
'recovery': {'storage': {}, 'counter': 0, 'cache': 10},
4949
'pgpro': {'storage': {}},
5050
'pgproee': {'storage': {}}
@@ -72,13 +72,20 @@ def server_version(self, db=None):
7272
result.decode('ascii'))
7373
return self._cache['server_version']['storage'][db]
7474

75-
def server_version_greater(self, version, db=None):
76-
db = self._normalize_db(db)
77-
return self.server_version(db) >= LooseVersion(version)
75+
def server_version_greater(self, version, db=None, bootstrap=False):
76+
if not bootstrap:
77+
db = self._normalize_db(db)
78+
return self.server_version(db) >= LooseVersion(version)
79+
else:
80+
return str(self._cache['bootstrap']['version']) >= LooseVersion(version)
7881

79-
def server_version_less(self, version, db=None):
80-
db = self._normalize_db(db)
81-
return self.server_version(db) <= LooseVersion(version)
82+
def server_version_less(self, version, db=None, bootstrap=False):
83+
if not bootstrap:
84+
db = self._normalize_db(db)
85+
return self.server_version(db) <= LooseVersion(version)
86+
else:
87+
print(self._cache['bootstrap']['version'])
88+
return self._cache['bootstrap']['version'] <= LooseVersion(version)
8289

8390
def in_recovery(self, db=None):
8491
db = self._normalize_db(db)
@@ -104,12 +111,21 @@ def is_bootstraped(self, db=None):
104111
self._cache['bootstrap']['storage'][db] = (result == 1)
105112
if self._cache['bootstrap']['storage'][db]:
106113
self._connections[db].log.info('Found mamonsu bootstrap')
114+
sql = 'select max(version) from public.mamonsu_config'
115+
self._cache['bootstrap']['version'] = self.query(sql, db)[0][0]
107116
else:
108-
self._connections[db].log.info('Can\'t found mamonsu bootstrap')
117+
self._connections[db].log.info('Mamonsu bootstrap is not found')
109118
self._connections[db].log.info(
110119
'hint: run `mamonsu bootstrap` if you want to run without superuser rights')
111120
return self._cache['bootstrap']['storage'][db]
112121

122+
def is_superuser(self, db=None):
123+
db = self._normalize_db(db)
124+
if self.query("select current_setting('is_superuser')")[0][0] == 'on':
125+
return True
126+
else:
127+
return False
128+
113129
def is_pgpro(self, db=None):
114130
db = self._normalize_db(db)
115131
if db in self._cache['pgpro']:

mamonsu/plugins/pgsql/oldest.py

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,20 @@ class Oldest(Plugin):
1010
select
1111
greatest(max(age(backend_xmin)), max(age(backend_xid)))
1212
from pg_catalog.pg_stat_activity;
13+
"""
14+
15+
OldestXidSql_bootstrap = """
16+
select public.mamonsu_get_oldest_xid();
1317
"""
1418

1519
OldestQuerySql = """
1620
select
1721
extract(epoch from max(now() - xact_start))
1822
from pg_catalog.pg_stat_activity;
23+
"""
24+
25+
OldestQuerySql_bootstrap = """
26+
select public.mamonsu_get_oldest_query();
1927
"""
2028

2129
DEFAULT_CONFIG = {
@@ -24,9 +32,14 @@ class Oldest(Plugin):
2432
}
2533

2634
def run(self, zbx):
27-
xid = Pooler.query(self.OldestXidSql)[0][0]
35+
if Pooler.is_bootstraped() and Pooler.server_version_greater('2.3.2', bootstrap=True):
36+
xid = Pooler.query(self.OldestXidSql_bootstrap)[0][0]
37+
query = Pooler.query(self.OldestQuerySql_bootstrap)[0][0]
38+
else:
39+
xid = Pooler.query(self.OldestXidSql)[0][0]
40+
query = Pooler.query(self.OldestQuerySql)[0][0]
41+
2842
zbx.send('pgsql.oldest[xid_age]', xid)
29-
query = Pooler.query(self.OldestQuerySql)[0][0]
3043
zbx.send('pgsql.oldest[query_time]', query)
3144

3245
def graphs(self, template):

mamonsu/tools/bootstrap/sql.py

Lines changed: 110 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -1,75 +1,110 @@
1-
from mamonsu import __version__ as mamonsu_version
2-
3-
QuerySplit = """
4-
5-
"""
6-
7-
CreateSchemaSQL = """
8-
CREATE TABLE IF NOT EXISTS public.mamonsu_config (
9-
version text,
10-
inserted_at timestamp DEFAULT NOW()
11-
);
12-
13-
INSERT INTO public.mamonsu_config(version) VALUES('{0}');
14-
15-
DROP TABLE IF EXISTS public.mamonsu_timestamp_master_{1};
16-
17-
CREATE TABLE public.mamonsu_timestamp_master_{1}(
18-
id int primary key,
19-
ts double precision,
20-
lsn pg_lsn
21-
);
22-
23-
INSERT INTO public.mamonsu_timestamp_master_{1} (id) values (1);
24-
25-
CREATE OR REPLACE FUNCTION public.mamonsu_timestamp_master_update()
26-
RETURNS void AS $$
27-
UPDATE public.mamonsu_timestamp_master_{1} SET
28-
ts = extract(epoch from now() at time zone 'utc')::double precision,
29-
lsn = pg_catalog.pg_current_xlog_location()
30-
WHERE
31-
id = 1;
32-
$$ LANGUAGE SQL SECURITY DEFINER;
33-
34-
CREATE OR REPLACE FUNCTION public.mamonsu_timestamp_get()
35-
RETURNS double precision AS $$
36-
SELECT
37-
(extract(epoch from now() at time zone 'utc') - ts)::double precision
38-
FROM public.mamonsu_timestamp_master_{1}
39-
WHERE id = 1 LIMIT 1;
40-
$$ LANGUAGE SQL SECURITY DEFINER;
41-
42-
CREATE OR REPLACE FUNCTION public.mamonsu_count_autovacuum()
43-
RETURNS BIGINT AS $$
44-
SELECT
45-
count(*)::BIGINT
46-
FROM pg_catalog.pg_stat_activity
47-
WHERE
48-
query like '%%autovacuum%%'
49-
and state <> 'idle'
50-
and pid <> pg_catalog.pg_backend_pid()
51-
$$ LANGUAGE SQL SECURITY DEFINER;
52-
53-
CREATE OR REPLACE FUNCTION public.mamonsu_count_xlog_files()
54-
RETURNS BIGINT AS $$
55-
WITH list(filename) as (SELECT * FROM pg_catalog.pg_ls_dir('pg_xlog'))
56-
SELECT
57-
COUNT(*)::BIGINT
58-
FROM
59-
list
60-
WHERE filename similar to '{2}'
61-
$$ LANGUAGE SQL SECURITY DEFINER;
62-
63-
CREATE EXTENSION IF NOT EXISTS pg_buffercache;
64-
65-
CREATE OR REPLACE FUNCTION public.mamonsu_buffer_cache()
66-
RETURNS TABLE(SIZE BIGINT, TWICE_USED BIGINT, DIRTY BIGINT) AS $$
67-
SELECT
68-
SUM(1) * 8 * 1024,
69-
SUM(CASE WHEN usagecount > 1 THEN 1 ELSE 0 END) * 8 * 1024,
70-
SUM(CASE isdirty WHEN true THEN 1 ELSE 0 END) * 8 * 1024
71-
FROM public.pg_buffercache
72-
$$ LANGUAGE SQL SECURITY DEFINER;
73-
""".format(
74-
mamonsu_version,
75-
mamonsu_version.replace('.', '_'), '[0-9A-F]{24}')
1+
from mamonsu import __version__ as mamonsu_version
2+
3+
QuerySplit = """
4+
5+
"""
6+
7+
CreateSchemaSQL = """
8+
CREATE TABLE IF NOT EXISTS public.mamonsu_config (
9+
version text,
10+
inserted_at timestamp DEFAULT NOW()
11+
);
12+
13+
INSERT INTO public.mamonsu_config(version) VALUES('{0}');
14+
15+
DROP TABLE IF EXISTS public.mamonsu_timestamp_master_{1};
16+
17+
CREATE TABLE public.mamonsu_timestamp_master_{1}(
18+
id int primary key,
19+
ts double precision,
20+
lsn pg_lsn
21+
);
22+
23+
INSERT INTO public.mamonsu_timestamp_master_{1} (id) values (1);
24+
25+
CREATE OR REPLACE FUNCTION public.mamonsu_timestamp_master_update()
26+
RETURNS void AS $$
27+
UPDATE public.mamonsu_timestamp_master_{1} SET
28+
ts = extract(epoch from now() at time zone 'utc')::double precision,
29+
lsn = pg_catalog.pg_current_xlog_location()
30+
WHERE
31+
id = 1;
32+
$$ LANGUAGE SQL SECURITY DEFINER;
33+
34+
CREATE OR REPLACE FUNCTION public.mamonsu_timestamp_get()
35+
RETURNS double precision AS $$
36+
SELECT
37+
(extract(epoch from now() at time zone 'utc') - ts)::double precision
38+
FROM public.mamonsu_timestamp_master_{1}
39+
WHERE id = 1 LIMIT 1;
40+
$$ LANGUAGE SQL SECURITY DEFINER;
41+
42+
CREATE OR REPLACE FUNCTION public.mamonsu_count_autovacuum()
43+
RETURNS BIGINT AS $$
44+
SELECT
45+
count(*)::BIGINT
46+
FROM pg_catalog.pg_stat_activity
47+
WHERE
48+
query like '%%autovacuum%%'
49+
and state <> 'idle'
50+
and pid <> pg_catalog.pg_backend_pid()
51+
$$ LANGUAGE SQL SECURITY DEFINER;
52+
53+
CREATE or REPLACE FUNCTION public.mamonsu_get_oldest_xid()
54+
RETURNS BIGINT AS $$
55+
SELECT
56+
greatest(max(age(backend_xmin)),
57+
max(age(backend_xid)))::BIGINT
58+
FROM pg_catalog.pg_stat_activity
59+
$$ LANGUAGE SQL SECURITY DEFINER;
60+
61+
CREATE or REPLACE FUNCTION public.mamonsu_get_oldest_query()
62+
RETURNS DOUBLE PRECISION AS $$
63+
SELECT
64+
extract(epoch from max(now() - xact_start))
65+
FROM pg_catalog.pg_stat_activity
66+
$$ LANGUAGE SQL SECURITY DEFINER;
67+
68+
CREATE OR REPLACE FUNCTION public.mamonsu_count_xlog_files()
69+
RETURNS BIGINT AS $$
70+
WITH list(filename) as (SELECT * FROM pg_catalog.pg_ls_dir('pg_xlog'))
71+
SELECT
72+
COUNT(*)::BIGINT
73+
FROM
74+
list
75+
WHERE filename similar to '{2}'
76+
$$ LANGUAGE SQL SECURITY DEFINER;
77+
78+
CREATE EXTENSION IF NOT EXISTS pg_buffercache;
79+
80+
CREATE OR REPLACE FUNCTION public.mamonsu_buffer_cache()
81+
RETURNS TABLE(SIZE BIGINT, TWICE_USED BIGINT, DIRTY BIGINT) AS $$
82+
SELECT
83+
SUM(1) * 8 * 1024,
84+
SUM(CASE WHEN usagecount > 1 THEN 1 ELSE 0 END) * 8 * 1024,
85+
SUM(CASE isdirty WHEN true THEN 1 ELSE 0 END) * 8 * 1024
86+
FROM public.pg_buffercache
87+
$$ LANGUAGE SQL SECURITY DEFINER;
88+
""".format(
89+
mamonsu_version,
90+
mamonsu_version.replace('.', '_'), '[0-9A-F]{24}')
91+
92+
GrantsOnSchemaSQL = """
93+
ALTER TABLE public.mamonsu_config OWNER TO {1};
94+
95+
ALTER TABLE public.mamonsu_timestamp_master_{0} OWNER TO {1};
96+
97+
GRANT EXECUTE ON FUNCTION public.mamonsu_timestamp_master_update() TO {1};
98+
99+
GRANT EXECUTE ON FUNCTION public.mamonsu_timestamp_get() TO {1};
100+
101+
GRANT EXECUTE ON FUNCTION public.mamonsu_count_autovacuum() TO {1};
102+
103+
GRANT EXECUTE ON FUNCTION public.mamonsu_get_oldest_xid() TO {1};
104+
105+
GRANT EXECUTE ON FUNCTION public.mamonsu_get_oldest_query() TO {1};
106+
107+
GRANT EXECUTE ON FUNCTION public.mamonsu_count_xlog_files() TO {1};
108+
109+
GRANT EXECUTE ON FUNCTION public.mamonsu_buffer_cache() TO {1};
110+
"""

0 commit comments

Comments
 (0)