forked from munin-monitoring/munin
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpostgres_locks_
executable file
·128 lines (107 loc) · 5.34 KB
/
postgres_locks_
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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
#!/usr/bin/perl
#
# Copyright (C) 2009 Magnus Hagander, Redpill Linpro AB
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; version 2 dated June,
# 1991.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
# 02110-1301 USA.
=head1 NAME
postgres_locks_ - Plugin to monitor PostgreSQL locks.
=head1 CONFIGURATION
Configuration is done through libpq environment variables, for example
PGUSER, PGDATABASE, etc. For more information, see L<Munin::Plugin::Pgsql>.
To monitor a specific database, link to postgres_locks_<databasename>.
To monitor all databases, link to postgres_locks_ALL.
To monitor several instances, link to postgres_<tag>_locks_<databasename|ALL>
The <tag> can be what you want but without "_". It allows you to define several
database configuration.
Example :
[postgres_pg91_*]
env.PGPORT 5432
[postgres_pg92_*]
env.PGPORT 5432
=head1 SEE ALSO
L<Munin::Plugin::Pgsql>
=head1 MAGIC MARKERS
#%# family=auto
#%# capabilities=autoconf suggest
=head1 AUTHOR
Magnus Hagander <[email protected]>, Redpill Linpro AB
=head1 COPYRIGHT/License.
Copyright (c) 2009 Magnus Hagander, Redpill Linpro AB
All rights reserved. This program is free software; you can
redistribute it and/or modify it under the terms of the GNU General
Public License as published by the Free Software Foundation; version 2
dated June, 1991.
=cut
use strict;
use warnings;
use Munin::Plugin::Pgsql;
my $pg = Munin::Plugin::Pgsql->new(
basename => 'postgres_[^_]*_?locks_',
title => 'PostgreSQL locks',
info => 'PostgreSQL locks',
vlabel => 'Locks',
basequery => [
"SELECT tmp.mode,COALESCE(count,0) FROM
(VALUES ('accesssharelock'),('rowsharelock'),('rowexclusivelock'),('shareupdateexclusivelock'),('sharelock'),('sharerowexclusivelock'),('exclusivelock'),('accessexclusivelock')) AS tmp(mode)
LEFT JOIN
(SELECT lower(mode) AS mode,count(*) AS count
FROM pg_locks WHERE database IS NOT NULL %%FILTER%%
GROUP BY lower(mode)
) AS tmp2
ON tmp.mode=tmp2.mode ORDER BY 1", [
8.1,
"SELECT tmp.mode,COALESCE(count,0) FROM
(SELECT 'accesssharelock' AS mode UNION ALL SELECT 'rowsharelock'
UNION ALL SELECT 'rowexclusivelock' UNION ALL SELECT 'shareupdateexclusivelock'
UNION ALL SELECT 'sharelock' UNION ALL SELECT 'sharerowexclusivelock'
UNION ALL SELECT 'exclusivelock' UNION ALL SELECT 'accessexclusivelock'
) AS tmp
LEFT JOIN
(SELECT lower(mode) AS mode,count(*) AS count
FROM pg_locks WHERE database IS NOT NULL %%FILTER%%
GROUP BY lower(mode)
) AS tmp2
ON tmp.mode=tmp2.mode ORDER BY 1"
],
],
wildcardfilter => "AND database=(SELECT oid FROM pg_database WHERE datname=?)",
configquery => [
"VALUES
('accesssharelock','AccessShareLock','Used by read only queries'),
('rowsharelock','RowShareLock','Used by SELECT FOR SHARE and SELECT FOR UPDATE queries'),
('rowexclusivelock','RowExclusiveLock','Used by UPDATE, DELETE and INSERT queries'),
('shareupdateexclusivelock','ShareUpdateExclusiveLock','Used by VACUUM, ANALYZE and CREATE INDEX CONCURRENTLY queries'),
('sharelock','ShareLock','Used by CREATE INDEX queries'),
('sharerowexclusivelock','ShareRowExclusiveLock','Only issued explicitly from applications'),
('exclusivelock','ExclusiveLock','Infrequently issued on system tables, or by applications'),
('accessexclusivelock','AccessExclusiveLock','Used by ALTER TABLE, DROP TABLE, TRUNCATE, REINDEX, CLUSTER and VACUUM FULL queries')", [
8.1,
"SELECT 'accesssharelock','AccessShareLock','Used by read only queries' UNION ALL
SELECT 'rowsharelock','RowShareLock','Used by SELECT FOR SHARE and SELECT FOR UPDATE queries' UNION ALL
SELECT 'rowexclusivelock','RowExclusiveLock','Used by UPDATE, DELETE and INSERT queries' UNION ALL
SELECT 'shareupdateexclusivelock','ShareUpdateExclusiveLock','Used by VACUUM, ANALYZE and CREATE INDEX CONCURRENTLY queries' UNION ALL
SELECT 'sharelock','ShareLock','Used by CREATE INDEX queries' UNION ALL
SELECT 'sharerowexclusivelock','ShareRowExclusiveLock','Only issued explicitly from applications' UNION ALL
SELECT 'exclusivelock','ExclusiveLock','Infrequently issued on system tables, or by applications' UNION ALL
SELECT 'accessexclusivelock','AccessExclusiveLock','Used by ALTER TABLE, DROP TABLE, TRUNCATE, REINDEX, CLUSTER and VACUUM FULL queries'"
]
],
suggestquery => "SELECT datname FROM pg_database WHERE datallowconn AND NOT datistemplate AND NOT datname='postgres' UNION ALL SELECT 'ALL' ORDER BY 1 LIMIT 10",
graphdraw => 'AREA',
stack => 1,
);
$pg->Process();
exit(0);