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.2
Committed: Fri Mar 9 03:30:55 2001 UTC (23 years, 3 months ago) by ajm
Branch: MAIN
Changes since 1.1: +15 -6 lines
Log Message:
TOTALLY re-wrote the Register class and made appropriate changes thoughout.  It
is now much more obvious what is going on in many places.

The problem was probably caused by doing CPU as a first monitor and hard coding
the number of attributes a Register stores.  Now if a monitor wants to store
multiple attributes, it has to do that itself.  This makes alot of things
much more readable and inteligable as a result.

File Contents

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