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/Disk__Monitor.java
Revision: 1.9
Committed: Tue May 29 17:02:34 2001 UTC (22 years, 11 months ago) by tdb
Branch: MAIN
Changes since 1.8: +9 -9 lines
Log Message:
Major change in the java package naming. This has been held off for some time
now, but it really needed doing. The future packaging of all i-scream products
will be;

uk.org.iscream.<product>.<subpart>.*

In the case of the central monitoring system server this will be;

uk.org.iscream.cms.server.*

The whole server has been changed to follow this structure, and tested to a
smallish extent. Further changes in other parts of the CMS will follow.

File Contents

# User Rev Content
1 ajm 1.1 //---PACKAGE DECLARATION---
2 tdb 1.9 package uk.org.iscream.cms.server.client.monitors;
3 ajm 1.1
4     //---IMPORTS---
5     import java.util.HashMap;
6     import java.util.ArrayList;
7     import java.util.Set;
8     import java.util.Iterator;
9     import java.text.NumberFormat;
10 tdb 1.9 import uk.org.iscream.cms.server.client.*;
11     import uk.org.iscream.cms.server.core.*;
12     import uk.org.iscream.cms.server.util.*;
13     import uk.org.iscream.cms.server.componentmanager.*;
14 ajm 1.1
15     /**
16     * This Monitor watches the Disks for all machines
17     *
18 tdb 1.9 * @author $Author: tdb1 $
19     * @version $Id: Disk__Monitor.java,v 1.8 2001/03/23 02:32:49 tdb1 Exp $
20 ajm 1.1 */
21     public class Disk__Monitor extends MonitorSkeleton {
22    
23     //---FINAL ATTRIBUTES---
24    
25     /**
26     * The current CVS revision of this class
27     */
28 tdb 1.9 public final String REVISION = "$Revision: 1.8 $";
29 ajm 1.1
30 tdb 1.8 /**
31     * A description of this monitor
32     */
33 ajm 1.1 public final String DESC = "Monitors all host disks.";
34    
35     //---STATIC METHODS---
36    
37     //---CONSTRUCTORS---
38    
39     //---PUBLIC METHODS---
40 tdb 1.8
41     /**
42     * Analyse a packet of data, and generate an alert if
43     * necessary.
44     *
45     * @param packet the XMLPacket to analyse
46     */
47 ajm 1.1 public void analysePacket(XMLPacket packet) {
48 ajm 1.7 String source = packet.getParam("packet.attributes.machine_name");
49     if (!_hosts.containsKey(source)) {
50     _hosts.put(source, new HashMap());
51     }
52    
53     HashMap diskRegisters = (HashMap) _hosts.get(source);
54 tdb 1.8
55     // key prefix
56     String keyPrefix = "packet.disk.p";
57    
58 ajm 1.7 // a tempory holder for all the disk attributes we find
59     ArrayList disks = new ArrayList();
60    
61     // unfortunatly we need to check the whole packet
62     // to find the disks, and then get the data attributes
63     Set packetSet = packet.getSet();
64     Iterator i = packetSet.iterator();
65     while (i.hasNext()) {
66     String dataKey = (String) i.next();
67 tdb 1.8 if(dataKey.startsWith(keyPrefix)) {
68 ajm 1.7 if(!disks.contains(dataKey)) {
69     String diskNumber = "";
70    
71     // pos is after "packet.disk.p"
72 tdb 1.8 int pos = keyPrefix.length();
73 ajm 1.7 while (dataKey.charAt(pos) != '.') {
74     diskNumber = diskNumber + dataKey.charAt(pos);
75     pos++;
76     }
77    
78     // add the disk to our list, with the packet data
79    
80     // used (we won't use this value - but we need it to forget about it ;)
81 tdb 1.8 disks.add(keyPrefix + diskNumber + ".attributes.used");
82 ajm 1.7
83     // device
84 tdb 1.8 disks.add(keyPrefix + diskNumber + ".attributes.name");
85     String device = packet.getParam(keyPrefix + diskNumber + ".attributes.name");
86 ajm 1.7 // mount point
87 tdb 1.8 disks.add(keyPrefix + diskNumber + ".attributes.mount");
88     String mount = packet.getParam(keyPrefix + diskNumber + ".attributes.mount");
89 ajm 1.7
90     // these next two will be used to calculate the %age
91     // total
92 tdb 1.8 disks.add(keyPrefix + diskNumber + ".attributes.kbytes");
93     String total = packet.getParam(keyPrefix + diskNumber + ".attributes.kbytes");
94 ajm 1.7 // available
95 tdb 1.8 disks.add(keyPrefix + diskNumber + ".attributes.avail");
96     String avail = packet.getParam(keyPrefix + diskNumber + ".attributes.avail");
97 ajm 1.7
98     // *** now process this disk ***
99    
100     // check if we've seen this disk before on a previous run
101     // if not, we need to create a register for it
102     if(!diskRegisters.containsKey(diskNumber)) {
103     diskRegisters.put(diskNumber, new Register(source, _name, mount));
104     }
105    
106     // get the register for this disk
107     Register reg = (Register) diskRegisters.get(diskNumber);
108    
109     // get the packet data
110     double diskTotal, diskAvail;
111     try {
112    
113     if(total==null || avail==null) {
114     throw new NumberFormatException("Disk data invalid");
115 ajm 1.2 }
116 ajm 1.7 diskTotal = Double.parseDouble(total);
117     diskAvail = Double.parseDouble(avail);
118     } catch (NumberFormatException e) {
119     _logger.write(this.toString(), Logger.WARNING, "Received packet from "+source+" with bad disk information: "+e);
120     // don't try to continue and process, try next disk
121     break;
122     }
123 ajm 1.2
124 ajm 1.7 boolean useValue = false;
125     try {
126     String option = _cp.getProperty("Host." + source, "Monitor." + _name + ".thresholdMeasure");
127     if (option.equals("VALUE")) {
128     useValue = true;
129     }
130     } catch (PropertyNotFoundException e) {
131     // we default to percentage
132     }
133 ajm 1.2
134 ajm 1.7 // this bit determines if the disk check is a % check
135     // or a kb check
136     double diskInUse;
137     String type;
138     if(useValue) {
139     // kb disk in use
140     diskInUse = diskTotal - diskAvail;
141     type = "kb";
142     } else {
143     // % disk in use
144     diskInUse = (1 - (diskAvail / diskTotal)) * 100;
145     type = "%";
146 ajm 1.1 }
147 ajm 1.7
148    
149    
150     int newThreshold = checkAttributeThreshold(diskInUse, reg);
151    
152     // format the diskInUse to a String
153     NumberFormat nf = NumberFormat.getInstance();
154     nf.setMaximumFractionDigits(2);
155     nf.setMinimumFractionDigits(2);
156     String strDiskInUse = nf.format(diskInUse);
157    
158     // say which disk had the problem
159     String attributeName = "Disk in use " + type + " on " + mount + " (" + device + ")";
160    
161     processAlert(newThreshold, attributeName, reg, source, strDiskInUse);
162 ajm 1.1 }
163     }
164     }
165     }
166    
167     /**
168     * Overrides the {@link java.lang.Object#toString() Object.toString()}
169     * method to provide clean logging (every class should have this).
170     *
171 tdb 1.9 * This uses the uk.org.iscream.cms.server.util.NameFormat class
172 ajm 1.1 * to format the toString()
173     *
174     * @return the name of this class and its CVS revision
175     */
176     public String toString() {
177     return FormatName.getName(
178     _name,
179     getClass().getName(),
180     REVISION);
181     }
182    
183     /**
184     * return the String representation of what the monitor does
185     */
186     public String getDescription(){
187     return DESC;
188     }
189    
190     //---PRIVATE METHODS---
191 tdb 1.8
192     /**
193     * Checks a piece of current data, and returns the
194     * threshold it breaches, if any.
195     *
196     * @param diskInUse the amount of space in use
197     * @param reg the Register for the host
198     * @return the threshold level breached, if any
199     */
200 ajm 1.1 private int checkAttributeThreshold(double diskInUse, Register reg) {
201     for(int thresholdLevel = Alert.thresholdLevels.length - 1; thresholdLevel >= 0; thresholdLevel--) {
202     if (reg.getThreshold(thresholdLevel) != -1.0) {
203     if(((double) reg.getThreshold(thresholdLevel)) < diskInUse) {
204     return thresholdLevel;
205     }
206     }
207     }
208     return Alert.thresholdNORMAL;
209     }
210    
211     //---ACCESSOR/MUTATOR METHODS---
212 ajm 1.7
213 tdb 1.8 /**
214     * Returns a reference to a specific Queue for this
215     * monitor. This Queue returns only the data packets
216     * (based on type) that we want too look at.
217     *
218     * @return a reference to a Queue
219     */
220 ajm 1.7 protected Queue getQueue() {
221     return MonitorManager.getInstance().getDataQueue();
222     }
223    
224 ajm 1.1 //---ATTRIBUTES---
225    
226     /**
227     * This is the friendly identifier of the
228     * component this class is running in.
229     * eg, a Filter may be called "filter1",
230     * If this class does not have an owning
231     * component, a name from the configuration
232     * can be placed here. This name could also
233     * be changed to null for utility classes.
234     */
235     private String _name = "Disk";
236    
237     /**
238     * A reference to the configuration proxy in use
239     */
240     private ConfigurationProxy _cp = ConfigurationProxy.getInstance();
241 tdb 1.8
242     /**
243     * A HashMap of Registers (or groups of Registers), one
244     * for each host we're monitoring.
245     */
246 ajm 1.1 private HashMap _hosts = new HashMap();
247    
248     //---STATIC ATTRIBUTES---
249    
250     }