FC_RTGraph - how to graph information from SNMP devices

FC_RTGraph is a tool that allows you to collect and graph information from SNMP devices. FC_RTGraph takes an XML formatted config file as input.

FC_RTGraph is an excellent tool for real-time monitoring. Collected SNMP data can be graphed in highly customizable 3D graphs (Bar, Area, Line, 3D). FC_RTGraph can be run on Microsoft Windows 2000/2003, XP and Vista. FC_RTGraph supports SNMPv1 + SNMPv2.

Supported OIDs in the free version

The free version only supports the SNMP rfc1213 OIDs. The non free version, expected at the end of Q1 2008, supports all OIDs. The list of supported OIDs in the free version can be found here.

Commandline

FC_RTGraph can be started from the commandline or through a shortcut on the desktop. The name and location of the config xml file can be specified using the /xml commandline switch as in:

C:\RTGraph\FC_RTGraph.exe /xml "C:\RTGraph\GraphConfig.xml"

XML config file

The config xml file has the following format

<?xml version="1.0"?>
<rtgraph>
	<programtitle></programtitle>
	<charttitle></charttitle>
	<xaxis></xaxis>
	<yaxis></yaxis>
	<barstyle></barstyle>
	<multibartype></multibartype>
	<chart3D></chart3D>
	<legendalignment></legendalignment>
	<preferredinstance></preferredinstance>
	<top20only></top20only>
	<showvaluelabels></showvaluelabels>
	<automaticupdownscaling></automaticupdownscaling>
	<refreshinstances></refreshinstances>
	<width></width>
	<height></height>
	<host></host>
	<community></community>
	<pollinginterval></pollinginterval>
	<shooter>
		<raw></raw>
		<linear></linear>
		<remoteport></remoteport>
		<snmpversion></snmpversion>
		<shootertargets>
			<shootertarget>
				<oid></oid>
				<oiddescr></oiddescr>
				<instance></instance>
				<visible></visible>
				<formula></formula>
			</shootertarget>
		</shootertargets>
	</shooter>
</rtgraph>

XML tag descriptions

The xml tag descriptions can be found here.

Examples

Attention! Attention! If you copy and paste the xml examples shown below don't forget to modify the "host" and "community" fields in order to poll devices in your own network environment. Also, be aware that not all hosts support snmp nor have it enabled by default!

Example 1.

The following XML file is the configuration for a graph that collects (every sec) the incoming bytes (ifInOctets) on port 7 of a switch.

<?xml version="1.0"?>
<rtgraph>
	<programtitle>Example</programtitle>
	<charttitle>Incoming bytes on port 7</charttitle>
	<xaxis>This is the x-axis</xaxis>
	<yaxis>This is the y-axis</yaxis>
	<barstyle>rectangle</barstyle>
	<multibartype>behind</multibartype>
	<chart3D>true</chart3D>
	<legendalignment>bottom</legendalignment>
	<preferredinstance></preferredinstance>
	<top20only></top20only>
	<showvaluelabels></showvaluelabels>
	<automaticupdownscaling>true</automaticupdownscaling>
	<refreshinstances></refreshinstances>
	<width></width>
	<height></height>
	<host>192.168.3.10</host>
	<community>public</community>
	<pollinginterval>1</pollinginterval>
	<shooter>
		<raw>false</raw>
		<linear>true</linear>
		<remoteport></remoteport>
		<snmpversion></snmpversion>
		<shootertargets>
			<shootertarget>
				<oid>1.3.6.1.2.1.2.2.1.10</oid>
				<oiddescr></oiddescr>
				<instance>.7</instance>
				<visible>true</visible>
				<formula></formula>
			</shootertarget>
		</shootertargets>
	</shooter>
</rtgraph>

Output example 1.

Example 2.

The following XML file is the configuration for a graph that collects (every 4 sec) the incoming and outgoing bytes (ifInOctets/ifOutOctets) of a port of the switch. For the port (instance) is prompted at runtime.

<?xml version="1.0"?>
<rtgraph>
	<programtitle>Example</programtitle>
	<charttitle>Incoming/outgoing bytes/port</charttitle>
	<xaxis>This is the x-axis</xaxis>
	<yaxis>This is the y-axis</yaxis>
	<barstyle>rectangle</barstyle>
	<multibartype>behind</multibartype>
	<chart3D>true</chart3D>
	<legendalignment>bottom</legendalignment>
	<preferredinstance></preferredinstance>
	<top20only></top20only>
	<showvaluelabels></showvaluelabels>
	<automaticupdownscaling>true</automaticupdownscaling>
	<refreshinstances></refreshinstances>
	<width></width>
	<height></height>
	<host>192.168.3.10</host>
	<community>public</community>
	<pollinginterval>4</pollinginterval>
	<shooter>
		<raw>false</raw>
		<linear>true</linear>
		<remoteport></remoteport>
		<snmpversion></snmpversion>
		<shootertargets>
			<shootertarget>
				<oid>1.3.6.1.2.1.2.2.1.10</oid>
				<oiddescr></oiddescr>
				<instance>at runtime</instance>
				<visible>true</visible>
				<formula></formula>
			</shootertarget>
			<shootertarget>
				<oid>1.3.6.1.2.1.2.2.1.16</oid>
				<oiddescr></oiddescr>
				<instance>at runtime</instance>
				<visible>true</visible>
				<formula></formula>
			</shootertarget>
		</shootertargets>
	</shooter>
</rtgraph>

Output example 2.

Example 3.

The following XML file is the configuration for a graph that collects (every 4 sec) the incoming and outgoing KBytes (ifInOctets/ifOutOctets) of a port of the switch. For the port (instance) is prompted at runtime. Note that the calculations required to get the Kbytes is done through formulas.
The "visible" tag of the ifInOctet and ifOutOctet Shooter targets is set to false. This is because we don't want to display them but we only want to use their values in formulas.
Formulas are a special type of Shooter targets. In this case, the oid tag of a target specifying a formula is used to specify the name for the formula. Each specified formula must have a unique name. A formula name must consist of the word 'Formula' followed by an index. This way, the name of the first formula is "Formula1", the second one "Formla2" and so on. The instance tags of the formula targets may be left blank.

<?xml version="1.0"?>
<rtgraph>
	<programtitle>Example</programtitle>
	<charttitle>Incoming/outgoing KBytes/port</charttitle>
	<xaxis>This is the x-axis</xaxis>
	<yaxis>This is the y-axis</yaxis>
	<barstyle>rectangle</barstyle>
	<multibartype>behind</multibartype>
	<chart3D>true</chart3D>
	<legendalignment>left</legendalignment>
	<preferredinstance></preferredinstance>
	<top20only></top20only>
	<showvaluelabels></showvaluelabels>
	<automaticupdownscaling>true</automaticupdownscaling>
	<refreshinstances></refreshinstances>
	<width></width>
	<height></height>
	<host>192.168.3.10</host>
	<community>public</community>
	<pollinginterval>4</pollinginterval>
	<shooter>
		<raw>false</raw>
		<linear>true</linear>
		<remoteport></remoteport>
		<snmpversion></snmpversion>
		<shootertargets>
			<shootertarget>
				<oid>1.3.6.1.2.1.2.2.1.10</oid>
				<oiddescr></oiddescr>
				<instance>at runtime</instance>
				<visible>false</visible>
				<formula></formula>
			</shootertarget>
			<shootertarget>
				<oid>1.3.6.1.2.1.2.2.1.16</oid>
				<oiddescr></oiddescr>
				<instance>at runtime</instance>
				<visible>false</visible>
				<formula></formula>
			</shootertarget>
			<shootertarget>
				<oid>Formula1</oid>
				<oiddescr></oiddescr>
				<instance></instance>
				<visible>true</visible>
				<formula>InKBs,a/(1024),a=1.3.6.1.2.1.2.2.1.10</formula>
			</shootertarget>
			<shootertarget>
				<oid>Formula2</oid>
				<oiddescr></oiddescr>
				<instance></instance>
				<visible>true</visible>
				<formula>OutKBs,b/(1024),b=1.3.6.1.2.1.2.2.1.16</formula>
			</shootertarget>
		</shootertargets>
	</shooter>
