sensu-plugins-java 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +2 -0
- data/CHANGELOG.md +11 -0
- data/LICENSE +22 -0
- data/README.md +24 -0
- data/bin/check-java-permgen.rb +77 -0
- data/bin/java-heap-pcnt.sh +80 -0
- data/bin/metrics-java-heap-graphite.sh +62 -0
- data/bin/metrics-jstat.py +271 -0
- data/lib/sensu-plugins-java.rb +1 -0
- data/lib/sensu-plugins-java/version.rb +13 -0
- metadata +234 -0
- metadata.gz.sig +0 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 5f23b291403560a94ed4a4336b8a3ea11ff655c5
|
4
|
+
data.tar.gz: f74509f5e9cb66a376ebf01496bc636225f90199
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: e3cf4d6603a22da3f2ab80fb0b49e3e39728ade3f6e8eadf9773bc1b71ba928fed73f20b52f574e3cc951b6f5b61826099aa71652c53872017cf18f2bf88a627
|
7
|
+
data.tar.gz: 159bc6d2ac7bdef4bd3c3b7ca1ba9f0e9803eb53277919b7855dbc20f13cc55ef88cd57c1c4d5dcaca75bbc7a3babb205c23ee3ab51070d1808220330cd7b1c4
|
checksums.yaml.gz.sig
ADDED
Binary file
|
data.tar.gz.sig
ADDED
data/CHANGELOG.md
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
#Change Log
|
2
|
+
This project adheres to [Semantic Versioning](http://semver.org/).
|
3
|
+
|
4
|
+
This CHANGELOG follows the format listed at [Keep A Changelog](http://keepachangelog.com/)
|
5
|
+
|
6
|
+
## Unreleased][unreleased
|
7
|
+
|
8
|
+
## 0.0.1 - 2015-05-29
|
9
|
+
|
10
|
+
### Added
|
11
|
+
- initial release
|
data/LICENSE
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2015 Sensu-Plugins
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
## Sensu-Plugins-java
|
2
|
+
|
3
|
+
[](https://travis-ci.org/sensu-plugins/sensu-plugins-java)
|
4
|
+
[](http://badge.fury.io/rb/sensu-plugins-java)
|
5
|
+
[](https://codeclimate.com/github/sensu-plugins/sensu-plugins-java)
|
6
|
+
[](https://codeclimate.com/github/sensu-plugins/sensu-plugins-java)
|
7
|
+
[](https://gemnasium.com/sensu-plugins/sensu-plugins-java)
|
8
|
+
[](https://codeship.com/projects/82838)
|
9
|
+
|
10
|
+
## Functionality
|
11
|
+
|
12
|
+
## Files
|
13
|
+
* bin/check-java-permgen.rb
|
14
|
+
* bin/java-heap-pcnt.sh
|
15
|
+
* bin/metrics-java-heap-graphite.sh
|
16
|
+
* bin/metrics-jstat.py
|
17
|
+
|
18
|
+
## Usage
|
19
|
+
|
20
|
+
## Installation
|
21
|
+
|
22
|
+
[Installation and Setup](https://github.com/sensu-plugins/documentation/blob/master/user_docs/installation_instructions.md)
|
23
|
+
|
24
|
+
## Notes
|
@@ -0,0 +1,77 @@
|
|
1
|
+
#! /usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# java-permgen
|
4
|
+
#
|
5
|
+
# DESCRIPTION:
|
6
|
+
# Java PermGen Check
|
7
|
+
#
|
8
|
+
# OUTPUT:
|
9
|
+
# plain text
|
10
|
+
#
|
11
|
+
# PLATFORMS:
|
12
|
+
# Linux
|
13
|
+
#
|
14
|
+
# DEPENDENCIES:
|
15
|
+
# gem: sensu-plugin
|
16
|
+
#
|
17
|
+
# USAGE:
|
18
|
+
# #YELLOW
|
19
|
+
#
|
20
|
+
# NOTES:
|
21
|
+
#
|
22
|
+
# LICENSE:
|
23
|
+
# Copyright 2011 Sonian, Inc <chefs@sonian.net>
|
24
|
+
# Released under the same terms as Sensu (the MIT license); see LICENSE
|
25
|
+
# for details.
|
26
|
+
#
|
27
|
+
|
28
|
+
require 'sensu-plugin/check/cli'
|
29
|
+
require 'English'
|
30
|
+
|
31
|
+
#
|
32
|
+
# Check Java
|
33
|
+
#
|
34
|
+
class CheckJavaPermGen < Sensu::Plugin::Check::CLI
|
35
|
+
check_name 'Java PermGen'
|
36
|
+
|
37
|
+
option :warn, short: '-w WARNLEVEL', default: '85'
|
38
|
+
option :crit, short: '-c CRITLEVEL', default: '95'
|
39
|
+
|
40
|
+
def run
|
41
|
+
warn_procs = []
|
42
|
+
crit_procs = []
|
43
|
+
java_pids = []
|
44
|
+
|
45
|
+
IO.popen('jps -q') do |cmd|
|
46
|
+
java_pids = cmd.read.split
|
47
|
+
end
|
48
|
+
|
49
|
+
java_pids.each do |java_proc|
|
50
|
+
pgcmx = nil
|
51
|
+
pu = nil
|
52
|
+
IO.popen("jstat -gcpermcapacity #{java_proc} 1 1 2>&1") do |cmd|
|
53
|
+
pgcmx = cmd.read.split[9]
|
54
|
+
end
|
55
|
+
exit_code = $CHILD_STATUS.exitstatus
|
56
|
+
next if exit_code != 0
|
57
|
+
|
58
|
+
IO.popen("jstat -gcold #{java_proc} 1 1 2>&1") do |cmd|
|
59
|
+
pu = cmd.read.split[9]
|
60
|
+
end
|
61
|
+
exit_code = $CHILD_STATUS.exitstatus
|
62
|
+
next if exit_code != 0
|
63
|
+
|
64
|
+
proc_permgen = (pu.to_f / pgcmx.to_f) * 100
|
65
|
+
warn_procs << java_proc if proc_permgen > config[:warn].to_f
|
66
|
+
crit_procs << java_proc if proc_permgen > config[:crit].to_f
|
67
|
+
end
|
68
|
+
|
69
|
+
if !crit_procs.empty?
|
70
|
+
critical "Java processes Over PermGen CRIT threshold of #{config[:crit]}%: #{crit_procs.join(', ')}"
|
71
|
+
elsif !warn_procs.empty?
|
72
|
+
warning "Java processes Over PermGen WARN threshold of #{config[:warn]}%: #{warn_procs.join(', ')}"
|
73
|
+
else
|
74
|
+
ok 'No Java processes over PermGen thresholds'
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
@@ -0,0 +1,80 @@
|
|
1
|
+
#!/usr/bin/env bash
|
2
|
+
#
|
3
|
+
# Evaluate percentage of heap usage on specfic Tomcat backed JVM from Linux based systems based on percentage
|
4
|
+
# This was forked from Sensu Community Plugins
|
5
|
+
|
6
|
+
# Date: 2013-9-30
|
7
|
+
# Modified: Mario Harvey - badmadrad.com
|
8
|
+
|
9
|
+
# You must have openjdk-7-jdk and openjdk-7-jre packages installed
|
10
|
+
# http://openjdk.java.net/install/
|
11
|
+
|
12
|
+
# Also make sure the user "sensu" can sudo without password
|
13
|
+
|
14
|
+
# #RED
|
15
|
+
while getopts 'w:c:n:hp' OPT; do
|
16
|
+
case $OPT in
|
17
|
+
w) WARN=$OPTARG;;
|
18
|
+
c) CRIT=$OPTARG;;
|
19
|
+
n) NAME=$OPTARG;;
|
20
|
+
h) hlp="yes";;
|
21
|
+
p) perform="yes";;
|
22
|
+
*) unknown="yes";;
|
23
|
+
esac
|
24
|
+
done
|
25
|
+
|
26
|
+
# usage
|
27
|
+
HELP="
|
28
|
+
usage: $0 [ -n value -w value -c value -p -h ]
|
29
|
+
|
30
|
+
-n --> Name of JVM process < value
|
31
|
+
-w --> Warning Percentage < value
|
32
|
+
-c --> Critical Percentage < value
|
33
|
+
-p --> print out performance data
|
34
|
+
-h --> print this help screen
|
35
|
+
"
|
36
|
+
|
37
|
+
if [ "$hlp" = "yes" ]; then
|
38
|
+
echo "$HELP"
|
39
|
+
exit 0
|
40
|
+
fi
|
41
|
+
|
42
|
+
WARN=${WARN:=0}
|
43
|
+
CRIT=${CRIT:=0}
|
44
|
+
NAME=${NAME:=0}
|
45
|
+
|
46
|
+
#Get PID of JVM.
|
47
|
+
#At this point grep for the name of the java process running your jvm.
|
48
|
+
PID=$(sudo jps | grep $NAME | awk '{ print $1}')
|
49
|
+
|
50
|
+
#Get heap capacity of JVM
|
51
|
+
TotalHeap=$(sudo jstat -gccapacity $PID | tail -n 1 | awk '{ print ($4 + $5 + $6 + $10) / 1024 }')
|
52
|
+
|
53
|
+
#Determine amount of used heap JVM is using
|
54
|
+
UsedHeap=$(sudo jstat -gc $PID | tail -n 1 | awk '{ print ($3 + $4 + $6 + $8 + $10) / 1024 }')
|
55
|
+
|
56
|
+
#Get heap usage percentage
|
57
|
+
HeapPer=$(echo "scale=3; $UsedHeap / $TotalHeap * 100" | bc -l| cut -d "." -f1)
|
58
|
+
|
59
|
+
|
60
|
+
if [ "$HeapPer" = "" ]; then
|
61
|
+
echo "MEM UNKNOWN -"
|
62
|
+
exit 3
|
63
|
+
fi
|
64
|
+
|
65
|
+
if [ "$perform" = "yes" ]; then
|
66
|
+
output="jvm heap usage: $HeapPer% | heap usage="$HeapPer"%;$WARN;$CRIT;0"
|
67
|
+
else
|
68
|
+
output="jvm heap usage: $HeapPer% | $UsedHeap MB out of $TotalHeap MB"
|
69
|
+
fi
|
70
|
+
|
71
|
+
if (( $HeapPer >= $CRIT )); then
|
72
|
+
echo "MEM CRITICAL - $output"
|
73
|
+
exit 2
|
74
|
+
elif (( $HeapPer >= $WARN )); then
|
75
|
+
echo "MEM WARNING - $output"
|
76
|
+
exit 1
|
77
|
+
else
|
78
|
+
echo "MEM OK - $output"
|
79
|
+
exit 0
|
80
|
+
fi
|
@@ -0,0 +1,62 @@
|
|
1
|
+
#!/usr/bin/env bash
|
2
|
+
#
|
3
|
+
# Collect metrics on your JVM and allow you to trace usage in graphite
|
4
|
+
|
5
|
+
# Modified: Mario Harvey - badmadrad.com
|
6
|
+
|
7
|
+
# You must have openjdk-7-jdk and openjdk-7-jre packages installed
|
8
|
+
# http://openjdk.java.net/install/
|
9
|
+
|
10
|
+
# Also make sure the user "sensu" can sudo without password
|
11
|
+
|
12
|
+
# #RED
|
13
|
+
while getopts 's:n:h' OPT; do
|
14
|
+
case $OPT in
|
15
|
+
s) SCHEME=$OPTARG;;
|
16
|
+
n) NAME=$OPTARG;;
|
17
|
+
h) hlp="yes";;
|
18
|
+
esac
|
19
|
+
done
|
20
|
+
#usage
|
21
|
+
HELP="
|
22
|
+
usage $0 [ -n value -s value -h ]
|
23
|
+
-n --> NAME or name of jvm process < value
|
24
|
+
-s --> SCHEME or server name ex. :::name::: < value
|
25
|
+
-h --> print this help screen
|
26
|
+
"
|
27
|
+
if [ "$hlp" = "yes" ]; then
|
28
|
+
echo "$HELP"
|
29
|
+
exit 0
|
30
|
+
fi
|
31
|
+
|
32
|
+
SCHEME=${SCHEME:=0}
|
33
|
+
NAME=${NAME:=0}
|
34
|
+
|
35
|
+
#Get PID of JVM.
|
36
|
+
#At this point grep for the name of the java process running your jvm.
|
37
|
+
PID=$(sudo jps | grep $NAME | awk '{ print $1}')
|
38
|
+
|
39
|
+
#Get heap capacity of JVM
|
40
|
+
TotalHeap=$(sudo jstat -gccapacity $PID | tail -n 1 | awk '{ print ($4 + $5 + $6 + $10) / 1024 }')
|
41
|
+
|
42
|
+
#Determine amount of used heap JVM is using
|
43
|
+
UsedHeap=$(sudo jstat -gc $PID | tail -n 1 | awk '{ print ($3 + $4 + $6 + $8 + $10) / 1024 }')
|
44
|
+
|
45
|
+
#Determine Old Space Utilization
|
46
|
+
OldGen=$(sudo jstat -gc $PID | tail -n 1 | awk '{ print ($8) / 1024 }')
|
47
|
+
|
48
|
+
#Determine Permanent Space Utilization
|
49
|
+
PermGen=$(sudo jstat -gc $PID | tail -n 1 | awk '{ print ($10) / 1024 }')
|
50
|
+
|
51
|
+
#Determine Eden Space Utilization
|
52
|
+
ParEden=$(sudo jstat -gc $PID | tail -n 1 | awk '{ print ($6) / 1024 }')
|
53
|
+
|
54
|
+
#Determine Survivor Space utilization
|
55
|
+
ParSurv=$(sudo jstat -gc $PID | tail -n 1 | awk '{ print ($3 + $4) / 1024 }')
|
56
|
+
|
57
|
+
echo "JVMs.$SCHEME.Committed_Heap $TotalHeap `date '+%s'`"
|
58
|
+
echo "JVMs.$SCHEME.Used_Heap $UsedHeap `date '+%s'`"
|
59
|
+
echo "JVMs.$SCHEME.Eden_Util $ParEden `date '+%s'`"
|
60
|
+
echo "JVMs.$SCHEME.Survivor_Util $ParSurv `date '+%s'`"
|
61
|
+
echo "JVMs.$SCHEME.Old_Util $OldGen `date '+%s'`"
|
62
|
+
echo "JVMs.$SCHEME.Perm_Util $PermGen `date '+%s'`"
|
@@ -0,0 +1,271 @@
|
|
1
|
+
#!/usr/bin/python -tt
|
2
|
+
#
|
3
|
+
# DESCRIPTION:
|
4
|
+
# Collect everything that can be collected out of jstat (shells out 5 times)
|
5
|
+
# and spits to STDOUT in a graphite ready format, thus meant to be used with a
|
6
|
+
# graphite metric tcp handler.
|
7
|
+
# Since it shells out to jps(1) you will need the user running the sensu client
|
8
|
+
# executing this script to be able to run jps as the same user running the JVM
|
9
|
+
# you are trying to get stats from.
|
10
|
+
# In addition it will also need to be able to run jstat(2) against the JVM
|
11
|
+
# This can be all achieved by allowing the script to be ran as the same user
|
12
|
+
# running the JVM, for instance by prepending "sudo -u <jvm_process_owner>"
|
13
|
+
# in the command check definition (with the proper sudoers config to allow this
|
14
|
+
# with no password being asked)
|
15
|
+
#
|
16
|
+
# The graphite node is composed of an optional root node (defaults to 'metrics')
|
17
|
+
# the specified FQDN "reversed" ('foo.bar.com' becomes 'com.bar.foo') and an
|
18
|
+
# optional scheme (defaults to 'jstat')
|
19
|
+
#
|
20
|
+
# (1) http://docs.oracle.com/javase/7/docs/technotes/tools/share/jps.html
|
21
|
+
# (2) http://docs.oracle.com/javase/7/docs/technotes/tools/share/jstat.html
|
22
|
+
#
|
23
|
+
# OUTPUT:
|
24
|
+
# Graphite plain-text format (name value timestamp\n)
|
25
|
+
#
|
26
|
+
# DEPENDENCIES:
|
27
|
+
# Python 2.7 (untested on python 3 but should work fine)
|
28
|
+
# Java 6 (untested on Java 7 but should work fine)
|
29
|
+
#
|
30
|
+
#
|
31
|
+
# Released under the same terms as Sensu (the MIT license); see LICENSE
|
32
|
+
# for details.
|
33
|
+
|
34
|
+
# #RED
|
35
|
+
import logging
|
36
|
+
import logging.handlers
|
37
|
+
import optparse
|
38
|
+
from subprocess import check_output
|
39
|
+
import sys
|
40
|
+
import time
|
41
|
+
|
42
|
+
class JstatMetricsToGraphiteFormat(object):
|
43
|
+
'''Prints jstat metrics to stdout in graphite format
|
44
|
+
|
45
|
+
Shells out to run jstat using the JVM id found via jps (also shelled out) and
|
46
|
+
passed argument to print to STDOUT (for use with sensu) the metrics value.
|
47
|
+
Jstat column titles are replaced with more explanatory names. Requires to be
|
48
|
+
ran as a user that can get the JVM id via jps and run jstat on that JVM'''
|
49
|
+
|
50
|
+
def main(self):
|
51
|
+
# Setting up logging to syslog
|
52
|
+
try:
|
53
|
+
logger = logging.getLogger(__name__)
|
54
|
+
logger.setLevel(logging.DEBUG)
|
55
|
+
|
56
|
+
formatter = logging.Formatter("%(pathname)s: %(message)s")
|
57
|
+
|
58
|
+
handler = logging.handlers.SysLogHandler(address = '/dev/log')
|
59
|
+
handler.setFormatter(formatter)
|
60
|
+
logger.addHandler(handler)
|
61
|
+
except Exception:
|
62
|
+
# booting is more important than logging
|
63
|
+
logging.critical("Failed to configure syslog handler")
|
64
|
+
|
65
|
+
parser = optparse.OptionParser()
|
66
|
+
|
67
|
+
parser.add_option('-g', '--graphite-base',
|
68
|
+
default = 'metrics',
|
69
|
+
dest = 'graphite_base',
|
70
|
+
help = 'The base graphite node',
|
71
|
+
metavar = 'NODE')
|
72
|
+
|
73
|
+
parser.add_option('-D', '--debug',
|
74
|
+
action = 'store_true',
|
75
|
+
default = False,
|
76
|
+
dest = 'debug',
|
77
|
+
help = 'Debug output (NOISY!)')
|
78
|
+
|
79
|
+
parser.add_option('-H', '--host',
|
80
|
+
default = None,
|
81
|
+
dest = 'hostname',
|
82
|
+
help = 'The name of the host to run jstat on',
|
83
|
+
metavar = 'HOST')
|
84
|
+
|
85
|
+
parser.add_option('-j', '--java-name',
|
86
|
+
default = None,
|
87
|
+
dest = 'java_app_name',
|
88
|
+
help = 'The name of the Java app to call jstat on',
|
89
|
+
metavar = 'JAVANAME')
|
90
|
+
|
91
|
+
parser.add_option('-s', '--scheme',
|
92
|
+
default = 'jstat',
|
93
|
+
dest = 'service',
|
94
|
+
help = 'Metric naming scheme, text to prepend to metric',
|
95
|
+
metavar = 'SERVICE')
|
96
|
+
|
97
|
+
(options, args) = parser.parse_args()
|
98
|
+
|
99
|
+
if not options.java_app_name:
|
100
|
+
parser.error('A Java app name is required')
|
101
|
+
|
102
|
+
if not options.hostname:
|
103
|
+
parser.error('A host name is required')
|
104
|
+
|
105
|
+
# Replace jstat colums titles with more explicit ones
|
106
|
+
# Stats coming from -gc
|
107
|
+
metric_maps_gc = { "S0C": "current_survivor_space_0_capacity_KB",
|
108
|
+
"S1C": "current_survivor_space_1_capacity_KB",
|
109
|
+
"S0U": "survivor_space_0_utilization_KB",
|
110
|
+
"S1U": "survivor_space_1_utilization_KB",
|
111
|
+
"EC": "current_eden_space_capacity_KB",
|
112
|
+
"EU": "eden_space_utilization_KB",
|
113
|
+
"OC": "current_old_space_capacity_KB",
|
114
|
+
"OU": "old_space_utilization_KB",
|
115
|
+
"PC": "current_permanent_space_capacity_KB",
|
116
|
+
"PU": "permanent_space_utilization_KB",
|
117
|
+
"YGC": "number_of_young_generation_GC_events",
|
118
|
+
"YGCT": "young_generation_garbage_collection_time",
|
119
|
+
"FGC": "number_of_stop_the_world_events",
|
120
|
+
"FGCT": "full_garbage_collection_time",
|
121
|
+
"GCT": "total_garbage_collection_time"
|
122
|
+
}
|
123
|
+
|
124
|
+
# Stats coming from -gccapacity
|
125
|
+
metric_maps_gccapacity = { "NGCMN": "minimum_size_of_new_area",
|
126
|
+
"NGCMX": "maximum_size_of_new_area",
|
127
|
+
"NGC": "current_size_of_new_area",
|
128
|
+
"OGCMN": "minimum_size_of_old_area",
|
129
|
+
"OGCMX": "maximum_size_of_old_area",
|
130
|
+
"OGC": "current_size_of_old_area",
|
131
|
+
"PGCMN": "minimum_size_of_permanent_area",
|
132
|
+
"PGCMX": "maximum_size_of_permanent_area",
|
133
|
+
"PGC": "current_size_of_permanent_area",
|
134
|
+
"PC": "current_size_of_permanent_area"
|
135
|
+
}
|
136
|
+
|
137
|
+
# Stats coming from -gcnew
|
138
|
+
metric_maps_gcnew = { "TT" : "tenuring_threshold",
|
139
|
+
"MTT": "maximum_tenuring_threshold",
|
140
|
+
"DSS": "adequate_size_of_survivor"
|
141
|
+
}
|
142
|
+
|
143
|
+
# Stats coming from -compiler
|
144
|
+
metric_maps_compiler = {
|
145
|
+
"Compiled": "compilation_tasks_performed",
|
146
|
+
"Failed": "compilation_tasks_failed",
|
147
|
+
"Invalid": "compilation_tasks_invalidated",
|
148
|
+
"Time": "time_spent_on_compilation_tasks"
|
149
|
+
}
|
150
|
+
|
151
|
+
# Stats coming from -class
|
152
|
+
## Note that since "Bytes" appears twice in jstat -class output we need
|
153
|
+
## to differentiate them by colum number
|
154
|
+
metric_maps_class = {
|
155
|
+
"Loaded": "loaded_classes",
|
156
|
+
"Bytes_column2": "loaded_KB",
|
157
|
+
"Unloaded": "unloaded_classes",
|
158
|
+
"Bytes_column4": "unloaded_KB",
|
159
|
+
"Time": "time_spent_on_class_load_unload"
|
160
|
+
}
|
161
|
+
|
162
|
+
def get_jstat_metrics(jstat_option, lvmid, metric_maps):
|
163
|
+
'''Runs jstat with provided option on provided host, returns mapped stats'''
|
164
|
+
def is_number(s):
|
165
|
+
'''returns true if string is a number'''
|
166
|
+
try:
|
167
|
+
float(s)
|
168
|
+
return True
|
169
|
+
except ValueError:
|
170
|
+
pass
|
171
|
+
try:
|
172
|
+
import unicodedata
|
173
|
+
unicodedata.numeric(s)
|
174
|
+
return True
|
175
|
+
except (TypeError, ValueError):
|
176
|
+
pass
|
177
|
+
return False
|
178
|
+
|
179
|
+
# Get stats from jstat stdout
|
180
|
+
try :
|
181
|
+
jstat_gc_out = check_output(["jstat", jstat_option, lvmid])
|
182
|
+
except Exception as e:
|
183
|
+
if options.debug:
|
184
|
+
print e
|
185
|
+
sys.exit(1)
|
186
|
+
logger.critical(e)
|
187
|
+
sys.exit(1)
|
188
|
+
|
189
|
+
values_all = jstat_gc_out.split("\n")[1].split()
|
190
|
+
# Remove non number strings
|
191
|
+
values = [ jstat_val for jstat_val in values_all if is_number(jstat_val) ]
|
192
|
+
# Transform float strings to integers
|
193
|
+
values = map(int, map(float, values))
|
194
|
+
|
195
|
+
# Change stats titles to long names
|
196
|
+
titles = jstat_gc_out.split("\n")[0].split()
|
197
|
+
# Deal with -class special "double Bytes" output
|
198
|
+
if jstat_option == "-class":
|
199
|
+
titles[2] = "Bytes_column2"
|
200
|
+
titles[4] = "Bytes_column4"
|
201
|
+
return dict([(metric_maps[title], values[position]) for position, title in enumerate(titles) if title in metric_maps])
|
202
|
+
|
203
|
+
# Get lvmid (JVM id)
|
204
|
+
try :
|
205
|
+
jps_out = check_output(["jps"])
|
206
|
+
except Exception as e:
|
207
|
+
if options.debug:
|
208
|
+
print e
|
209
|
+
sys.exit(1)
|
210
|
+
logger.critical(e)
|
211
|
+
sys.exit(1)
|
212
|
+
|
213
|
+
lvmid = False
|
214
|
+
for line in jps_out.split("\n"):
|
215
|
+
if options.java_app_name in line:
|
216
|
+
lvmid = line.split()[0]
|
217
|
+
|
218
|
+
if not lvmid:
|
219
|
+
if options.debug:
|
220
|
+
print "Could not get an LVM id"
|
221
|
+
sys.exit(1)
|
222
|
+
logger.critical("Could not get an LVM id")
|
223
|
+
sys.exit(1)
|
224
|
+
|
225
|
+
# Get stats from -gc
|
226
|
+
gc_stats = get_jstat_metrics("-gc", lvmid, metric_maps_gc)
|
227
|
+
if options.debug:
|
228
|
+
print gc_stats
|
229
|
+
# Get stats from -gccapacity
|
230
|
+
gccapacity_stats = get_jstat_metrics("-gccapacity",
|
231
|
+
lvmid, metric_maps_gccapacity)
|
232
|
+
if options.debug:
|
233
|
+
print gccapacity_stats
|
234
|
+
# Get stats from -gcnew
|
235
|
+
gcnew_stats = get_jstat_metrics("-gcnew", lvmid, metric_maps_gcnew)
|
236
|
+
if options.debug:
|
237
|
+
print gccapacity_stats
|
238
|
+
|
239
|
+
# Put all GC related stats to the same dict
|
240
|
+
gc_stats.update(gccapacity_stats)
|
241
|
+
gc_stats.update(gcnew_stats)
|
242
|
+
|
243
|
+
# Get stats from -compiler
|
244
|
+
compiler_stats = get_jstat_metrics("-compiler", lvmid, metric_maps_compiler)
|
245
|
+
if options.debug:
|
246
|
+
print compiler_stats
|
247
|
+
|
248
|
+
# Get stats from -class
|
249
|
+
class_stats = get_jstat_metrics("-class", lvmid, metric_maps_class)
|
250
|
+
if options.debug:
|
251
|
+
print class_stats
|
252
|
+
|
253
|
+
# Print to stdout in graphite format
|
254
|
+
now = time.time()
|
255
|
+
graphite_base = '.'.join([options.graphite_base,
|
256
|
+
'.'.join(reversed(options.hostname.split('.')))])
|
257
|
+
|
258
|
+
for metric in gc_stats:
|
259
|
+
print "%s.%s.jvm.gc.%s %s %d" % (graphite_base, options.service, metric,
|
260
|
+
gc_stats[metric], now)
|
261
|
+
|
262
|
+
for metric in compiler_stats:
|
263
|
+
print "%s.%s.jvm.compiler.%s %s %d" % (graphite_base, options.service,
|
264
|
+
metric, compiler_stats[metric], now)
|
265
|
+
|
266
|
+
for metric in class_stats:
|
267
|
+
print "%s.%s.jvm.class.%s %s %d" % (graphite_base, options.service,
|
268
|
+
metric, class_stats[metric], now)
|
269
|
+
|
270
|
+
if '__main__' == __name__:
|
271
|
+
JstatMetricsToGraphiteFormat().main()
|
@@ -0,0 +1 @@
|
|
1
|
+
require 'sensu-plugins-java/version'
|
metadata
ADDED
@@ -0,0 +1,234 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: sensu-plugins-java
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Sensu-Plugins and contributors
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain:
|
11
|
+
- |
|
12
|
+
-----BEGIN CERTIFICATE-----
|
13
|
+
MIIDgDCCAmigAwIBAgIBATANBgkqhkiG9w0BAQUFADBDMRIwEAYDVQQDDAltYXR0
|
14
|
+
am9uZXMxGDAWBgoJkiaJk/IsZAEZFgh5aWVsZGJvdDETMBEGCgmSJomT8ixkARkW
|
15
|
+
A2NvbTAeFw0xNTAxMjgyMTAyNTFaFw0xNjAxMjgyMTAyNTFaMEMxEjAQBgNVBAMM
|
16
|
+
CW1hdHRqb25lczEYMBYGCgmSJomT8ixkARkWCHlpZWxkYm90MRMwEQYKCZImiZPy
|
17
|
+
LGQBGRYDY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyTSzVYnO
|
18
|
+
CLgyrIyT1mBQakArQyW8xhi6MlDqyzXHJGeERT790U6EgoBVeS4XoK0ptFZNR8Tf
|
19
|
+
zko0w+Nv47TarSCgkPOaxY+mxWnAVR10dOmfeLr7huiMyps+YD56/EF2FqQ3jf/+
|
20
|
+
qohENfKD91qy1ieEy+Fn7Pf74ltbNKUdkb9a9eFXQ0DQ4ip5vik7DzjQkUTj4lca
|
21
|
+
k6ArwnmHX4YDhZoYtrQJ8jVktN0/+NtA40M5qkCYHNe5tUW25b/tKVYuioxG6b2Z
|
22
|
+
oIzaZxRLxf6HVAWpCVRT/F5+/yjigkX4u++eYacfLGleXQzoK7BL65vHGMJygWEE
|
23
|
+
0TKGqFOrl/L0AQIDAQABo38wfTAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNV
|
24
|
+
HQ4EFgQUEf6a8Td7MrSZc8ImbLFZAENPbz0wIQYDVR0RBBowGIEWbWF0dGpvbmVz
|
25
|
+
QHlpZWxkYm90LmNvbTAhBgNVHRIEGjAYgRZtYXR0am9uZXNAeWllbGRib3QuY29t
|
26
|
+
MA0GCSqGSIb3DQEBBQUAA4IBAQBbzXAYA3BVGw8DZ0YYoY1VHPNEcH5qPIApmHO8
|
27
|
+
rvSmuUT0yMEi7u00H/5uHRFf4LleGT/+sTdyXKsNPGT9kdRuQEgwi+vf7Zfvd8aX
|
28
|
+
UF/+4VkEYf/8rV8Ere6u2QaWPgApdMV6JjKr1fAwCTd8AuGXNaWItiPPMseSQzLJ
|
29
|
+
JKP4hVvbc1d+oS925B1lcBiqn2aYvElbyNAVmQPywNNqkWmvtlqj9ZVJfV5HQLdu
|
30
|
+
8sHuVruarogxxKPBzlL2is4EUb6oN/RdpGx2l4254+nyR+abg//Ed27Ym0PkB4lk
|
31
|
+
HP0m8WSjZmFr109pE/sVsM5jtOCvogyujQOjNVGN4gz1wwPr
|
32
|
+
-----END CERTIFICATE-----
|
33
|
+
date: 2015-05-30 00:00:00.000000000 Z
|
34
|
+
dependencies:
|
35
|
+
- !ruby/object:Gem::Dependency
|
36
|
+
name: sensu-plugin
|
37
|
+
requirement: !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - '='
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: 1.1.0
|
42
|
+
type: :runtime
|
43
|
+
prerelease: false
|
44
|
+
version_requirements: !ruby/object:Gem::Requirement
|
45
|
+
requirements:
|
46
|
+
- - '='
|
47
|
+
- !ruby/object:Gem::Version
|
48
|
+
version: 1.1.0
|
49
|
+
- !ruby/object:Gem::Dependency
|
50
|
+
name: english
|
51
|
+
requirement: !ruby/object:Gem::Requirement
|
52
|
+
requirements:
|
53
|
+
- - '='
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: 0.6.3
|
56
|
+
type: :runtime
|
57
|
+
prerelease: false
|
58
|
+
version_requirements: !ruby/object:Gem::Requirement
|
59
|
+
requirements:
|
60
|
+
- - '='
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: 0.6.3
|
63
|
+
- !ruby/object:Gem::Dependency
|
64
|
+
name: codeclimate-test-reporter
|
65
|
+
requirement: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - "~>"
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0.4'
|
70
|
+
type: :development
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
requirements:
|
74
|
+
- - "~>"
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: '0.4'
|
77
|
+
- !ruby/object:Gem::Dependency
|
78
|
+
name: rubocop
|
79
|
+
requirement: !ruby/object:Gem::Requirement
|
80
|
+
requirements:
|
81
|
+
- - "~>"
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
version: '0.30'
|
84
|
+
type: :development
|
85
|
+
prerelease: false
|
86
|
+
version_requirements: !ruby/object:Gem::Requirement
|
87
|
+
requirements:
|
88
|
+
- - "~>"
|
89
|
+
- !ruby/object:Gem::Version
|
90
|
+
version: '0.30'
|
91
|
+
- !ruby/object:Gem::Dependency
|
92
|
+
name: rspec
|
93
|
+
requirement: !ruby/object:Gem::Requirement
|
94
|
+
requirements:
|
95
|
+
- - "~>"
|
96
|
+
- !ruby/object:Gem::Version
|
97
|
+
version: '3.1'
|
98
|
+
type: :development
|
99
|
+
prerelease: false
|
100
|
+
version_requirements: !ruby/object:Gem::Requirement
|
101
|
+
requirements:
|
102
|
+
- - "~>"
|
103
|
+
- !ruby/object:Gem::Version
|
104
|
+
version: '3.1'
|
105
|
+
- !ruby/object:Gem::Dependency
|
106
|
+
name: bundler
|
107
|
+
requirement: !ruby/object:Gem::Requirement
|
108
|
+
requirements:
|
109
|
+
- - "~>"
|
110
|
+
- !ruby/object:Gem::Version
|
111
|
+
version: '1.7'
|
112
|
+
type: :development
|
113
|
+
prerelease: false
|
114
|
+
version_requirements: !ruby/object:Gem::Requirement
|
115
|
+
requirements:
|
116
|
+
- - "~>"
|
117
|
+
- !ruby/object:Gem::Version
|
118
|
+
version: '1.7'
|
119
|
+
- !ruby/object:Gem::Dependency
|
120
|
+
name: rake
|
121
|
+
requirement: !ruby/object:Gem::Requirement
|
122
|
+
requirements:
|
123
|
+
- - "~>"
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: '10.0'
|
126
|
+
type: :development
|
127
|
+
prerelease: false
|
128
|
+
version_requirements: !ruby/object:Gem::Requirement
|
129
|
+
requirements:
|
130
|
+
- - "~>"
|
131
|
+
- !ruby/object:Gem::Version
|
132
|
+
version: '10.0'
|
133
|
+
- !ruby/object:Gem::Dependency
|
134
|
+
name: github-markup
|
135
|
+
requirement: !ruby/object:Gem::Requirement
|
136
|
+
requirements:
|
137
|
+
- - "~>"
|
138
|
+
- !ruby/object:Gem::Version
|
139
|
+
version: '1.3'
|
140
|
+
type: :development
|
141
|
+
prerelease: false
|
142
|
+
version_requirements: !ruby/object:Gem::Requirement
|
143
|
+
requirements:
|
144
|
+
- - "~>"
|
145
|
+
- !ruby/object:Gem::Version
|
146
|
+
version: '1.3'
|
147
|
+
- !ruby/object:Gem::Dependency
|
148
|
+
name: redcarpet
|
149
|
+
requirement: !ruby/object:Gem::Requirement
|
150
|
+
requirements:
|
151
|
+
- - "~>"
|
152
|
+
- !ruby/object:Gem::Version
|
153
|
+
version: '3.2'
|
154
|
+
type: :development
|
155
|
+
prerelease: false
|
156
|
+
version_requirements: !ruby/object:Gem::Requirement
|
157
|
+
requirements:
|
158
|
+
- - "~>"
|
159
|
+
- !ruby/object:Gem::Version
|
160
|
+
version: '3.2'
|
161
|
+
- !ruby/object:Gem::Dependency
|
162
|
+
name: yard
|
163
|
+
requirement: !ruby/object:Gem::Requirement
|
164
|
+
requirements:
|
165
|
+
- - "~>"
|
166
|
+
- !ruby/object:Gem::Version
|
167
|
+
version: '0.8'
|
168
|
+
type: :development
|
169
|
+
prerelease: false
|
170
|
+
version_requirements: !ruby/object:Gem::Requirement
|
171
|
+
requirements:
|
172
|
+
- - "~>"
|
173
|
+
- !ruby/object:Gem::Version
|
174
|
+
version: '0.8'
|
175
|
+
- !ruby/object:Gem::Dependency
|
176
|
+
name: pry
|
177
|
+
requirement: !ruby/object:Gem::Requirement
|
178
|
+
requirements:
|
179
|
+
- - "~>"
|
180
|
+
- !ruby/object:Gem::Version
|
181
|
+
version: '0.10'
|
182
|
+
type: :development
|
183
|
+
prerelease: false
|
184
|
+
version_requirements: !ruby/object:Gem::Requirement
|
185
|
+
requirements:
|
186
|
+
- - "~>"
|
187
|
+
- !ruby/object:Gem::Version
|
188
|
+
version: '0.10'
|
189
|
+
description: Sensu plugins for Java
|
190
|
+
email: "<sensu-users@googlegroups.com>"
|
191
|
+
executables: []
|
192
|
+
extensions: []
|
193
|
+
extra_rdoc_files: []
|
194
|
+
files:
|
195
|
+
- CHANGELOG.md
|
196
|
+
- LICENSE
|
197
|
+
- README.md
|
198
|
+
- bin/check-java-permgen.rb
|
199
|
+
- bin/java-heap-pcnt.sh
|
200
|
+
- bin/metrics-java-heap-graphite.sh
|
201
|
+
- bin/metrics-jstat.py
|
202
|
+
- lib/sensu-plugins-java.rb
|
203
|
+
- lib/sensu-plugins-java/version.rb
|
204
|
+
homepage: https://github.com/sensu-plugins/sensu-plugins-java
|
205
|
+
licenses:
|
206
|
+
- MIT
|
207
|
+
metadata:
|
208
|
+
maintainer: ''
|
209
|
+
development_status: active
|
210
|
+
production_status: unstable - testing recommended
|
211
|
+
release_draft: 'false'
|
212
|
+
release_prerelease: 'false'
|
213
|
+
post_install_message: You can use the embedded Ruby by setting EMBEDDED_RUBY=true
|
214
|
+
in /etc/default/sensu
|
215
|
+
rdoc_options: []
|
216
|
+
require_paths:
|
217
|
+
- lib
|
218
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
219
|
+
requirements:
|
220
|
+
- - ">="
|
221
|
+
- !ruby/object:Gem::Version
|
222
|
+
version: 1.9.3
|
223
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
224
|
+
requirements:
|
225
|
+
- - ">="
|
226
|
+
- !ruby/object:Gem::Version
|
227
|
+
version: '0'
|
228
|
+
requirements: []
|
229
|
+
rubyforge_project:
|
230
|
+
rubygems_version: 2.4.6
|
231
|
+
signing_key:
|
232
|
+
specification_version: 4
|
233
|
+
summary: Sensu plugins for Java
|
234
|
+
test_files: []
|
metadata.gz.sig
ADDED
Binary file
|