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.17
Committed: Tue May 29 17:02:34 2001 UTC (23 years ago) by tdb
Branch: MAIN
Branch point for: SERVER_PIRCBOT
Changes since 1.16: +5 -5 lines
Log Message:
Major change in the java package naming. This has been held off for some time
now, but it really needed doing. The future packaging of all i-scream products
will be;

uk.org.iscream.<product>.<subpart>.*

In the case of the central monitoring system server this will be;

uk.org.iscream.cms.server.*

The whole server has been changed to follow this structure, and tested to a
smallish extent. Further changes in other parts of the CMS will follow.

File Contents

# User Rev Content
1 ajm 1.1 //---PACKAGE DECLARATION---
2 tdb 1.17 package uk.org.iscream.cms.server.client;
3 ajm 1.1
4     //---IMPORTS---
5 tdb 1.17 import uk.org.iscream.cms.server.util.*;
6     import uk.org.iscream.cms.server.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 ajm 1.15 * @author $Author: ajm4 $
19 tdb 1.17 * @version $Id: Register.java,v 1.16 2001/03/22 02:08:58 ajm4 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 tdb 1.17 public static final String REVISION = "$Revision: 1.16 $";
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.15 String thresholdString = "";
189     try {
190     thresholdString = getThresholdConfig(level, _attributeName);
191     } catch (PropertyNotFoundException e) {
192     thresholdString = getThresholdConfig(level, null);
193     }
194 tdb 1.4 threshold = Double.parseDouble(thresholdString);
195     } catch (PropertyNotFoundException e) {
196     threshold = -1.0;
197     } catch (NumberFormatException e) {
198     threshold = -1.0;
199 ajm 1.2 }
200     return threshold;
201     }
202    
203     /**
204     * Gets the alert timeout value for the given
205     * level of alert. This value is in millis,
206     * and is converted from the value in the config,
207     * which should be seconds.
208     *
209 ajm 1.16 * Note that if the alert timeout for the current monitor
210     * is not configured, it will try to obtain the default
211     * timeout for all Monitor's. If there is no alert timeout
212     * for either the monitor or a default setting this returns 0.
213     *
214 ajm 1.2 * Note that this is dependant on the threshold value
215     * given, the timeout is obatined from the config, then
216     * divided by the threshold value, this allows alerts to
217     * progress faster should a higher threshold value be passed
218     *
219     * @param level the alert level
220     * @param thresholdLevel the threshold leve we are on
221     */
222 ajm 1.11 public long getAlertTimeout(int level) {
223 tdb 1.4 // 0 means we don't use this value
224 ajm 1.2 long timeout = 0;
225 tdb 1.4 try {
226 ajm 1.16 String timeoutString;
227     try {
228     timeoutString = _cp.getProperty("Host." + _hostname, "Monitor." + _monitorName + ".alertTimeout." + Alert.alertLevels[level]);
229     } catch (PropertyNotFoundException e) {
230     // if there is no timeout for the monitor
231     // check for a default
232     timeoutString = _cp.getProperty("Host." + _hostname, "Monitor.alertTimeout." + Alert.alertLevels[level]);
233     }
234 ajm 1.11 int threshold = getLastThresholdLevel();
235 tdb 1.4 if (threshold > 0) {
236     timeout = (Long.parseLong(timeoutString) / threshold) * 1000;
237 ajm 1.2 }
238 tdb 1.4 } catch (PropertyNotFoundException e) {
239     timeout = 0;
240     } catch (NumberFormatException e) {
241     timeout = 0;
242 ajm 1.2 }
243     return timeout;
244 ajm 1.1 }
245    
246 ajm 1.2 /**
247     * Either advances to the next alert level, or if
248     * the maximum alert level has been reached, simply returns
249     * that.
250     *
251 ajm 1.5 * Note this method will NEVER reach the last alert level
252     * in the list, this is assumed to be FINAL, and special
253     * logic is in place to handle that.
254     *
255 ajm 1.2 */
256 ajm 1.11 public int getNextAlertLevel() {
257     if((getLastAlertLevel() + 1) > (Alert.alertLevels.length - 2)) {
258     return getLastAlertLevel();
259 ajm 1.2 }
260 ajm 1.11 return getLastAlertLevel() + 1;
261 ajm 1.2 }
262    
263     /**
264 ajm 1.3 * Gets the timeout value of the last alert
265     * sent
266     *
267     * @return the last timeout value
268     */
269 ajm 1.11 public long getLastAlertTimeout() {
270     return _lastAlertTimeout;
271 ajm 1.3 }
272    
273     /**
274     * Sets the timeout value of the last alert
275     * sent
276     *
277     * @param timeout the new value
278     */
279 ajm 1.11 public void setLastAlertTimeout(long timeout) {
280     _lastAlertTimeout = timeout;
281 ajm 1.3 }
282    
283     /**
284 ajm 1.6 * Returns the time that the first alert was sent
285     * for an attribute that has passed a threshold value
286     *
287     */
288 ajm 1.11 public long getInitialAlertTime() {
289     return _initialAlertTime;
290 ajm 1.6 }
291    
292     /**
293 ajm 1.2 * Advances the alert level to the next one up.
294     *
295 ajm 1.5 * This keeps track of the number of the number
296     * of times the highest NON-FINAL alert level
297     * has been reached. Note this isn't a specific
298     * level, just the highest, so you could configure
299     * more levels and not affect this.
300     *
301     * If the count exceeds the number of times
302     * set in the configuration, it escalates to
303     * a FINAL alert if we're using FINAL's.
304     *
305     * It determines if to use FINAL's from the config
306     * entry reachFINALcount, when the count exceeds
307     * this value, it escalates to a FINAL. If that attribute
308     * is mis-read or is not configured. It will NEVER reach
309     * a FINAL.
310     *
311 ajm 1.2 */
312 ajm 1.11 public void escalateAlert() {
313 tdb 1.7 // don't escalate if we're already on the last alert
314 ajm 1.11 if(getLastAlertLevel() != Alert.alertLevels.length -1) {
315     setLastAlertLevel(getNextAlertLevel());
316 tdb 1.7 }
317 ajm 1.5 try {
318     // note if we fail to get this value, we won't process the res of this
319     int reachFINALcount = Integer.parseInt(_cp.getProperty("Host." + _hostname, "Monitor." + _monitorName + ".reachFINALcount"));
320 ajm 1.11 if (getLastAlertLevel() == Alert.alertLevels.length - 2) {
321 ajm 1.5 _maxLevelCount++;
322 tdb 1.10 if(_maxLevelCount > reachFINALcount) {
323 ajm 1.11 setLastAlertLevel(Alert.alertFINAL);
324 tdb 1.8 }
325 ajm 1.5 }
326     } catch (PropertyNotFoundException e) {
327     // we NEVER reach FINAL in this case
328     } catch (NumberFormatException e) {
329     // we NEVER reach FINAL in this case
330     }
331 ajm 1.1 }
332    
333     //---ATTRIBUTES---
334    
335 ajm 1.2 /**
336     * The host this register is for
337     */
338     private String _hostname;
339    
340     /**
341     * The monitor this register is for
342     */
343     private String _monitorName;
344 ajm 1.14
345     /**
346     * The attribute name, as obtained from
347     * the configuration.
348     * eg, idle or /var
349     */
350     private String _attributeName;
351 ajm 1.2
352     /**
353     * An array of last alert levels for
354     * each attribute this register is looking
355     * after.
356     */
357 ajm 1.11 private int _lastAlertLevel;
358 ajm 1.2
359     /**
360     * An array of last threshold levels for
361     * each attribute this register is looking
362     * after.
363     */
364 ajm 1.11 private int _lastThresholdLevel;
365 ajm 1.3
366     /**
367     * An array of last alert timeout levels for
368     * each attribute this register is looking
369     * after.
370     */
371 ajm 1.11 private long _lastAlertTimeout;
372 ajm 1.2
373     /**
374     * An array of arrays containing
375     * time an alert of each level
376     * was last sent for each attribute.
377     */
378 ajm 1.11 private long[] _times;
379 ajm 1.6
380     /**
381     * Initial times that an alert was first
382     * raised.
383     */
384 ajm 1.11 private long _initialAlertTime;
385 ajm 1.2
386     /**
387     * A reference to the configuration proxy in use
388     */
389     private ConfigurationProxy _cp = ConfigurationProxy.getInstance();
390 ajm 1.5
391     /**
392     * The number of times the maximum level alert
393     * has occured IN A ROW, this is escalated by
394     * the escalate(int) method, and reset by the
395     * setLastAlertLevel(int, int) method
396     */
397     private int _maxLevelCount = 0;
398 ajm 1.1
399     //---STATIC ATTRIBUTES---
400    
401     }