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/Register.java
Revision: 1.14
Committed: Wed Mar 21 23:54:31 2001 UTC (23 years, 2 months ago) by ajm
Branch: MAIN
Changes since 1.13: +51 -4 lines
Log Message:
Now has support for using a specific attribute threshold

File Contents

# User Rev Content
1 ajm 1.1 //---PACKAGE DECLARATION---
2 tdb 1.12 package uk.org.iscream.client;
3 ajm 1.1
4     //---IMPORTS---
5 tdb 1.12 import uk.org.iscream.util.*;
6     import uk.org.iscream.componentmanager.*;
7 ajm 1.1
8     /**
9 ajm 1.2 * The Register class holds theshold values,
10     * the last level of alert for each attribute for a monitor
11 ajm 1.11 * and the time of last alert sent for each alert level.
12 ajm 1.1 *
13 ajm 1.2 * This class is used by monitor classes so they can determine
14     * how often they should send alerts when breaching alert levels.
15     * It also stores (and keeps uptodate (via the configuration proxy)
16     * the threshold values for the monitor.
17     *
18 tdb 1.13 * @author $Author: tdb1 $
19 ajm 1.14 * @version $Id: Register.java,v 1.13 2001/03/15 03:25:41 tdb1 Exp $
20 ajm 1.1 */
21     public class Register {
22    
23     //---FINAL ATTRIBUTES---
24    
25     /**
26     * The current CVS revision of this class
27     */
28 ajm 1.14 public static final String REVISION = "$Revision: 1.13 $";
29 ajm 1.1
30     //---STATIC METHODS---
31    
32     //---CONSTRUCTORS---
33    
34     /**
35 ajm 1.2 * Construct a Register with the hostname and monitorName
36 ajm 1.11 * (for obtaining the threshold values).
37 ajm 1.14 * This constructs a generic register for a specific monitor.
38 ajm 1.1 *
39 ajm 1.2 * @param hostname the hostname this register is for
40     * @param monitorName the monitor this register is for
41 ajm 1.14 */
42     public Register(String hostname, String monitorName) {
43     this(hostname, monitorName, null);
44     }
45 ajm 1.11
46 ajm 1.14 /**
47     * Construct a Register with the hostname and monitorName
48     * (for obtaining the threshold values).
49     * This constructs a register for a specific attribute check
50     * by a monitor.
51     *
52     * @param hostname the hostname this register is for
53     * @param monitorName the monitor this register is for
54     * @param attributeName the specific attribute this register is for
55 ajm 1.1 */
56 ajm 1.14 public Register(String hostname, String monitorName, String attributeName) {
57 ajm 1.2 _hostname = hostname;
58     _monitorName = monitorName;
59 ajm 1.14 _attributeName = attributeName;
60 ajm 1.11 _lastAlertLevel = 0;
61     _lastThresholdLevel = 0;
62     _initialAlertTime= 0;
63     _lastAlertTimeout = 0;
64     _times = new long[Alert.alertLevels.length];
65 ajm 1.2 // initialise the arrays to 0
66 ajm 1.11 for(int x = 0; x < Alert.alertLevels.length; x++) {
67     _times[x] = 0;
68 ajm 1.1 }
69     }
70 ajm 1.14
71 ajm 1.1
72     //---PUBLIC METHODS---
73    
74     //---PRIVATE METHODS---
75    
76 ajm 1.14 /**
77     * Obtains a threshold value from the configuration for a given level.
78     * The attribute name specifies which property to get.
79     * eg, attributeName = idle it will look for
80     * Monitor.<monitor name>.idle.threshold.<alert level>
81     * eg, attributeName = null
82     * Monitor.<monitor name>.threshold.<alert level>
83     *
84     * Note that if its null, this will get the threshold for the monitor
85     * as a whole, not the specific attribute.
86     *
87     * @param level the alert level to get the attribute for
88     * @param attributeName the attribute to get the threshold for
89     *
90     * @return the threshold obtained
91     */
92     private String getThresholdConfig(int level, String attributeName) throws PropertyNotFoundException {
93     String temp = "";
94     if (attributeName != null) {
95     temp = "." + attributeName;
96     }
97     return _cp.getProperty("Host." + _hostname, "Monitor." + _monitorName + temp + ".threshold." + Alert.thresholdLevels[level]);
98     }
99    
100 ajm 1.1 //---ACCESSOR/MUTATOR METHODS---
101    
102 ajm 1.2 /**
103 ajm 1.11 * Gets the last alert level
104 ajm 1.2 *
105     * @return the last alert level
106     */
107 ajm 1.11 public int getLastAlertLevel() {
108     return _lastAlertLevel;
109 ajm 1.2 }
110    
111     /**
112 ajm 1.11 * Sets the last threshold level
113 ajm 1.2 *
114     * @param level the new last threshold level
115     */
116 ajm 1.11 public void setLastThresholdLevel(int level) {
117     _lastThresholdLevel = level;
118 ajm 1.2 }
119    
120 ajm 1.11 /**
121     * Gets the last threshold level
122 ajm 1.2 *
123     * @return the last threshold level
124     */
125 ajm 1.11 public int getLastThresholdLevel() {
126     return _lastThresholdLevel;
127 ajm 1.2 }
128    
129     /**
130 ajm 1.11 * Sets the last alert level
131 ajm 1.2 *
132 ajm 1.5 * Note that if this is setting to an OK
133     * level alert, it resets _maxLevelCount.
134     *
135 ajm 1.6 * This also sets the "initialAlertTime"
136     * if the next alert after OK is set.
137     * And resets it to 0 if it IS an OK.
138     *
139 ajm 1.2 * @param level the new last alert level
140     */
141 ajm 1.11 public void setLastAlertLevel(int level) {
142     _lastAlertLevel = level;
143 ajm 1.5 if (level == Alert.alertOK) {
144     _maxLevelCount = 0;
145 tdb 1.13 // we won't do this, so OK's still have the initialAlertTime
146     // of the original alert they're OK'ing
147     //_initialAlertTime = 0;
148 ajm 1.6 }
149     if (level == Alert.alertOK + 1) {
150 ajm 1.11 _initialAlertTime = System.currentTimeMillis();
151 ajm 1.5 }
152 ajm 1.2 }
153    
154     /**
155 ajm 1.11 * Gets the time an alert was sent at the given level.
156 ajm 1.2 *
157     * @param level the alert level to get
158     *
159     * @return the time last sent
160     */
161 ajm 1.11 public long getTimeLastSent() {
162     return _times[getLastAlertLevel()];
163 ajm 1.2 }
164    
165     /**
166 ajm 1.11 * Gets the time an alert was sent at the given level.
167 ajm 1.2 *
168     * @param level the alert level to get
169     * @param value the new time
170     */
171 ajm 1.11 public void setTimeLastSent(long value) {
172     _times[getLastAlertLevel()] = value;
173 ajm 1.2 }
174    
175     /**
176     * Gets the threshold value for the given
177     * level of alert.
178     *
179     * If there is no alert threshold for a
180     * given level, this returns -1.0
181     *
182     * @param level the alert level
183     */
184     public double getThreshold(int level) {
185 tdb 1.4 // -1.0 means we don't use an alert level
186 ajm 1.2 double threshold = -1.0;
187 tdb 1.4 try {
188 ajm 1.14 String thresholdString = getThresholdConfig(level, _attributeName);
189 tdb 1.4 threshold = Double.parseDouble(thresholdString);
190     } catch (PropertyNotFoundException e) {
191     threshold = -1.0;
192     } catch (NumberFormatException e) {
193     threshold = -1.0;
194 ajm 1.2 }
195     return threshold;
196     }
197    
198     /**
199     * Gets the alert timeout value for the given
200     * level of alert. This value is in millis,
201     * and is converted from the value in the config,
202     * which should be seconds.
203     *
204     * Note that this is dependant on the threshold value
205     * given, the timeout is obatined from the config, then
206     * divided by the threshold value, this allows alerts to
207     * progress faster should a higher threshold value be passed
208     *
209     * If there is no alert timeout for a
210 tdb 1.4 * given level, this returns 0
211 ajm 1.2 *
212     * @param level the alert level
213     * @param thresholdLevel the threshold leve we are on
214     */
215 ajm 1.11 public long getAlertTimeout(int level) {
216 tdb 1.4 // 0 means we don't use this value
217 ajm 1.2 long timeout = 0;
218 tdb 1.4 try {
219     String timeoutString = _cp.getProperty("Host." + _hostname, "Monitor." + _monitorName + ".alertTimeout." + Alert.alertLevels[level]);
220 ajm 1.11 int threshold = getLastThresholdLevel();
221 tdb 1.4 if (threshold > 0) {
222     timeout = (Long.parseLong(timeoutString) / threshold) * 1000;
223 ajm 1.2 }
224 tdb 1.4 } catch (PropertyNotFoundException e) {
225     timeout = 0;
226     } catch (NumberFormatException e) {
227     timeout = 0;
228 ajm 1.2 }
229     return timeout;
230 ajm 1.1 }
231    
232 ajm 1.2 /**
233     * Either advances to the next alert level, or if
234     * the maximum alert level has been reached, simply returns
235     * that.
236     *
237 ajm 1.5 * Note this method will NEVER reach the last alert level
238     * in the list, this is assumed to be FINAL, and special
239     * logic is in place to handle that.
240     *
241 ajm 1.2 */
242 ajm 1.11 public int getNextAlertLevel() {
243     if((getLastAlertLevel() + 1) > (Alert.alertLevels.length - 2)) {
244     return getLastAlertLevel();
245 ajm 1.2 }
246 ajm 1.11 return getLastAlertLevel() + 1;
247 ajm 1.2 }
248    
249     /**
250 ajm 1.3 * Gets the timeout value of the last alert
251     * sent
252     *
253     * @return the last timeout value
254     */
255 ajm 1.11 public long getLastAlertTimeout() {
256     return _lastAlertTimeout;
257 ajm 1.3 }
258    
259     /**
260     * Sets the timeout value of the last alert
261     * sent
262     *
263     * @param timeout the new value
264     */
265 ajm 1.11 public void setLastAlertTimeout(long timeout) {
266     _lastAlertTimeout = timeout;
267 ajm 1.3 }
268    
269     /**
270 ajm 1.6 * Returns the time that the first alert was sent
271     * for an attribute that has passed a threshold value
272     *
273     */
274 ajm 1.11 public long getInitialAlertTime() {
275     return _initialAlertTime;
276 ajm 1.6 }
277    
278     /**
279 ajm 1.2 * Advances the alert level to the next one up.
280     *
281 ajm 1.5 * This keeps track of the number of the number
282     * of times the highest NON-FINAL alert level
283     * has been reached. Note this isn't a specific
284     * level, just the highest, so you could configure
285     * more levels and not affect this.
286     *
287     * If the count exceeds the number of times
288     * set in the configuration, it escalates to
289     * a FINAL alert if we're using FINAL's.
290     *
291     * It determines if to use FINAL's from the config
292     * entry reachFINALcount, when the count exceeds
293     * this value, it escalates to a FINAL. If that attribute
294     * is mis-read or is not configured. It will NEVER reach
295     * a FINAL.
296     *
297 ajm 1.2 */
298 ajm 1.11 public void escalateAlert() {
299 tdb 1.7 // don't escalate if we're already on the last alert
300 ajm 1.11 if(getLastAlertLevel() != Alert.alertLevels.length -1) {
301     setLastAlertLevel(getNextAlertLevel());
302 tdb 1.7 }
303 ajm 1.5 try {
304     // note if we fail to get this value, we won't process the res of this
305     int reachFINALcount = Integer.parseInt(_cp.getProperty("Host." + _hostname, "Monitor." + _monitorName + ".reachFINALcount"));
306 ajm 1.11 if (getLastAlertLevel() == Alert.alertLevels.length - 2) {
307 ajm 1.5 _maxLevelCount++;
308 tdb 1.10 if(_maxLevelCount > reachFINALcount) {
309 ajm 1.11 setLastAlertLevel(Alert.alertFINAL);
310 tdb 1.8 }
311 ajm 1.5 }
312     } catch (PropertyNotFoundException e) {
313     // we NEVER reach FINAL in this case
314     } catch (NumberFormatException e) {
315     // we NEVER reach FINAL in this case
316     }
317 ajm 1.1 }
318    
319     //---ATTRIBUTES---
320    
321 ajm 1.2 /**
322     * The host this register is for
323     */
324     private String _hostname;
325    
326     /**
327     * The monitor this register is for
328     */
329     private String _monitorName;
330 ajm 1.14
331     /**
332     * The attribute name, as obtained from
333     * the configuration.
334     * eg, idle or /var
335     */
336     private String _attributeName;
337 ajm 1.2
338     /**
339     * An array of last alert levels for
340     * each attribute this register is looking
341     * after.
342     */
343 ajm 1.11 private int _lastAlertLevel;
344 ajm 1.2
345     /**
346     * An array of last threshold levels for
347     * each attribute this register is looking
348     * after.
349     */
350 ajm 1.11 private int _lastThresholdLevel;
351 ajm 1.3
352     /**
353     * An array of last alert timeout levels for
354     * each attribute this register is looking
355     * after.
356     */
357 ajm 1.11 private long _lastAlertTimeout;
358 ajm 1.2
359     /**
360     * An array of arrays containing
361     * time an alert of each level
362     * was last sent for each attribute.
363     */
364 ajm 1.11 private long[] _times;
365 ajm 1.6
366     /**
367     * Initial times that an alert was first
368     * raised.
369     */
370 ajm 1.11 private long _initialAlertTime;
371 ajm 1.2
372     /**
373     * A reference to the configuration proxy in use
374     */
375     private ConfigurationProxy _cp = ConfigurationProxy.getInstance();
376 ajm 1.5
377     /**
378     * The number of times the maximum level alert
379     * has occured IN A ROW, this is escalated by
380     * the escalate(int) method, and reset by the
381     * setLastAlertLevel(int, int) method
382     */
383     private int _maxLevelCount = 0;
384 ajm 1.1
385     //---STATIC ATTRIBUTES---
386    
387     }