</rtgraph>

Output example 3.

Example 4.

The following XML file defines a graph that collects the ifInOctets of all ports of a switch. I'm using a 24-ports HP2524 switch for this example. The y-axis is in KBytes/s. For the calculation we again need a formula. The polling interval can be set at runtime. Because of this we need the special variable $PI in our formula. $PI gives the polling interval (in seconds) at runtime.

<?xml version="1.0"?>
<rtgraph>
	<programtitle>Example</programtitle>
	<charttitle>Incoming KBytes/s - all ports</charttitle>
	<xaxis>Samples</xaxis>
	<yaxis>KBytes/s</yaxis>
	<barstyle>rectangle</barstyle>
	<multibartype>behind</multibartype>
	<chart3D>true</chart3D>
	<legendalignment>right</legendalignment>
	<preferredinstance></preferredinstance>
	<top20only>true</top20only>
	<showvaluelabels></showvaluelabels>
	<automaticupdownscaling>true</automaticupdownscaling>
	<refreshinstances></refreshinstances>
	<width></width>
	<height></height>
	<host>192.168.3.10</host>
	<community>public</community>
	<pollinginterval>4</pollinginterval>
	<shooter>
		<raw>false</raw>
		<linear>true</linear>
		<remoteport></remoteport>
		<snmpversion></snmpversion>
		<shootertargets>
			<shootertarget>
				<oid>1.3.6.1.2.1.2.2.1.10</oid>
				<oiddescr></oiddescr>
				<instance>all instances</instance>
				<visible>false</visible>
				<formula></formula>
			</shootertarget>
			<shootertarget>
				<oid>Formula1</oid>
				<oiddescr></oiddescr>
				<instance></instance>
				<visible>true</visible>
				<formula>InKBs,(a/$PI)/(1024),a=1.3.6.1.2.1.2.2.1.10</formula>
			</shootertarget>
		</shootertargets>
	</shooter>
</rtgraph>

Output example 4.

Example 5.

The following XML file defines a graph that collects the ifInOctets and ifOutOctets of all ports of a switch. The collected values are shown in the graph in MBytes/s. Also, Incoming bytes use the positive y-axis, outgoing bytes use the negative y-axis. This way it's easy to see what ports have high traffic and in what direction.

<?xml version="1.0"?>
<rtgraph>
   <programtitle>Example</programtitle>
   <charttitle>Incoming/Outgoing MBytes/s - all ports</charttitle>
   <xaxis>Samples</xaxis>
   <yaxis>Outgoing ----- Incoming</yaxis>
   <barstyle>rectangle</barstyle>
   <multibartype>behind</multibartype>
   <chart3D>true</chart3D>
   <legendalignment>right</legendalignment>
   <preferredinstance></preferredinstance>
   <top20only>true</top20only>
   <showvaluelabels></showvaluelabels>
   <automaticupdownscaling>true</automaticupdownscaling>
   <refreshinstances></refreshinstances>
   <width></width>
   <height></height>
   <host>10.0.0.1</host>
   <community>public</community>
   <pollinginterval>4</pollinginterval>
   <shooter>
      <raw>false</raw>
      <linear>true</linear>
      <remoteport></remoteport>
      <snmpversion></snmpversion>
      <shootertargets>
         <shootertarget>
            <oid>1.3.6.1.2.1.2.2.1.10</oid>
            <oiddescr></oiddescr>
            <instance>all instances</instance>
            <visible>false</visible>
            <formula></formula>
         </shootertarget>
         <shootertarget>
            <oid>1.3.6.1.2.1.2.2.1.16</oid>
            <oiddescr></oiddescr>
            <instance>all instances</instance>
            <visible>false</visible>
            <formula></formula>
         </shootertarget>
         <shootertarget>
            <oid>Formula1</oid>
            <oiddescr></oiddescr>
            <instance></instance>
            <visible>true</visible>
            <formula>InMBs,(a/$PI)/(1024*1024),a=1.3.6.1.2.1.2.2.1.10</formula>
         </shootertarget>
         <shootertarget>
            <oid>Formula2</oid>
            <oiddescr></oiddescr>
            <instance></instance>
            <visible>true</visible>
            <formula>OutMBs,(0-1)*((a/$PI)/(1024*1024)),a=1.3.6.1.2.1.2.2.1.16</formula>
         </shootertarget>
      </shootertargets>
   </shooter>
</rtgraph>

Output example 5.

Example 6.

The following XML file defines a graph that shows the utilization/s of port 7 (instance .7) of a switch. We need three values to compute the utilization of a port: ifInOctets, ifOutOctets and ifSpeed. ifSpeed is in bits/s!

<?xml version="1.0"?>
<rtgraph>
 <programtitle>Example</programtitle>
 <charttitle>%Utilization/s - port 7</charttitle>
 <xaxis>Samples</xaxis>
 <yaxis>%Utilization/s</yaxis>
 <barstyle>rectangle</barstyle>
 <multibartype>behind</multibartype>
 <chart3D>true</chart3D>
 <legendalignment>right</legendalignment>
 <preferredinstance></preferredinstance>
 <top20only>true</top20only>
 <showvaluelabels></showvaluelabels>
 <automaticupdownscaling>false</automaticupdownscaling>
 <refreshinstances></refreshinstances>
 <width></width>
 <height></height>
 <host>192.168.3.10</host>
 <community>public</community>
 <pollinginterval>4</pollinginterval>
 <shooter>
  <raw>false</raw>
  <linear>true</linear>
  <remoteport></remoteport>
  <snmpversion></snmpversion>
  <shootertargets>
   <shootertarget>
    <oid>1.3.6.1.2.1.2.2.1.10</oid>
    <oiddescr></oiddescr>
    <instance>.7</instance>
    <visible>false</visible>
    <formula></formula>
   </shootertarget>
   <shootertarget>
    <oid>1.3.6.1.2.1.2.2.1.16</oid>
    <oiddescr></oiddescr>
    <instance>.7</instance>
    <visible>false</visible>
    <formula></formula>
   </shootertarget>
   <shootertarget>
    <oid>1.3.6.1.2.1.2.2.1.5</oid>
    <oiddescr></oiddescr>
    <instance>.7</instance>
    <visible>false</visible>
    <formula></formula>
   </shootertarget>
   <shootertarget>
    <oid>Formula1</oid>
    <oiddescr></oiddescr>
    <instance></instance>
    <visible>true</visible>
    <formula>Util,(((a+b)/$PI)/(c/8))*100,a=1.3.6.1.2.1.2.2.1.10.7,b=1.3.6.1.2.1.2.2.1.16.7,c=1.3.6.1.2.1.2.2.1.5.7</formula>
   </shootertarget>
  </shootertargets>
 </shooter>
</rtgraph>

Output example 6.

Example 7.

The following XML file defines a graph that shows the ifInOctets of all ports of a switch but displays a different legend. The legend is taken from the ifDescr OID. The value of ifDescr is collected through the "AL" Shooter target. AL stands for "Alternative legend". As can be seen in the xml file the format is "AL=1.3.6.1.2.1.2.2.1.2". You can only specify one AL per Shooter (of course) and the "Alternative" must be part of the same snmp table entry!

