Skip to content

Instantly share code, notes, and snippets.

@killme2008
Last active December 18, 2015 07:37
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save killme2008/4705395 to your computer and use it in GitHub Desktop.
Save killme2008/4705395 to your computer and use it in GitHub Desktop.
A nagios plugin ruby script to monitor solr cloud cluster
####
# Description:a nagios plugin script to monitor solr cloud cluster
# Requirements: zookeeper
# sudo gem install zookeeper
# sudo gem install rsolr
#
#####
require 'rubygems'
require 'zookeeper'
require 'rsolr'
class SolrCloudMonitor
def initialize(zk_servers, query_path , expect_nodes_count)
@zk = Zookeeper.new(zk_servers)
@query_path = query_path || "select"
@expect_nodes_count = expect_nodes_count
end
def run
#check if live nodes number is right.
live_nodes = safe_zk_get_children("/live_nodes")[:children]
return "Expect #{@expect_nodes_count} live nodes,actual #{live_nodes.size}.",2 if live_nodes.size != @expect_nodes_count
#try query some text using rsolr
errors = []
live_nodes.each do |node|
if node =~ /(.*)_solr$/
server = $1
solr = RSolr.connect :url => "http://#{server}/solr" , :read_timeout => 5, :open_timeout => 5
response = solr.get @query_path, :params => {:q => '*:*', :start=>0, :rows=>10}
errors << "Query solr server:#{server} failed" if response["response"]["docs"].nil? or response["response"]["docs"].size == 0
end
end
if errors.size > 0
return errors.join("\r\n"),2
else
return nil,0
end
end
def close
safe_zk_close
end
private
def safe_zk_close()
begin
@zk.close() if @zk
rescue
#ignore
end
end
def safe_zk_get_children(path, watcher=nil, count=0)
begin
return @zk.get_children({:path => path, :watcher => watcher })
rescue Exception => e
if count >= 3
raise e
else
safe_zk_close()
@zk = Zookeeper.new(@zk_servers)
return safe_zk_get_children(path, watcher, count.succ)
end
end
end
end
if __FILE__ == $0
begin
#We expect six live nodes and use /select for querying.
monitor = SolrCloudMonitor.new("zk1:2181,zk2:2181,zk3:2181", "select" , 6)
error, code = monitor.run
monitor.close
puts error if error
exit code
rescue =>e
puts e.backtrace
puts e.message
exit 3
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment