Class: HBaseMonitor

Inherits:
Rubix::ClusterMonitor show all
Defined in:
lib/rubix/examples/hbase_monitor.rb

Constant Summary collapse

CLUSTER_HOSTGROUPS =

Hostgroups for clusters & hosts that need to be created.

'HBase clusters'
CLUSTER_TEMPLATES =

Templates for any hosts that need to be created.

'Template_HBase_Cluster'
NODE_TEMPLATES =
'Template_HBase_Node'
CLUSTER_APPLICATIONS =

Applications for items that are written

'_cluster'
NODE_APPLICATIONS =
"Hbase"

Instance Attribute Summary

Attributes inherited from Rubix::ClusterMonitor

#nodes_by_cluster, #private_ips_by_cluster

Attributes inherited from Rubix::Monitor

#settings

Instance Method Summary collapse

Methods inherited from Rubix::ClusterMonitor

#clusters, #group_nodes_by_cluster, #initialize, #measure, #node_query

Methods inherited from Rubix::ChefMonitor

#chef_node_from_node_name, #chef_node_name_from_ip, default_settings, #initialize, #search_nodes, #set_chef_credentials

Methods inherited from Rubix::Monitor

#close, default_settings, #fifo?, #file?, #initialize, #loop?, #loop_period, #measure, #output, #output_path, #run, run, #stdout?, #write

Constructor Details

This class inherits a constructor from Rubix::ClusterMonitor

Instance Method Details

#matching_chef_nodesObject



23
24
25
# File 'lib/rubix/examples/hbase_monitor.rb', line 23

def matching_chef_nodes
  Chef::Search::Query.new.search('node', 'provides_service:*hbase-stargate AND facet_name:alpha')
end

#measure_cluster(cluster_name) ⇒ Object



27
28
29
30
31
32
33
# File 'lib/rubix/examples/hbase_monitor.rb', line 27

def measure_cluster cluster_name
  measured_cluster_status  = false
  private_ips_by_cluster[cluster_name].each do |private_ip|
    measured_cluster_status  = measure_cluster_status(cluster_name, private_ip)  unless measured_cluster_status
    break if measured_cluster_status
  end
end

#measure_cluster_nodes(cluster_name, live_nodes) ⇒ Object



74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
# File 'lib/rubix/examples/hbase_monitor.rb', line 74

def measure_cluster_nodes cluster_name, live_nodes
  live_nodes.each do |live_node|
    next unless live_node
    ip        = (live_node['name'] || '').split(':').first
    node_name = chef_node_name_from_ip(ip)
    next unless node_name
    write({
            :hostname    => node_name,
            :application => self.class::NODE_APPLICATIONS,
            :templates   => self.class::NODE_TEMPLATES
          }) do |d|
      d << ['hbase.regions',   (live_node['Region'] || []).size]
      d << ['hbase.heap_size', live_node['heapSizeMB']]
      d << ['hbase.requests',  live_node['requests']]
    end
  end
end

#measure_cluster_status(cluster_name, private_ip) ⇒ Object

Measure the cluster health metrics – /status/cluster



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
# File 'lib/rubix/examples/hbase_monitor.rb', line 36

def measure_cluster_status cluster_name, private_ip
  begin
    connection = Net::HTTP.new(private_ip, 8080) # FIXME port
    request    = Net::HTTP::Get.new('/status/cluster', 'Accept' => 'text/xml')
    response   = connection.request(request)
    return false unless response.code.to_i == 200
    
    data           = Crack::XML.parse(response.body)
    cluster_status = data['ClusterStatus']
    dead_nodes     = cluster_status['DeadNodes'] ? cluster_status['DeadNodes']['Node'] : []
    live_nodes     = cluster_status['LiveNodes']['Node']
  rescue NoMethodError, SocketError, REXML::ParseException, Errno::ECONNREFUSED => e
    # puts "#{e.class} -- #{e.message}"
    # puts e.backtrace
    return false
  end

  write({
          :hostname    => "#{cluster_name}-hbase",
          :hostgroup   => self.class::CLUSTER_HOSTGROUPS,
          :application => self.class::CLUSTER_APPLICATIONS,
          :templates   => self.class::CLUSTER_TEMPLATES
        }) do |d|
    d << ['requests',    cluster_status['requests']]
    d << ['regions',     cluster_status['regions']]
    d << ['load',        cluster_status['averageLoad']]
    d << ['nodes.dead',  dead_nodes.size]
    d << ['nodes.alive', live_nodes.size]
  end
  measure_cluster_tables(cluster_name, data)
  measure_cluster_nodes(cluster_name, live_nodes)
  true
end

#measure_cluster_tables(cluster_name, data) ⇒ Object



70
71
72
# File 'lib/rubix/examples/hbase_monitor.rb', line 70

def measure_cluster_tables cluster_name, data
  # FIXME...not sure how best to get information about "tables" in HBase...
end