<?xml version="1.0"?>
<rtgraph>
	<programtitle>Example</programtitle>
	<charttitle>Incoming bytes all ports</charttitle>
	<xaxis>This is the x-axis</xaxis>
	<yaxis>Incoming bytes</yaxis>
	<barstyle>rectangle</barstyle>
	<multibartype>behind</multibartype>
	<chart3D>true</chart3D>
	<legendalignment>bottom</legendalignment>
	<preferredinstance></preferredinstance>
	<top20only></top20only>
	<showvaluelabels></showvaluelabels>
	<automaticupdownscaling>true</automaticupdownscaling>
	<refreshinstances></refreshinstances>
	<width></width>
	<height></height>
	<host>10.0.0.1</host>
	<community>public</community>
	<pollinginterval>1</pollinginterval>
	<shooter>
		<raw>false</raw>
		<linear>true</linear>
		<remoteport></remoteport>
		<snmpversion></snmpversion>
		<shootertargets>
			<shootertarget>
				<oid>1.3.6.1.2.1.2.2.1.10</oid>
				<oiddescr></oiddescr>
				<instance>all instances</instance>
				<visible>true</visible>
				<formula></formula>
			</shootertarget>
			<shootertarget>
				<oid>AL=1.3.6.1.2.1.2.2.1.2</oid>
				<oiddescr></oiddescr>
				<instance></instance>
				<visible>true</visible>
				<formula></formula>
			</shootertarget>
		</shootertargets>
	</shooter>
</rtgraph>

Output example 7.

Example 8.

The following xml configuration file can be used to monitor in- and outgoing traffic on the Workstation/PC that you're currently using. The host tag is set to 'localhost'. Outgoing traffic is displayed on the negative Y-axis. The 3D tag is set to false and the polling interval is set to 10 seconds (Windows Vista refreshes its interface counters only every 10 seconds). The interface from which to display the traffic counters can be chosen at runtime.

<?xml version="1.0"?>
<rtgraph>
   <programtitle>Example</programtitle>
   <charttitle>Incoming/outgoing KBytes/sec</charttitle>
   <xaxis>Samples</xaxis>
   <yaxis>Out -- KBytes/sec -- In</yaxis>
   <barstyle>rectangle</barstyle>
   <multibartype>behind</multibartype>
   <chart3D>false</chart3D>
   <legendalignment>bottom</legendalignment>
   <preferredinstance></preferredinstance>
   <top20only></top20only>
   <showvaluelabels>false</showvaluelabels>
   <automaticupdownscaling>true</automaticupdownscaling>
   <refreshinstances></refreshinstances>
   <width></width>
   <height></height>
   <host>localhost</host>
   <community>public</community>
   <pollinginterval>10</pollinginterval>
   <shooter>
      <raw>false</raw>
      <linear>true</linear>
      <remoteport>161</remoteport>
      <snmpversion>1</snmpversion>
      <shootertargets>
         <shootertarget>
            <oid>1.3.6.1.2.1.2.2.1.10</oid>
            <oiddescr></oiddescr>
            <instance>at runtime</instance>
            <visible>false</visible>
            <formula></formula>
         </shootertarget>
         <shootertarget>
            <oid>1.3.6.1.2.1.2.2.1.16</oid>
            <oiddescr></oiddescr>
            <instance>at runtime</instance>
            <visible>false</visible>
            <formula></formula>
         </shootertarget>
         <shootertarget>
            <oid>Formula1</oid>
            <oiddescr></oiddescr>
            <instance></instance>
            <visible>true</visible>
            <formula>InKBs,(a/$PI)/(1024),a=1.3.6.1.2.1.2.2.1.10</formula>
         </shootertarget>
         <shootertarget>
            <oid>Formula2</oid>
            <oiddescr></oiddescr>
            <instance></instance>
            <visible>true</visible>
            <formula>OutKBs,(0-1)*((b/$PI)/(1024)),b=1.3.6.1.2.1.2.2.1.16</formula>
         </shootertarget>
         <shootertarget>
            <oid>AL=1.3.6.1.2.1.2.2.1.2</oid>
            <oiddescr></oiddescr>
            <instance></instance>
            <visible></visible>
            <formula></formula>
         </shootertarget>
      </shootertargets>
   </shooter>
</rtgraph>

Output example 8.