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.7
Committed: Thu Mar 22 17:57:05 2001 UTC (23 years, 1 month ago) by ajm
Branch: MAIN
Changes since 1.6: +114 -112 lines
Log Message:
Modified to use the new style queuing in the local client

File Contents

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