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/Memory__Monitor.java
(Generate patch)

Comparing projects/cms/source/server/uk/org/iscream/cms/server/client/monitors/Memory__Monitor.java (file contents):
Revision 1.5 by ajm, Sun Mar 18 00:54:04 2001 UTC vs.
Revision 1.19 by tdb, Sun Aug 1 10:40:45 2004 UTC

# Line 1 | Line 1
1 + /*
2 + * i-scream central monitoring system
3 + * http://www.i-scream.org
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.client.monitors;
22 > package uk.org.iscream.cms.server.client.monitors;
23  
24   //---IMPORTS---
25   import java.util.HashMap;
26   import java.text.NumberFormat;
27 < import uk.org.iscream.client.*;
28 < import uk.org.iscream.core.*;
29 < import uk.org.iscream.util.*;
30 < import uk.org.iscream.componentmanager.*;
27 > import uk.org.iscream.cms.server.client.*;
28 > import uk.org.iscream.cms.server.core.*;
29 > import uk.org.iscream.cms.util.*;
30 > import uk.org.iscream.cms.server.componentmanager.*;
31  
32   /**
33   * This Monitor watches the Memory for all machines
# Line 24 | Line 44 | public class Memory__Monitor extends MonitorSkeleton {
44       */
45      public final String REVISION = "$Revision$";
46      
47 +    /**
48 +     * A description of this monitor
49 +     */
50      public final String DESC = "Monitors Memory.";
51      
52   //---STATIC METHODS---
# Line 31 | Line 54 | public class Memory__Monitor extends MonitorSkeleton {
54   //---CONSTRUCTORS---
55  
56   //---PUBLIC METHODS---
57 <
57 >    
58 >    /**
59 >     * Analyse a packet of data, and generate an alert if
60 >     * necessary.
61 >     *
62 >     * @param packet the XMLPacket to analyse
63 >     */
64      public void analysePacket(XMLPacket packet) {
65 <        if (packet.getParam("packet.attributes.type").equals("data")) {
66 <            String source = packet.getParam("packet.attributes.machine_name");
67 <            if (!_hosts.containsKey(source)) {
68 <                _hosts.put(source, new Register(source, _name));
65 >        String source = packet.getParam("packet.attributes.machine_name");
66 >        if(!checkBooleanConfig("Host." + source, "Monitor." + _name + ".enable")) {
67 >            return;
68 >        }
69 >        if (!_hosts.containsKey(source)) {
70 >            _hosts.put(source, new Register(source, _name));
71 >        }
72 >
73 >        Register reg = (Register) _hosts.get(source);
74 >
75 >        // get the packet data
76 >        double memoryTotal, memoryFree, memoryCache;
77 >        try {
78 >            String total = packet.getParam("packet.memory.total");
79 >            String free = packet.getParam("packet.memory.free");
80 >            if(total==null || free==null) {
81 >                throw new NumberFormatException("Memory data invalid or not supplied");
82              }
83 <            
84 <            Register reg = (Register) _hosts.get(source);
85 <            
86 <            // find out the threshold level we're at
87 <            String attributeName = "Memory In Use %";
88 <            
89 <            // get the packet data
48 <            double memoryTotal, memoryFree;
49 <            try {
50 <                String total = packet.getParam("packet.memory.total");
51 <                String free = packet.getParam("packet.memory.free");
52 <                if(total==null || free==null) {
53 <                    throw new NumberFormatException("Memory data invalid");
54 <                }
55 <                memoryTotal = Double.parseDouble(total);
56 <                memoryFree = Double.parseDouble(free);
57 <            } catch (NumberFormatException e) {
58 <                _logger.write(this.toString(), Logger.WARNING, "Received packet from "+source+" with bad memory information: "+e);
59 <                // don't try to continue and process
60 <                return;
83 >            memoryTotal = Double.parseDouble(total);
84 >            memoryFree = Double.parseDouble(free);
85 >            // get hold of the cache data.. default to 0
86 >            memoryCache = 0.0;
87 >            String cache = packet.getParam("packet.memory.cache");
88 >            if(cache != null) {
89 >                memoryCache = Double.parseDouble(cache);
90              }
91 <            
92 <            boolean useValue = false;
93 <            try {
94 <               String option = _cp.getProperty("Host." + source, "Monitor." + _name + ".thresholdMeasure");
95 <               if (option.equals("VALUE")) {
96 <                   useValue = true;
97 <               }                            
98 <            } catch (PropertyNotFoundException e) {
99 <                // we default to percentage
91 >        } catch (NumberFormatException e) {
92 >            _logger.write(this.toString(), Logger.WARNING, "Received packet from "+source+" with bad memory information: "+e);
93 >            // don't try to continue and process
94 >            return;
95 >        }
96 >
97 >        boolean useValue = false;
98 >        try {
99 >           String option = _cp.getProperty("Host." + source, "Monitor." + _name + ".thresholdMeasure");
100 >           if (option.equals("VALUE")) {
101 >               useValue = true;
102 >           }
103 >        } catch (PropertyNotFoundException e) {
104 >            // we default to percentage
105 >        }
106 >        
107 >        boolean useCache = false;
108 >        try {
109 >           int useCacheAsFree = Integer.parseInt(_cp.getProperty("Host." + source, "Monitor." + _name + ".useCacheAsFree"));
110 >           useCache = (useCacheAsFree == 1);
111 >        } catch (PropertyNotFoundException e) {
112 >            // we default to false
113 >        } catch (NumberFormatException e) {
114 >            // we default to false
115 >        }
116 >        
117 >        // this bit determines if the memory check is a % check
118 >        // or a byte check
119 >        String type;
120 >        double curValue;
121 >        int newThreshold;
122 >        if(useValue) {
123 >            // bytes of memory available
124 >            if(useCache) {
125 >                // NOTE: we take cache as being "probably free" for this check
126 >                curValue = memoryFree + memoryCache;
127 >            } else {
128 >                curValue = memoryFree;
129              }
130 <            
131 <            // this  bit determines if the memory check is a % check
132 <            // or a kb check
133 <            double memoryInUse;
134 <            if(useValue) {
135 <                // kb memory in use
136 <                memoryInUse = memoryTotal - memoryFree;
130 >            // negate check
131 >            newThreshold = checkAttributeThreshold(curValue, reg, true);
132 >            type = "bytes";
133 >        } else {
134 >            // % memory in use
135 >            if(useCache) {
136 >                // NOTE: we take cache as being "probably free" for this check
137 >                curValue = (1 - (((double)memoryFree + (double)memoryCache) / (double)memoryTotal)) * 100;
138              } else {
139 <                // % memory in use
81 <                memoryInUse = (1-(memoryFree / memoryTotal)) * 100;
139 >                curValue = (1 - ((double)memoryFree / (double)memoryTotal)) * 100;
140              }
141 <                        
142 <            int newThreshold = checkAttributeThreshold(memoryInUse, reg);
143 <            
86 <            // format the memoryInUse to a String
87 <            NumberFormat nf = NumberFormat.getInstance();
88 <            nf.setMaximumFractionDigits(2);
89 <            nf.setMinimumFractionDigits(2);
90 <            String strMemoryInUse = nf.format(memoryInUse);
91 <            
92 <            processAlert(newThreshold, attributeName, reg, source, strMemoryInUse);
141 >            // normal check
142 >            newThreshold = checkAttributeThreshold(curValue, reg, false);
143 >            type = "%";
144          }
145 +
146 +        // format the value to a String
147 +        NumberFormat nf = NumberFormat.getInstance();
148 +        nf.setMaximumFractionDigits(2);
149 +        nf.setMinimumFractionDigits(2);
150 +        String strCurValue = nf.format(curValue);
151 +        
152 +        // set the attributeName nicely
153 +        String attributeName = type + " Memory in use " + type;
154 +        if(useCache) {
155 +            attributeName += " (ex. cache)";
156 +        }
157 +        
158 +        processAlert(newThreshold, attributeName, reg, source, strCurValue);
159      }
160  
161      /**
162       * Overrides the {@link java.lang.Object#toString() Object.toString()}
163       * method to provide clean logging (every class should have this).
164       *
165 <     * This uses the uk.org.iscream.util.NameFormat class
165 >     * This uses the uk.org.iscream.cms.util.NameFormat class
166       * to format the toString()
167       *
168       * @return the name of this class and its CVS revision
# Line 117 | Line 182 | public class Memory__Monitor extends MonitorSkeleton {
182      }
183  
184   //---PRIVATE METHODS---
185 <
186 <    private int checkAttributeThreshold(double memoryInUse, Register reg) {
185 >    
186 >    /**
187 >     * Checks a piece of current data, and returns the
188 >     * threshold it breaches, if any.
189 >     *
190 >     * The option to negate the check can be used in
191 >     * situations where being *below* the threshold
192 >     * is an 'alertable' situation. In this specific
193 >     * case, we'd do this with kb disk checks.
194 >     *
195 >     * @param value the current value
196 >     * @param reg the Register for the host
197 >     * @param negateCheck whether to negate the check
198 >     * @return the threshold level breached, if any
199 >     */
200 >    private int checkAttributeThreshold(double value, Register reg, boolean negateCheck) {
201          for(int thresholdLevel = Alert.thresholdLevels.length - 1; thresholdLevel >= 0; thresholdLevel--) {
202              if (reg.getThreshold(thresholdLevel) != -1.0) {
203 <                if(((double) reg.getThreshold(thresholdLevel)) < memoryInUse) {
204 <                    return thresholdLevel;
203 >                if(!negateCheck) {
204 >                    // normal check - has the value gone *over* the threshold
205 >                    if(((double) reg.getThreshold(thresholdLevel)) < value) {
206 >                        return thresholdLevel;
207 >                    }
208                  }
209 +                else {
210 +                    // negated check - has the value gone *under* the threshold
211 +                    if(((double) reg.getThreshold(thresholdLevel)) > value) {
212 +                        return thresholdLevel;
213 +                    }
214 +                }
215              }
216          }
217          return Alert.thresholdNORMAL;
218      }
219  
220   //---ACCESSOR/MUTATOR METHODS---
221 +    
222 +    /**
223 +     * Returns a reference to a specific Queue for this
224 +     * monitor. This Queue returns only the data packets
225 +     * (based on type) that we want too look at.
226 +     *
227 +     * @return a reference to a Queue
228 +     */
229 +    protected Queue getQueue() {
230 +        return MonitorManager.getInstance().getDataQueue();
231 +    }
232  
233   //---ATTRIBUTES---
234  
# Line 148 | Line 247 | public class Memory__Monitor extends MonitorSkeleton {
247       * A reference to the configuration proxy in use
248       */
249      private ConfigurationProxy _cp = ConfigurationProxy.getInstance();
250 <
250 >    
251 >    /**
252 >     * A HashMap of Registers (or groups of Registers), one
253 >     * for each host we're monitoring.
254 >     */
255      private HashMap _hosts = new HashMap();
256  
257   //---STATIC ATTRIBUTES---

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines