mirror of
https://github.com/munin-monitoring/contrib.git
synced 2018-11-08 00:59:34 +01:00
284 lines
9.3 KiB
Text
284 lines
9.3 KiB
Text
|
#!/usr/bin/ruby
|
||
|
#
|
||
|
# Plugin to monitor the Tomcat servers.
|
||
|
#
|
||
|
# Original Author: Rune Nordboe Skillingstad <runesk@linpro.no>
|
||
|
# Rewrite: laxis <laxis@magex.hu> 2008.05
|
||
|
#
|
||
|
# Requirements:
|
||
|
# - Needs access to http://<user>:<password>@localhost:8080/manager/status?XML=true (or modify the
|
||
|
# address for another host). A munin-user in $CATALINA_HOME/conf/tomcat-users.xml
|
||
|
# should be set up for this to work.
|
||
|
# - libxml-ruby
|
||
|
#
|
||
|
# Install:
|
||
|
# - copy script to /etc/munin
|
||
|
# - cd /etc/munin
|
||
|
# - ./tomcat install
|
||
|
#
|
||
|
# Tip: To see if it's already set up correctly, just run this plugin
|
||
|
# with the parameter "autoconf". If you get a "yes", everything should
|
||
|
# work like a charm already.
|
||
|
#
|
||
|
# tomcat-users.xml example:
|
||
|
# <user username="munin" password="<set this>" roles="standard,manager"/>
|
||
|
#
|
||
|
# Parameters supported:
|
||
|
#
|
||
|
# config
|
||
|
# autoconf
|
||
|
# install
|
||
|
#
|
||
|
# Configurable variables
|
||
|
#
|
||
|
# host - Destination host
|
||
|
# port - HTTP port numbers
|
||
|
# timeout - Connection timeout
|
||
|
# request - Override default status-url
|
||
|
# user - Manager username
|
||
|
# password - Manager password
|
||
|
# connector - Connector to query, defaults to "http-".$PORT
|
||
|
#
|
||
|
# Sample config:
|
||
|
# [tomcat_*]
|
||
|
# env.host 127.0.0.1
|
||
|
# env.port 8080
|
||
|
# env.request /manager/status?XML=true
|
||
|
# env.user munin
|
||
|
# env.password pass
|
||
|
# env.timeout 30
|
||
|
# env.connector jk-8009
|
||
|
#
|
||
|
# Magic markers:
|
||
|
#%# family=auto
|
||
|
#%# capabilities=autoconf
|
||
|
|
||
|
|
||
|
require 'net/http'
|
||
|
require 'xml/libxml'
|
||
|
|
||
|
@host = ENV.member?('host') ? ENV['host']: "127.0.0.1"
|
||
|
@port = ENV.member?('port') ? ENV['port']: 8080
|
||
|
@request = ENV.member?('request') ? ENV['request']: "/manager/status?XML=true"
|
||
|
@user = ENV.member?('user') ? ENV['user']: "munin"
|
||
|
@password = ENV.member?('password') ? ENV['password']: "munin"
|
||
|
@timeout = ENV.member?('timeout') ? ENV['timeout']: 30
|
||
|
@connector = ENV.member?('connector') ? ENV['connector']: "http-#{@port}";
|
||
|
|
||
|
# hash
|
||
|
w = {
|
||
|
"jvmMemory" => { "max" => "U",
|
||
|
"total" => "U",
|
||
|
"used" => "U" },
|
||
|
"threadInfo" => { "maxThreads" => "U",
|
||
|
"currentThreadCount" => "U",
|
||
|
"currentThreadsBusy" => "U" },
|
||
|
"requestMaxTime" => { "maxTime" => "U" },
|
||
|
"requestTime" => { "avgTime" => "U" },
|
||
|
"requestCount" => { "requestCount" => "U",
|
||
|
"errorCount" => "U" },
|
||
|
"requestBytes" => { "bytesReceived" => "U",
|
||
|
"bytesSent" => "U" }
|
||
|
}
|
||
|
|
||
|
# http request
|
||
|
def getstat()
|
||
|
Net::HTTP.start(@host, @port) do |http|
|
||
|
http.open_timeout = @timeout
|
||
|
req = Net::HTTP::Get.new(@request)
|
||
|
req.basic_auth @user, @password
|
||
|
response = http.request(req)
|
||
|
response.value()
|
||
|
return response.body
|
||
|
end rescue begin
|
||
|
return false
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def autoconf()
|
||
|
begin
|
||
|
if getstat()
|
||
|
puts "yes"
|
||
|
return 0
|
||
|
end
|
||
|
rescue
|
||
|
puts "no (#{$!})"
|
||
|
return 1
|
||
|
end
|
||
|
end
|
||
|
|
||
|
if ARGV[0] == "autoconf"
|
||
|
exit autoconf()
|
||
|
end
|
||
|
|
||
|
if ARGV[0] == "install"
|
||
|
exit if autoconf() != 0
|
||
|
Dir["plugins/tomcat*"].each { |f|
|
||
|
print "removing #{f}\n"
|
||
|
File.unlink f
|
||
|
}
|
||
|
w.each { |k, v|
|
||
|
print "installing plugins/tomcat_#{k}\n"
|
||
|
File.symlink "../tomcat", "plugins/tomcat_#{k}" if ! FileTest.symlink? "plugins/tomcat_#{k}"
|
||
|
}
|
||
|
exit
|
||
|
end
|
||
|
|
||
|
# open stderr
|
||
|
e = IO.new(2, "w")
|
||
|
|
||
|
mode = $0.gsub /.*\/tomcat_/, ""
|
||
|
if mode =~ /tomcat/ then
|
||
|
e.puts "Invalid mode"
|
||
|
exit 1
|
||
|
end
|
||
|
|
||
|
# munin config request
|
||
|
if ARGV[0] == "config"
|
||
|
puts "graph_title tomcat_#{mode}"
|
||
|
puts "graph_args -l 0 --base 1000"
|
||
|
#print "graph_order "
|
||
|
#w[mode].each { |k, v|
|
||
|
#print "#{k} "
|
||
|
#}
|
||
|
#puts
|
||
|
case mode
|
||
|
when "jvmMemory"
|
||
|
puts "graph_category tomcat"
|
||
|
puts "graph_vlabel bytes"
|
||
|
puts "graph_order max total used"
|
||
|
w[mode].each { |k, v|
|
||
|
puts "#{k}.label #{k}"
|
||
|
puts "#{k}.type GAUGE"
|
||
|
puts "#{k}.min 0"
|
||
|
puts "#{k}.draw AREA"
|
||
|
}
|
||
|
when "requestCount"
|
||
|
puts "graph_category tomcat"
|
||
|
puts "graph_order requestCount errorCount"
|
||
|
puts "graph_vlabel Request / sec"
|
||
|
w[mode].each { |k, v|
|
||
|
puts "#{k}.label #{k}"
|
||
|
puts "#{k}.type COUNTER"
|
||
|
puts "#{k}.min 0"
|
||
|
puts "#{k}.draw AREA" if k == "requestCount"
|
||
|
puts "#{k}.draw LINE2" if k != "requestCount"
|
||
|
}
|
||
|
when "requestBytes"
|
||
|
puts "graph_category tomcat"
|
||
|
puts "graph_vlabel bytes in (-) / out (+) per ${graph_period}"
|
||
|
w[mode].each { |k, v|
|
||
|
puts "#{k}.label #{k}"
|
||
|
puts "#{k}.type DERIVE"
|
||
|
puts "#{k}.min 0"
|
||
|
puts "#{k}.graph no" if k == "bytesReceived"
|
||
|
puts "#{k}.negative bytesReceived" if k == "bytesSent"
|
||
|
|
||
|
}
|
||
|
when "requestMaxTime"
|
||
|
puts "graph_category tomcat"
|
||
|
puts "graph_vlabel sec"
|
||
|
w[mode].each { |k, v|
|
||
|
puts "#{k}.label #{k}"
|
||
|
puts "#{k}.type GAUGE"
|
||
|
puts "#{k}.min 0"
|
||
|
puts "#{k}.draw LINE2"
|
||
|
}
|
||
|
when "requestTime"
|
||
|
puts "graph_category tomcat"
|
||
|
puts "graph_vlabel Average RequestTime (sec) / Request"
|
||
|
w[mode].each { |k, v|
|
||
|
puts "#{k}.label #{k}"
|
||
|
puts "#{k}.type GAUGE"
|
||
|
puts "#{k}.min 0"
|
||
|
puts "#{k}.draw LINE2"
|
||
|
}
|
||
|
when "threadInfo"
|
||
|
puts "graph_category tomcat"
|
||
|
puts "graph_order maxThreads currentThreadCount currentThreadsBusy"
|
||
|
w[mode].each { |k, v|
|
||
|
puts "#{k}.label #{k}"
|
||
|
puts "#{k}.type GAUGE"
|
||
|
puts "#{k}.min 0"
|
||
|
puts "#{k}.draw AREA"
|
||
|
}
|
||
|
end
|
||
|
exit 0
|
||
|
end
|
||
|
|
||
|
|
||
|
# XML parsolasa
|
||
|
begin
|
||
|
parser = XML::Parser.string(getstat())
|
||
|
doc = parser.parse
|
||
|
end rescue begin
|
||
|
e.puts "Parse error"
|
||
|
exit 1
|
||
|
end
|
||
|
|
||
|
# root element kivalasztasa
|
||
|
root = doc.root
|
||
|
if root.name != "status"
|
||
|
e.puts "Invalid XML"
|
||
|
exit 1
|
||
|
end
|
||
|
|
||
|
# copy jvm memory datas to hash
|
||
|
node = doc.find('//status/jvm/memory').first
|
||
|
w["jvmMemory"]["used"] = node.property("total").to_i - node.property("free").to_i
|
||
|
w["jvmMemory"]["total"] = node.property("total")
|
||
|
w["jvmMemory"]["max"] = node.property("max")
|
||
|
|
||
|
# copy connector datas to hash
|
||
|
doc.find('//status/connector').each do |node|
|
||
|
if node.property("name") == @connector
|
||
|
node.each do |child|
|
||
|
if child.name == "threadInfo"
|
||
|
w["threadInfo"]["maxThreads"] = child.property("maxThreads")
|
||
|
w["threadInfo"]["currentThreadCount"] = child.property("currentThreadCount")
|
||
|
w["threadInfo"]["currentThreadsBusy"] = child.property("currentThreadsBusy")
|
||
|
end
|
||
|
if child.name == "requestInfo"
|
||
|
w["requestMaxTime"]["maxTime"] = child.property("maxTime")
|
||
|
w["requestTime"]["avgTime"] = sprintf "%.2f", (child.property("processingTime").to_f / child.property("requestCount").to_f / 1000)
|
||
|
w["requestCount"]["requestCount"] = child.property("requestCount")
|
||
|
w["requestCount"]["errorCount"] = child.property("errorCount")
|
||
|
w["requestBytes"]["bytesReceived"] = child.property("bytesReceived")
|
||
|
w["requestBytes"]["bytesSent"] = child.property("bytesSent")
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
# print result
|
||
|
w[mode].each do |k, v|
|
||
|
printf "#{k}.value %s\n", v
|
||
|
end
|
||
|
|
||
|
# XML Output:
|
||
|
#<?xml version="1.0" encoding="utf-8"?>
|
||
|
#<?xml-stylesheet type="text/xsl" href="/manager/xform.xsl" ?>
|
||
|
#<status>
|
||
|
# <jvm>
|
||
|
# <memory free='110552760' total='257425408' max='1034027008'/>
|
||
|
# </jvm>
|
||
|
# <connector name='http-8080'>
|
||
|
# <threadInfo maxThreads="40" currentThreadCount="1" currentThreadsBusy="1" />
|
||
|
# <requestInfo maxTime="14" processingTime="2619" requestCount="1911" errorCount="5" bytesReceived="0" bytesSent="3294996" />
|
||
|
# <workers>
|
||
|
# <worker stage="S" requestProcessingTime="0" requestBytesSent="0" requestBytesReceived="0" remoteAddr="127.0.0.1" virtualHost="localhost" method="GET" currentUri="/manager/status" currentQueryString="XML=true" protocol="HTTP/1.0" />
|
||
|
# </workers>
|
||
|
# </connector>
|
||
|
# <connector name='jk-8009'>
|
||
|
# <threadInfo maxThreads="200" currentThreadCount="8" currentThreadsBusy="6" />
|
||
|
# <requestInfo maxTime="36961" processingTime="273750" requestCount="5485" errorCount="43" bytesReceived="0" bytesSent="57138822" />
|
||
|
# <workers>
|
||
|
# <worker stage="K" requestProcessingTime="22683456" requestBytesSent="0" requestBytesReceived="0" remoteAddr="86.101.240.226" virtualHost="?" method="?" currentUri="?" currentQueryString="?" protocol="?" />
|
||
|
# <worker stage="K" requestProcessingTime="35807" requestBytesSent="0" requestBytesReceived="0" remoteAddr="217.20.130.27" virtualHost="?" method="?" currentUri="?" currentQueryString="?" protocol="?" />
|
||
|
# <worker stage="K" requestProcessingTime="32247045" requestBytesSent="0" requestBytesReceived="0" remoteAddr="89.147.76.234" virtualHost="?" method="?" currentUri="?" currentQueryString="?" protocol="?" />
|
||
|
# <worker stage="K" requestProcessingTime="95860" requestBytesSent="0" requestBytesReceived="0" remoteAddr="217.20.130.27" virtualHost="?" method="?" currentUri="?" currentQueryString="?" protocol="?" />
|
||
|
# <worker stage="K" requestProcessingTime="155940" requestBytesSent="0" requestBytesReceived="0" remoteAddr="217.20.130.27" virtualHost="?" method="?" currentUri="?" currentQueryString="?" protocol="?" />
|
||
|
# </workers>
|
||
|
# </connector>
|
||
|
#</status>
|