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
(Generate patch)

Comparing projects/cms/source/server/uk/org/iscream/cms/server/client/monitors/Disk__Monitor.java (file contents):
Revision 1.7 by ajm, Thu Mar 22 17:57:05 2001 UTC vs.
Revision 1.13 by tdb, Thu Nov 15 11:47:30 2001 UTC

# Line 1 | Line 1
1   //---PACKAGE DECLARATION---
2 < package uk.org.iscream.client.monitors;
2 > package uk.org.iscream.cms.server.client.monitors;
3  
4   //---IMPORTS---
5   import java.util.HashMap;
# Line 7 | Line 7 | import java.util.ArrayList;
7   import java.util.Set;
8   import java.util.Iterator;
9   import java.text.NumberFormat;
10 < import uk.org.iscream.client.*;
11 < import uk.org.iscream.core.*;
12 < import uk.org.iscream.util.*;
13 < import uk.org.iscream.componentmanager.*;
10 > 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  
15   /**
16   * This Monitor watches the Disks for all machines
# Line 27 | Line 27 | public class Disk__Monitor extends MonitorSkeleton {
27       */
28      public final String REVISION = "$Revision$";
29      
30 +    /**
31 +     * A description of this monitor
32 +     */
33      public final String DESC = "Monitors all host disks.";
34      
35   //---STATIC METHODS---
# Line 34 | Line 37 | public class Disk__Monitor extends MonitorSkeleton {
37   //---CONSTRUCTORS---
38  
39   //---PUBLIC METHODS---
40 <
40 >    
41 >    /**
42 >     * Analyse a packet of data, and generate an alert if
43 >     * necessary.
44 >     *
45 >     * @param packet the XMLPacket to analyse
46 >     */
47      public void analysePacket(XMLPacket packet) {
48          String source = packet.getParam("packet.attributes.machine_name");
49          if (!_hosts.containsKey(source)) {
# Line 42 | Line 51 | public class Disk__Monitor extends MonitorSkeleton {
51          }
52  
53          HashMap diskRegisters = (HashMap) _hosts.get(source);
54 <
55 <        // a tempory holder for all the disk attributes we find
54 >        
55 >        // key prefix
56 >        String keyPrefix = "packet.disk.p";
57 >        
58 >        // a temporary holder for all the disk attributes we find
59          ArrayList disks = new ArrayList();
60  
61          // unfortunatly we need to check the whole packet
# Line 52 | Line 64 | public class Disk__Monitor extends MonitorSkeleton {
64          Iterator i = packetSet.iterator();
65          while (i.hasNext()) {
66              String dataKey = (String) i.next();
67 <            if(dataKey.startsWith("packet.disk.p")) {
67 >            if(dataKey.startsWith(keyPrefix)) {
68                  if(!disks.contains(dataKey)) {
69                      String diskNumber = "";
70  
71                      // pos is after "packet.disk.p"
72 <                    int pos = 13;
72 >                    int pos = keyPrefix.length();
73                      while (dataKey.charAt(pos) != '.') {
74                          diskNumber = diskNumber + dataKey.charAt(pos);
75                          pos++;
# Line 66 | Line 78 | public class Disk__Monitor extends MonitorSkeleton {
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 <                    disks.add("packet.disk.p" + diskNumber + ".attributes.used");
81 >                    disks.add(keyPrefix + diskNumber + ".attributes.used");
82  
83                      // device
84 <                    disks.add("packet.disk.p" + diskNumber + ".attributes.name");
85 <                    String device = packet.getParam("packet.disk.p" + diskNumber + ".attributes.name");
84 >                    disks.add(keyPrefix + diskNumber + ".attributes.name");
85 >                    String device = packet.getParam(keyPrefix + diskNumber + ".attributes.name");
86                      // mount point
87 <                    disks.add("packet.disk.p" + diskNumber + ".attributes.mount");
88 <                    String mount = packet.getParam("packet.disk.p" + diskNumber + ".attributes.mount");
87 >                    disks.add(keyPrefix + diskNumber + ".attributes.mount");
88 >                    String mount = packet.getParam(keyPrefix + diskNumber + ".attributes.mount");
89  
90                      // these next two will be used to calculate the %age
91                      // total
92 <                    disks.add("packet.disk.p" + diskNumber + ".attributes.kbytes");
93 <                    String total = packet.getParam("packet.disk.p" + diskNumber + ".attributes.kbytes");
92 >                    disks.add(keyPrefix + diskNumber + ".attributes.kbytes");
93 >                    String total = packet.getParam(keyPrefix + diskNumber + ".attributes.kbytes");
94                      // available
95 <                    disks.add("packet.disk.p" + diskNumber + ".attributes.avail");
96 <                    String avail = packet.getParam("packet.disk.p" + diskNumber + ".attributes.avail");
95 >                    disks.add(keyPrefix + diskNumber + ".attributes.avail");
96 >                    String avail = packet.getParam(keyPrefix + diskNumber + ".attributes.avail");
97  
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));
102 >                    //   nb. use the device as the key as this is unlikely to change,
103 >                    //       unlike diskNumber which could easily change
104 >                    //         (diskNumber is based on the order of df's output!)
105 >                    if(!diskRegisters.containsKey(device)) {
106 >                        diskRegisters.put(device, new Register(source, _name, mount));
107                      }
108  
109                      // get the register for this disk
110 <                    Register reg = (Register) diskRegisters.get(diskNumber);
110 >                    Register reg = (Register) diskRegisters.get(device);
111  
112                      // get the packet data
113                      double diskTotal, diskAvail;
# Line 111 | Line 126 | public class Disk__Monitor extends MonitorSkeleton {
126  
127                      boolean useValue = false;
128                      try {
129 <                        String option = _cp.getProperty("Host." + source, "Monitor." + _name + ".thresholdMeasure");
129 >                        // try looking for a mount-point specific thresholdMeasure first
130 >                        String option = _cp.getProperty("Host." + source, "Monitor." + _name + "." + mount + ".thresholdMeasure");
131                          if (option.equals("VALUE")) {
132                              useValue = true;
133 <                        }                            
133 >                        }
134                      } catch (PropertyNotFoundException e) {
135 <                        // we default to percentage
135 >                        try {
136 >                            // now look for a more general thresholdMeasure
137 >                            String option = _cp.getProperty("Host." + source, "Monitor." + _name + ".thresholdMeasure");
138 >                            if (option.equals("VALUE")) {
139 >                                useValue = true;
140 >                            }
141 >                        } catch (PropertyNotFoundException f) {
142 >                            // we default to percentage in any case
143 >                        }
144                      }
145  
146                      // this  bit determines if the disk check is a % check
147                      // or a kb check
124                    double diskInUse;
148                      String type;
149 +                    double curValue;
150 +                    int newThreshold;
151                      if(useValue) {
152 <                        // kb disk in use
153 <                        diskInUse = diskTotal - diskAvail;
152 >                        // kb disk available
153 >                        curValue = diskAvail;
154 >                        // negate check
155 >                        newThreshold = checkAttributeThreshold(curValue, reg, true);
156                          type = "kb";
157                      } else {
158                          // % disk in use
159 <                        diskInUse = (1 - (diskAvail / diskTotal)) * 100;
159 >                        curValue = (1 - (diskAvail / diskTotal)) * 100;
160 >                        // normal check
161 >                        newThreshold = checkAttributeThreshold(curValue, reg, false);
162                          type = "%";
163                      }
164  
136
137
138                    int newThreshold = checkAttributeThreshold(diskInUse, reg);
139
165                      // format the diskInUse to a String
166                      NumberFormat nf = NumberFormat.getInstance();
167                      nf.setMaximumFractionDigits(2);
168                      nf.setMinimumFractionDigits(2);
169 <                    String strDiskInUse = nf.format(diskInUse);
169 >                    String strCurValue = nf.format(curValue);
170  
171                      // say which disk had the problem
172                      String attributeName = "Disk in use " + type + " on " + mount + " (" + device + ")";
173  
174 <                    processAlert(newThreshold, attributeName, reg, source, strDiskInUse);
174 >                    processAlert(newThreshold, attributeName, reg, source, strCurValue);
175                  }
176              }
177          }
# Line 156 | Line 181 | public class Disk__Monitor extends MonitorSkeleton {
181       * Overrides the {@link java.lang.Object#toString() Object.toString()}
182       * method to provide clean logging (every class should have this).
183       *
184 <     * This uses the uk.org.iscream.util.NameFormat class
184 >     * This uses the uk.org.iscream.cms.server.util.NameFormat class
185       * to format the toString()
186       *
187       * @return the name of this class and its CVS revision
# Line 176 | Line 201 | public class Disk__Monitor extends MonitorSkeleton {
201      }
202  
203   //---PRIVATE METHODS---
204 <
205 <    private int checkAttributeThreshold(double diskInUse, Register reg) {
204 >    
205 >    /**
206 >     * Checks a piece of current data, and returns the
207 >     * threshold it breaches, if any.
208 >     *
209 >     * The option to negate the check can be used in
210 >     * situations where being *below* the threshold
211 >     * is an 'alertable' situation. In this specific
212 >     * case, we'd do this with kb disk checks.
213 >     *
214 >     * @param value the current value
215 >     * @param reg the Register for the host
216 >     * @param negateCheck whether to negate the check
217 >     * @return the threshold level breached, if any
218 >     */
219 >    private int checkAttributeThreshold(double diskInUse, Register reg, boolean negateCheck) {
220          for(int thresholdLevel = Alert.thresholdLevels.length - 1; thresholdLevel >= 0; thresholdLevel--) {
221              if (reg.getThreshold(thresholdLevel) != -1.0) {
222 <                if(((double) reg.getThreshold(thresholdLevel)) < diskInUse) {
223 <                    return thresholdLevel;
222 >                if(!negateCheck) {
223 >                    // normal check - has the value gone *over* the threshold
224 >                    if(((double) reg.getThreshold(thresholdLevel)) < diskInUse) {
225 >                        return thresholdLevel;
226 >                    }
227                  }
228 +                else {
229 +                    // negated check - has the value gone *under* the threshold
230 +                    if(((double) reg.getThreshold(thresholdLevel)) > diskInUse) {
231 +                        return thresholdLevel;
232 +                    }
233 +                }
234              }
235          }
236          return Alert.thresholdNORMAL;
# Line 190 | Line 238 | public class Disk__Monitor extends MonitorSkeleton {
238  
239   //---ACCESSOR/MUTATOR METHODS---
240      
241 +    /**
242 +     * Returns a reference to a specific Queue for this
243 +     * monitor. This Queue returns only the data packets
244 +     * (based on type) that we want too look at.
245 +     *
246 +     * @return a reference to a Queue
247 +     */
248      protected Queue getQueue() {
249          return MonitorManager.getInstance().getDataQueue();
250      }
# Line 211 | Line 266 | public class Disk__Monitor extends MonitorSkeleton {
266       * A reference to the configuration proxy in use
267       */
268      private ConfigurationProxy _cp = ConfigurationProxy.getInstance();
269 <
269 >    
270 >    /**
271 >     * A HashMap of Registers (or groups of Registers), one
272 >     * for each host we're monitoring.
273 >     */
274      private HashMap _hosts = new HashMap();
275  
276   //---STATIC ATTRIBUTES---

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines