From 580c41ea3d3cb4952312c7b46f5321fd4e224c09 Mon Sep 17 00:00:00 2001 From: Artem Sheremet Date: Wed, 22 Feb 2012 02:30:54 +0300 Subject: [PATCH] Adding new plugins * netstat_bsd_ for mbufs/etc statistics from BSD's netstat -m * tcp_retries for TCP retransmission count rate from procfs /proc/net/tcp --- plugins/network/netstat_bsd_ | 96 ++++++++++++++++++++++++++++++++++++ plugins/network/tcp_retries | 45 +++++++++++++++++ 2 files changed, 141 insertions(+) create mode 100755 plugins/network/netstat_bsd_ create mode 100755 plugins/network/tcp_retries diff --git a/plugins/network/netstat_bsd_ b/plugins/network/netstat_bsd_ new file mode 100755 index 00000000..e83d3492 --- /dev/null +++ b/plugins/network/netstat_bsd_ @@ -0,0 +1,96 @@ +#!/usr/bin/env ruby + +# netstat_bsd revision 1 (Feb 2012) +# +# This plugin shows various statistics from 'netstat -m' +# +# Required privileges: none +# +# OS: +# Supposed: BSD +# Tested: FreeBSD 8.2 +# +# Author: Artem Sheremet +# + +#%# family=auto +#%# capabilities=autoconf suggest + +# original filename +PLUGIN_NAME = 'netstat_bsd_' + +class String + def escape + self.gsub /[^\w]/, '_' + end + + unless method_defined? :start_with? + def start_with?(str) + self[0...str.size] == str + end + end +end + +def netstat(filter = nil) + Hash[`netstat -m`.split($/).map { |line| + if line =~ /^([\d\/K]+) (.*) \(([\w\/+]+)\)$/ + # 7891K/22385K/30276K bytes allocated to network (current/cache/total) + values, desc, names = $1, $2, $3 + [desc, names.split('/').zip(values.split '/')] if filter.nil? or desc.escape == filter + elsif line =~ /^(\d+) (.*)$/ + # 12327 requests for I/O initiated by sendfile + value, desc = $1, $2 + [desc, [[ :value, value ]]] if filter.nil? or desc.escape == filter + end + }.compact] +end + +stat_name = File.basename($0, '.*').escape +stat_name.slice! 0, PLUGIN_NAME.size if stat_name.start_with? PLUGIN_NAME + +case ARGV.first +when 'autoconf' + puts `uname -s`.include?('FreeBSD') ? 'yes' : 'no' +when 'suggest' + puts netstat.keys.map(&:escape).join $/ +when 'config' + data = netstat(stat_name) + if data.empty? + warn "no data for <#{stat_name}>. Try running with 'suggest'" + else + desc, values = data.first + stack = values.size > 1 + first = true + puts <" +end diff --git a/plugins/network/tcp_retries b/plugins/network/tcp_retries new file mode 100755 index 00000000..085695a4 --- /dev/null +++ b/plugins/network/tcp_retries @@ -0,0 +1,45 @@ +#!/bin/sh + +# tcp_retries revision 2 (Feb 2012) +# +# TCP retransmission rate. Useful for network debugging. +# +# Required privileges: none +# +# OS: Linux with procfs +# +# Author: Artem Sheremet +# + +#%# family=auto +#%# capabilities=autoconf + +TCPSTAT=/proc/net/tcp + +case $1 in + autoconf) + [ -r $TCPSTAT -o -r ${TCPSTAT}6 ] && echo "yes" || echo "no" + ;; + config) + cat <