Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
C
Check Mem
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package registry
Container registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Service Desk
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
GitLab community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Tier 2
monitoring-plugins
Check Mem
Commits
491d911a
Commit
491d911a
authored
Sep 20, 2011
by
Justin Ellison
Browse files
Options
Downloads
Patches
Plain Diff
initial commit
parents
No related branches found
No related tags found
No related merge requests found
Changes
2
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
README
+1
-0
1 addition, 0 deletions
README
check_mem.pl
+244
-0
244 additions, 0 deletions
check_mem.pl
with
245 additions
and
0 deletions
README
0 → 100644
+
1
−
0
View file @
491d911a
Revision of check_mem.pl that splits out cache memory from application memory - see http://sysadminsjourney.com/content/2009/06/04/new-and-improved-checkmempl-nagios-plugin
This diff is collapsed.
Click to expand it.
check_mem.pl
0 → 100644
+
244
−
0
View file @
491d911a
#!/usr/bin/perl -w
# $Id: check_mem.pl 2 2002-02-28 06:42:51Z egalstad $
# Original script stolen from:
# check_mem.pl Copyright (C) 2000 Dan Larsson <dl@tyfon.net>
# hacked by
# Justin Ellison <justin@techadvise.com>
#
# 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; either version 2
# of the License, or (at your option) any later version.
#
# 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 (or with Nagios); if not, write to the
# Free Software Foundation, Inc., 59 Temple Place - Suite 330,
# Boston, MA 02111-1307, USA
# Tell Perl what we need to use
use
strict
;
use
Getopt::
Std
;
#TODO - Convert to Nagios::Plugin
#TODO - Use an alarm
# Predefined exit codes for Nagios
use
vars
qw($opt_c $opt_f $opt_u $opt_w $opt_C $opt_v %exit_codes)
;
%exit_codes
=
('
UNKNOWN
'
,
-
1
,
'
OK
'
,
0
,
'
WARNING
'
,
1
,
'
CRITICAL
',
2
,
);
# Get our variables, do our checking:
init
();
# Get the numbers:
my
(
$free_memory_kb
,
$used_memory_kb
,
$caches_kb
)
=
get_memory_info
();
print
"
$free_memory_kb
Free
\n
$used_memory_kb
Used
\n
$caches_kb
Cache
\n
"
if
(
$opt_v
);
if
(
$opt_C
)
{
#Do we count caches as free?
$used_memory_kb
-=
$caches_kb
;
$free_memory_kb
+=
$caches_kb
;
}
# Round to the nearest KB
$free_memory_kb
=
sprintf
('
%d
',
$free_memory_kb
);
$used_memory_kb
=
sprintf
('
%d
',
$used_memory_kb
);
$caches_kb
=
sprintf
('
%d
',
$caches_kb
);
# Tell Nagios what we came up with
tell_nagios
(
$used_memory_kb
,
$free_memory_kb
,
$caches_kb
);
sub
tell_nagios
{
my
(
$used
,
$free
,
$caches
)
=
@_
;
# Calculate Total Memory
my
$total
=
$free
+
$used
;
print
"
$total
Total
\n
"
if
(
$opt_v
);
my
$perfdata
=
"
|TOTAL=
${total}
KB;;;; USED=
${used}
KB;;;; FREE=
${free}
KB;;;; CACHES=
${caches}
KB;;;;
";
if
(
$opt_f
)
{
my
$percent
=
sprintf
"
%.1f
",
(
$free
/
$total
*
100
);
if
(
$percent
<=
$opt_c
)
{
finish
("
CRITICAL -
$percent
% (
$free
kB) free!
$perfdata
",
$exit_codes
{'
CRITICAL
'});
}
elsif
(
$percent
<=
$opt_w
)
{
finish
("
WARNING -
$percent
% (
$free
kB) free!
$perfdata
",
$exit_codes
{'
WARNING
'});
}
else
{
finish
("
OK -
$percent
% (
$free
kB) free.
$perfdata
",
$exit_codes
{'
OK
'});
}
}
elsif
(
$opt_u
)
{
my
$percent
=
sprintf
"
%.1f
",
(
$used
/
$total
*
100
);
if
(
$percent
>=
$opt_c
)
{
finish
("
CRITICAL -
$percent
% (
$used
kB) used!|
$perfdata
",
$exit_codes
{'
CRITICAL
'});
}
elsif
(
$percent
>=
$opt_w
)
{
finish
("
WARNING -
$percent
% (
$used
kB) used!|
$perfdata
",
$exit_codes
{'
WARNING
'});
}
else
{
finish
("
OK -
$percent
% (
$used
kB) used.|
$perfdata
",
$exit_codes
{'
OK
'});
}
}
}
# Show usage
sub
usage
()
{
print
"
\n
check_mem.pl v1.0 - Nagios Plugin
\n\n
";
print
"
usage:
\n
";
print
"
check_mem.pl -<f|u> -w <warnlevel> -c <critlevel>
\n\n
";
print
"
options:
\n
";
print
"
-f Check FREE memory
\n
";
print
"
-u Check USED memory
\n
";
print
"
-C Count OS caches as FREE memory
\n
";
print
"
-w PERCENT Percent free/used when to warn
\n
";
print
"
-c PERCENT Percent free/used when critical
\n
";
print
"
\n
Copyright (C) 2000 Dan Larsson <dl
\@
tyfon.net>
\n
";
print
"
check_mem.pl comes with absolutely NO WARRANTY either implied or explicit
\n
";
print
"
This program is licensed under the terms of the
\n
";
print
"
GNU General Public License (check source code for details)
\n
";
exit
$exit_codes
{'
UNKNOWN
'};
}
sub
get_memory_info
{
my
$used_memory_kb
=
0
;
my
$free_memory_kb
=
0
;
my
$total_memory_kb
=
0
;
my
$caches_kb
=
0
;
my
$uname
;
if
(
-
e
'
/usr/bin/uname
')
{
$uname
=
`
/usr/bin/uname -a
`;
}
elsif
(
-
e
'
/bin/uname
')
{
$uname
=
`
/bin/uname -a
`;
}
else
{
die
"
Unable to find uname in /usr/bin or /bin!
\n
";
}
print
"
uname returns
$uname
"
if
(
$opt_v
);
if
(
$uname
=~
/Linux/
)
{
my
@meminfo
=
`
/bin/cat /proc/meminfo
`;
foreach
(
@meminfo
)
{
chomp
;
if
(
/^Mem(Total|Free):\s+(\d+) kB/
)
{
my
$counter_name
=
$
1
;
if
(
$counter_name
eq
'
Free
')
{
$free_memory_kb
=
$
2
;
}
elsif
(
$counter_name
eq
'
Total
')
{
$total_memory_kb
=
$
2
;
}
}
elsif
(
/^(Buffers|Cached):\s+(\d+) kB/
)
{
$caches_kb
+=
$
2
;
}
}
$used_memory_kb
=
$total_memory_kb
-
$free_memory_kb
;
}
elsif
(
$uname
=~
/SunOS/
)
{
eval
"
use Sun::Solaris::Kstat
";
if
(
$@
)
{
#Kstat not available
if
(
$opt_C
)
{
print
"
You can't report on Solaris caches without Sun::Solaris::Kstat available!
\n
";
exit
$exit_codes
{
UNKNOWN
};
}
my
@vmstat
=
`
/usr/bin/vmstat 1 2
`;
my
$line
;
foreach
(
@vmstat
)
{
chomp
;
$line
=
$_
;
}
$free_memory_kb
=
(
split
(
/ /
,
$line
))[
5
]
/
1024
;
my
@prtconf
=
`
/usr/sbin/prtconf
`;
foreach
(
@prtconf
)
{
if
(
/^Memory size: (\d+) Megabytes/
)
{
$total_memory_kb
=
$
1
*
1024
;
}
}
$used_memory_kb
=
$total_memory_kb
-
$free_memory_kb
;
}
else
{
# We have kstat
my
$kstat
=
Sun::Solaris::
Kstat
->
new
();
my
$phys_pages
=
$
{
kstat
}
->
{
unix
}
->
{
0
}
->
{
system_pages
}
->
{
physmem
};
my
$free_pages
=
$
{
kstat
}
->
{
unix
}
->
{
0
}
->
{
system_pages
}
->
{
freemem
};
# We probably should account for UFS caching here, but it's unclear
# to me how to determine UFS's cache size. There's inode_cache,
# and maybe the physmem variable in the system_pages module??
# In the real world, it looks to be so small as not to really matter,
# so we don't grab it. If someone can give me code that does this,
# I'd be glad to put it in.
my
$arc_size
=
(
exists
$
{
kstat
}
->
{
zfs
}
&&
$
{
kstat
}
->
{
zfs
}
->
{
0
}
->
{
arcstats
}
->
{
size
})
?
$
{
kstat
}
->
{
zfs
}
->
{
0
}
->
{
arcstats
}
->
{
size
}
/
1024
:
0
;
$caches_kb
+=
$arc_size
;
my
$pagesize
=
`
pagesize
`;
$total_memory_kb
=
$phys_pages
*
$pagesize
/
1024
;
$free_memory_kb
=
$free_pages
*
$pagesize
/
1024
;
$used_memory_kb
=
$total_memory_kb
-
$free_memory_kb
;
}
}
else
{
if
(
$opt_C
)
{
print
"
You can't report on
$uname
caches!
\n
";
exit
$exit_codes
{
UNKNOWN
};
}
my
$command_line
=
`
vmstat | tail -1 | awk '{print
\
$4,
\
$5}'
`;
chomp
$command_line
;
my
@memlist
=
split
(
/ /
,
$command_line
);
# Define the calculating scalars
$used_memory_kb
=
$memlist
[
0
]
/
1024
;
$free_memory_kb
=
$memlist
[
1
]
/
1024
;
$total_memory_kb
=
$used_memory_kb
+
$free_memory_kb
;
}
return
(
$free_memory_kb
,
$used_memory_kb
,
$caches_kb
);
}
sub
init
{
# Get the options
if
(
$#ARGV
le
0
)
{
&usage
;
}
else
{
getopts
('
c:fuCvw:
');
}
# Shortcircuit the switches
if
(
!
$opt_w
or
$opt_w
==
0
or
!
$opt_c
or
$opt_c
==
0
)
{
print
"
*** You must define WARN and CRITICAL levels!
\n
";
&usage
;
}
elsif
(
!
$opt_f
and
!
$opt_u
)
{
print
"
*** You must select to monitor either USED or FREE memory!
\n
";
&usage
;
}
# Check if levels are sane
if
(
$opt_w
<=
$opt_c
and
$opt_f
)
{
print
"
*** WARN level must not be less than CRITICAL when checking FREE memory!
\n
";
&usage
;
}
elsif
(
$opt_w
>=
$opt_c
and
$opt_u
)
{
print
"
*** WARN level must not be greater than CRITICAL when checking USED memory!
\n
";
&usage
;
}
}
sub
finish
{
my
(
$msg
,
$state
)
=
@_
;
print
"
$msg
\n
";
exit
$state
;
}
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
sign in
to comment