ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/i-scream/projects/cms/source/server/uk/org/iscream/cms/server/client/monitors/NetIO__Monitor.java
Revision: 1.1
Committed: Sun Mar 9 21:49:13 2003 UTC (21 years, 2 months ago) by tdb
Branch: MAIN
Log Message:
Added support for all the new stuff that ihost provides us with. Ideally
this lot needs to be revamped some day, but for now this brings it all back
up to date.

The biggest change is in the Disk monitor. It wasn't overly neat before,
so I've tidied that up, and also added support for inode monitoring.

Created the DiskIO, NetIO, and Paging monitors to support new types of data
we now handle. The first two sprung from the Disk monitor, whilst the last
is pretty normal.

Configuration has been updated to support the new monitors, although I
don't really have a feel for thresholds for the new types of data.

File Contents

# User Rev Content
1 tdb 1.1 /*
2     * i-scream central monitoring system
3     * http://www.i-scream.org.uk
4     * Copyright (C) 2000-2002 i-scream
5     *
6     * This program is free software; you can redistribute it and/or
7     * modify it under the terms of the GNU General Public License
8     * as published by the Free Software Foundation; either version 2
9     * of the License, or (at your option) any later version.
10     *
11     * This program is distributed in the hope that it will be useful,
12     * but WITHOUT ANY WARRANTY; without even the implied warranty of
13     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14     * GNU General Public License for more details.
15     *
16     * You should have received a copy of the GNU General Public License
17     * along with this program; if not, write to the Free Software
18     * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19     */
20    
21     //---PACKAGE DECLARATION---
22     package uk.org.iscream.cms.server.client.monitors;
23    
24     //---IMPORTS---
25     import java.util.HashMap;
26     import java.util.HashSet;
27     import java.util.Set;
28     import java.util.Iterator;
29     import uk.org.iscream.cms.server.client.*;
30     import uk.org.iscream.cms.server.core.*;
31     import uk.org.iscream.cms.util.*;
32     import uk.org.iscream.cms.server.componentmanager.*;
33    
34     /**
35     * This Monitor watches the network IO for all machines
36     *
37     * @author $Author$
38     * @version $Id$
39     */
40     public class NetIO__Monitor extends MonitorSkeleton {
41    
42     //---FINAL ATTRIBUTES---
43    
44     /**
45     * The current CVS revision of this class
46     */
47     public final String REVISION = "$Revision: 1.1 $";
48    
49     /**
50     * A description of this monitor
51     */
52     public final String DESC = "Monitors network IO on all hosts.";
53    
54     //---STATIC METHODS---
55    
56     //---CONSTRUCTORS---
57    
58     //---PUBLIC METHODS---
59    
60     /**
61     * Analyse a packet of data, and generate an alert if
62     * necessary.
63     *
64     * @param packet the XMLPacket to analyse
65     */
66     public void analysePacket(XMLPacket packet) {
67     String source = packet.getParam("packet.attributes.machine_name");
68     if (!_hostsR.containsKey(source)) {
69     _hostsR.put(source, new HashMap());
70     }
71     if (!_hostsW.containsKey(source)) {
72     _hostsW.put(source, new HashMap());
73     }
74    
75     HashMap netRegistersR = (HashMap) _hostsR.get(source);
76     HashMap netRegistersW = (HashMap) _hostsW.get(source);
77    
78     // key prefix
79     String keyPrefix = "packet.net.p";
80    
81     // a temporary holder for all the network interfaces we find
82     HashSet netifs = new HashSet();
83    
84     // unfortunatly we need to check the whole packet to find
85     // the interfaces, and then get the data attributes
86     Set packetSet = packet.getSet();
87     Iterator i = packetSet.iterator();
88     while (i.hasNext()) {
89     String dataKey = (String) i.next();
90     if(dataKey.startsWith(keyPrefix)) {
91     // pos is after "packet.net.p"
92     int pos = keyPrefix.length();
93     String ifNumber = dataKey.substring(pos, dataKey.indexOf('.', pos));
94     String thisIf = keyPrefix.concat(ifNumber);
95    
96     if(!netifs.contains(thisIf)) {
97     // add the interface to our list
98     netifs.add(thisIf);
99    
100     String name = packet.getParam(thisIf + ".attributes.name");
101    
102     String rxbytes = packet.getParam(thisIf + ".attributes.rx");
103     String txbytes = packet.getParam(thisIf + ".attributes.tx");
104    
105     // check if we've seen this interface before on a previous
106     // run if not, we need to create a register for it
107     if(!netRegistersR.containsKey(name)) {
108     netRegistersR.put(name, new Register(source, _name + ".rxbytes", name));
109     }
110     if(!netRegistersW.containsKey(name)) {
111     netRegistersW.put(name, new Register(source, _name + ".txbytes", name));
112     }
113    
114     // get the register for this interface
115     Register regR = (Register) netRegistersR.get(name);
116     Register regW = (Register) netRegistersW.get(name);
117    
118     // get the packet data
119     int netRbytes, netWbytes;
120     try {
121     if(rxbytes==null || txbytes==null) {
122     throw new NumberFormatException("Network data invalid");
123     }
124     netRbytes = Integer.parseInt(rxbytes);
125     netWbytes = Integer.parseInt(txbytes);
126     } catch (NumberFormatException e) {
127     _logger.write(this.toString(), Logger.WARNING, "Received packet from "+source+" with bad network information: "+e);
128     // don't try to continue and process, try next interface
129     break;
130     }
131    
132     int newThresholdR = checkAttributeThreshold(netRbytes, regR);
133     int newThresholdW = checkAttributeThreshold(netWbytes, regW);
134    
135     // say which disk had the problem
136     String attributeNameR = "Network rx bytes on " + name;
137     String attributeNameW = "Network tx bytes on " + name;
138    
139     processAlert(newThresholdR, attributeNameR, regR, source, String.valueOf(netRbytes));
140     processAlert(newThresholdW, attributeNameW, regW, source, String.valueOf(netWbytes));
141     }
142     }
143     }
144     }
145    
146     /**
147     * Overrides the {@link java.lang.Object#toString() Object.toString()}
148     * method to provide clean logging (every class should have this).
149     *
150     * This uses the uk.org.iscream.cms.util.NameFormat class
151     * to format the toString()
152     *
153     * @return the name of this class and its CVS revision
154     */
155     public String toString() {
156     return FormatName.getName(
157     _name,
158     getClass().getName(),
159     REVISION);
160     }
161    
162     /**
163     * return the String representation of what the monitor does
164     */
165     public String getDescription(){
166     return DESC;
167     }
168    
169     //---PRIVATE METHODS---
170    
171     /**
172     * Checks a piece of current data, and returns the
173     * threshold it breaches, if any.
174     *
175     * @param value the current value
176     * @param reg the Register for the host
177     * @return the threshold level breached, if any
178     */
179     private int checkAttributeThreshold(double value, Register reg) {
180     for(int thresholdLevel = Alert.thresholdLevels.length - 1; thresholdLevel >= 0; thresholdLevel--) {
181     if (reg.getThreshold(thresholdLevel) != -1.0) {
182     // normal check - has the value gone *over* the threshold
183     if(((double) reg.getThreshold(thresholdLevel)) < value) {
184     return thresholdLevel;
185     }
186     }
187     }
188     return Alert.thresholdNORMAL;
189     }
190    
191     //---ACCESSOR/MUTATOR METHODS---
192    
193     /**
194     * Returns a reference to a specific Queue for this
195     * monitor. This Queue returns only the data packets
196     * (based on type) that we want too look at.
197     *
198     * @return a reference to a Queue
199     */
200     protected Queue getQueue() {
201     return MonitorManager.getInstance().getDataQueue();
202     }
203    
204     //---ATTRIBUTES---
205    
206     /**
207     * This is the friendly identifier of the
208     * component this class is running in.
209     * eg, a Filter may be called "filter1",
210     * If this class does not have an owning
211     * component, a name from the configuration
212     * can be placed here. This name could also
213     * be changed to null for utility classes.
214     */
215     private String _name = "NetIO";
216    
217     /**
218     * A reference to the configuration proxy in use
219     */
220     private ConfigurationProxy _cp = ConfigurationProxy.getInstance();
221    
222     /**
223     * A HashMap of Registers (or groups of Registers), one
224     * for each host we're monitoring (reads).
225     */
226     private HashMap _hostsR = new HashMap();
227    
228     /**
229     * A HashMap of Registers (or groups of Registers), one
230     * for each host we're monitoring (writes).
231     */
232     private HashMap _hostsW = new HashMap();
233    
234     //---STATIC ATTRIBUTES---
235    
236     }