I have written a Python script to get information from a Citrix Netscaler appliance using SNMP and visualize them with Grafana. The SNMP data is retrieved with the snmpwalk tool.
The dashboard looks like this :
The software requirements are the following :
- a debian / ubuntu system (you can choose another os but prefer those ones if you need help :))
- influxdb database
- grafana
- python (for me I have the version 2.7.3)
- InfluxDBClient for python
Here we go…
You will have to perform some configurations on your Netscaler appliance :
- Configuration tab > System > SNMP > Community > Add a new community “ctxmon” with permission “GET_NEXT”
- Configuration tab > System > SNMP > Managers > Add the IP address of the linux server where the snmpwalk command will run
Download the Netscaler MIB and install it on your linux server
Copy the mib file to ~/.snmp/mibs/NS-ROOT-MIB
Edit the file ~/.snmp/snmp.conf
mibs +NS-ROOT-MIB
You can test if it works by launching the following command :
/usr/bin/snmpwalk -c ctxmon 10.11.0.100 -v2c 1.3.6.1.4.1.5951.4.1.1.41.8
And now the scripts :
#!/usr/bin/python from __future__ import division import socket import ConfigParser import os import subprocess from subprocess import call import threading import re import time from influxdb import InfluxDBClient config = ConfigParser.RawConfigParser() config.read(os.path.dirname(os.path.realpath(__file__))+'/config.ini') snmpwalk = config.get('config', 'SNMPWALK') snmpcommunity = config.get('config', 'COMMUNITY') snmpmib = config.get('config', 'MIBNAME') snmpversion = "-v2c" dbsrvip = config.get('config', 'DBSRVIP') dbsrvusr = config.get('config', 'DBSRVUSR') dbsrvpwd= config.get('config', 'DBSRVPWD') dbname= config.get('config', 'DBNAME') netscaler_list = config.get('config', 'NETSCALER_IP') sct = re.compile("^mon---", re.IGNORECASE) client = InfluxDBClient(dbsrvip, 8096, dbsrvusr, dbsrvpwd, dbname) monsct = filter(sct.search, config.sections()) threadLimiter = threading.BoundedSemaphore(value=200) class myThread (threading.Thread): def __init__(self, threadID, name, snmpcmd, snmpmoninfo): threading.Thread.__init__(self) self.threadID = threadID self.name = name self.snmpcmd = snmpcmd self.snmpmoninfo = snmpmoninfo def run(self): threadLimiter.acquire() try: print_adrepl(self.name, self.snmpcmd, self.snmpmoninfo ) finally: threadLimiter.release() def print_adrepl(threadName, snmpcmd, snmpmoninfo): proc = subprocess.Popen(snmpcmd,stdout=subprocess.PIPE, stderr=subprocess.PIPE) outputlines = filter(lambda x:len(x)>0,(line.strip() for line in proc.stdout)) for mon in outputlines: t = re.search(' = (.+?): ', mon) if t: regexp = re.compile(r'[INTEGER|Gauge32|Counter64]') if regexp.search(t.group(1)) is not None: print t.group(1) m = re.search('NS-ROOT-MIB::(.+?)\.', mon) if m: monitor_name = m.group(1) n = re.search('\.(.+?) = ', mon) if n: monitor_component = n.group(1).replace('"',"") monitor_value = mon.split(': ')[-1] if re.search('[a-zA-Z]', monitor_value): v = re.search('\((.+?)\)', monitor_value) if v: monitor_value = v.group(1) if (monitor_value).isdigit(): timeserie = threadName + '.' + monitor_name + '_' + monitor_component json_body = [{ "points": [ [int(time.time()), int(monitor_value)] ], "name": timeserie, "columns": ["time", "value"] }] client.write_points(json_body, time_precision='s') else: print threadName + '---' + monitor_name + monitor_component + monitor_value threads = [] nslist = netscaler_list.split(' , ') while 1: i = 1 for nsip in nslist: for monitor in monsct : snmpinfo = config.get(monitor, 'SNMPNAME') snmpoid = config.get(monitor, 'SNMPOID') snmpcmd = [snmpwalk , "-m" , snmpmib , "-c" , snmpcommunity , nsip , snmpversion , snmpoid ] thread = myThread(i, str(nsip), snmpcmd, snmpinfo ) thread.start() threads.append(thread) i += 1 time.sleep(30) for t in threads: t.join() print "Exiting Main Thread"
[config] SNMPWALK=/usr/bin/snmpwalk COMMUNITY=ctxmon MIBNAME=NS-ROOT-MIB NETSCALER_IP=10.11.0.100 , 10.11.0.200 [mon---1] SNMPNAME=nsCPUusage SNMPOID=1.3.6.1.4.1.5951.4.1.1.41.6.1.2 [mon---2] SNMPNAME=nsSysHealthDiskTable SNMPOID=1.3.6.1.4.1.5951.4.1.1.41.8 [mon---3] SNMPNAME=nsTcpStatsGroup SNMPOID=1.3.6.1.4.1.5951.4.1.1.46 [mon---4] SNMPNAME=nsHttpStatsGroup SNMPOID=1.3.6.1.4.1.5951.4.1.1.48 [mon---5] SNMPNAME=nsAaaStatsGroup SNMPOID=1.3.6.1.4.1.5951.4.1.1.67 [mon---6] SNMPNAME=vserverTable SNMPOID=1.3.6.1.4.1.5951.4.1.3.1 [mon---7] SNMPNAME=sysHighAvailabilityMode SNMPOID=1.3.6.1.4.1.5951.4.1.1.6
Do not hesitate to leave a message if you have a question or a problem to make it work !
My Powershell script categories
- Active Directory
- Cluster
- Database
- Exchange
- Files and folders
- Hardware
- Network
- Operating System
- PKI
- SCCM
- Service and process
- Tips
- VMWare
Hi,
I am trying this script. It is’t working.
Could u help to me ?
raceback (most recent call last):
File “nsdashboard.py”, line 16, in
snmpwalk = config.get(‘config’, ‘SNMPWALK’)
File “/usr/lib/python2.7/ConfigParser.py”, line 330, in get
raise NoSectionError(section)
ConfigParser.NoSectionError: No section: ‘config’