Skip to content

Instantly share code, notes, and snippets.

@beezly
Created April 2, 2014 22:55
Show Gist options
  • Save beezly/9944984 to your computer and use it in GitHub Desktop.
Save beezly/9944984 to your computer and use it in GitHub Desktop.
Collecting ZXTM performance data and passing it to graphite
#!/usr/bin/env ruby
require "rubygems"
require "active_support/inflector"
require "snmp"
require 'graphite-api'
require 'graphite-api/core_ext/numeric'
require 'logger'
require "pp"
NODE_STATE = [ :undefined, :alive, :dead, :unknown, :draining ]
POOL_STATE = [ :undefined, :active, :disabled, :draining, :unused ]
def query_pools
node_identifiers = [
"perPoolNodePoolName",
"perPoolNodeNodeHostName",
"perPoolNodeNodePort"
]
node_metrics = [
"perPoolNodeState",
"perPoolNodeCurrentRequests",
"perPoolNodeTotalConn",
"perPoolNodePooledConn",
"perPoolNodeFailures",
"perPoolNodeNewConn",
"perPoolNodeErrors",
"perPoolNodeResponseMean",
"perPoolNodeResponseMax",
"perPoolNodeResponseMin",
"perPoolNodeIdleConns",
"perPoolNodeCurrentConn",
"perPoolNodeBytesFromNode",
"perPoolNodeBytesToNode",
]
graphite_metrics = {}
@snmp_manager.walk(node_identifiers+node_metrics) do |row|
identifiers = Hash[row.take(node_identifiers.count).map.with_index {|x,i| [node_identifiers[i].underscore.to_sym, x.value.to_s ] }]
if identifiers[:per_pool_node_node_port]!="0"
metrics = Hash[row.drop(node_identifiers.count).map.with_index {|x,i| [node_metrics[i].sub('perPoolNode','').tr(' ','_').underscore.to_sym, x.value.to_i] }]
metric_name_prefix = ["zxtm.#{@system_name}.pools.",
"#{identifiers[:per_pool_node_pool_name].tr(' ','_').underscore}.",
"nodes.",
"#{identifiers[:per_pool_node_node_host_name].sub('.shef.ac.uk','').underscore.tr('.','_')}_#{identifiers[:per_pool_node_node_port]}"].join
graphite_metrics.merge! Hash[metrics.map {|k,v| ["#{metric_name_prefix}.#{k}",v]}]
end
end
graphite_metrics
end
@host = ARGV[0]
@snmp_manager = SNMP::Manager.new(host: @host, mib_dir: 'mib', mib_modules: ['ZXTM-MIB-SMIv2'])
@system_name = @snmp_manager.get_value('1.3.6.1.2.1.1.5.0').underscore
client = GraphiteAPI.new(graphite: 'stats.shef.ac.uk:2003')
puts 'Got here'
loop do
puts 'Collecting metrics'
p=query_pools
puts 'Sending metrics'
client.metrics p
sleep 10
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment