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

# Content
1 //---PACKAGE DECLARATION---
2 package uk.org.iscream.client;
3
4 //---IMPORTS---
5 import uk.org.iscream.util.*;
6 import uk.org.iscream.componentmanager.*;
7
8 /**
9 * The Register class holds theshold values,
10 * the last level of alert for each attribute for a monitor
11 * and the time of last alert sent for each alert level.
12 *
13 * 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 * @author $Author: tdb1 $
19 * @version $Id: Register.java,v 1.13 2001/03/15 03:25:41 tdb1 Exp $
20 */
21 public class Register {
22
23 //---FINAL ATTRIBUTES---
24
25 /**
26 * The current CVS revision of this class
27 */
28 public static final String REVISION = "$Revision: 1.13 $";
29
30 //---STATIC METHODS---
31
32 //---CONSTRUCTORS---
33
34 /**
35 * Construct a Register with the hostname and monitorName
36 * (for obtaining the threshold values).
37 * This constructs a generic register for a specific monitor.
38 *
39 * @param hostname the hostname this register is for
40 * @param monitorName the monitor this register is for
41 */
42 public Register(String hostname, String monitorName) {
43 this(hostname, monitorName, null);
44 }
45
46 /**
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 */
56 public Register(String hostname, String monitorName, String attributeName) {
57 _hostname = hostname;
58 _monitorName = monitorName;
59 _attributeName = attributeName;
60 _lastAlertLevel = 0;
61 _lastThresholdLevel = 0;
62 _initialAlertTime= 0;
63 _lastAlertTimeout = 0;
64 _times = new long[Alert.alertLevels.length];
65 // initialise the arrays to 0
66 for(int x = 0; x < Alert.alertLevels.length; x++) {
67 _times[x] = 0;
68 }
69 }
70
71
72 //---PUBLIC METHODS---
73
74 //---PRIVATE METHODS---
75
76 /**
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 //---ACCESSOR/MUTATOR METHODS---
101
102 /**
103 * Gets the last alert level
104 *
105 * @return the last alert level
106 */
107 public int getLastAlertLevel() {
108 return _lastAlertLevel;
109 }
110
111 /**
112 * Sets the last threshold level
113 *
114 * @param level the new last threshold level
115 */
116 public void setLastThresholdLevel(int level) {
117 _lastThresholdLevel = level;
118 }
119
120 /**
121 * Gets the last threshold level
122 *
123 * @return the last threshold level
124 */
125 public int getLastThresholdLevel() {
126 return _lastThresholdLevel;
127 }
128
129 /**
130 * Sets the last alert level
131 *
132 * Note that if this is setting to an OK
133 * level alert, it resets _maxLevelCount.
134 *
135 * 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 * @param level the new last alert level
140 */
141 public void setLastAlertLevel(int level) {
142 _lastAlertLevel = level;
143 if (level == Alert.alertOK) {
144 _maxLevelCount = 0;
145 // 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 }
149 if (level == Alert.alertOK + 1) {
150 _initialAlertTime = System.currentTimeMillis();
151 }
152 }
153
154 /**
155 * Gets the time an alert was sent at the given level.
156 *
157 * @param level the alert level to get
158 *
159 * @return the time last sent
160 */
161 public long getTimeLastSent() {
162 return _times[getLastAlertLevel()];
163 }
164
165 /**
166 * Gets the time an alert was sent at the given level.
167 *
168 * @param level the alert level to get
169 * @param value the new time
170 */
171 public void setTimeLastSent(long value) {
172 _times[getLastAlertLevel()] = value;
173 }
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 // -1.0 means we don't use an alert level
186 double threshold = -1.0;
187 try {
188 String thresholdString = getThresholdConfig(level, _attributeName);
189 threshold = Double.parseDouble(thresholdString);
190 } catch (PropertyNotFoundException e) {
191 threshold = -1.0;
192 } catch (NumberFormatException e) {
193 threshold = -1.0;
194 }
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 * given level, this returns 0
211 *
212 * @param level the alert level
213 * @param thresholdLevel the threshold leve we are on
214 */
215 public long getAlertTimeout(int level) {
216 // 0 means we don't use this value
217 long timeout = 0;
218 try {
219 String timeoutString = _cp.getProperty("Host." + _hostname, "Monitor." + _monitorName + ".alertTimeout." + Alert.alertLevels[level]);
220 int threshold = getLastThresholdLevel();
221 if (threshold > 0) {
222 timeout = (Long.parseLong(timeoutString) / threshold) * 1000;
223 }
224 } catch (PropertyNotFoundException e) {
225 timeout = 0;
226 } catch (NumberFormatException e) {
227 timeout = 0;
228 }
229 return timeout;
230 }
231
232 /**
233 * Either advances to the next alert level, or if
234 * the maximum alert level has been reached, simply returns
235 * that.
236 *
237 * 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 */
242 public int getNextAlertLevel() {
243 if((getLastAlertLevel() + 1) > (Alert.alertLevels.length - 2)) {
244 return getLastAlertLevel();
245 }
246 return getLastAlertLevel() + 1;
247 }
248
249 /**
250 * Gets the timeout value of the last alert
251 * sent
252 *
253 * @return the last timeout value
254 */
255 public long getLastAlertTimeout() {
256 return _lastAlertTimeout;
257 }
258
259 /**
260 * Sets the timeout value of the last alert
261 * sent
262 *
263 * @param timeout the new value
264 */
265 public void setLastAlertTimeout(long timeout) {
266 _lastAlertTimeout = timeout;
267 }
268
269 /**
270 * Returns the time that the first alert was sent
271 * for an attribute that has passed a threshold value
272 *
273 */
274 public long getInitialAlertTime() {
275 return _initialAlertTime;
276 }
277
278 /**
279 * Advances the alert level to the next one up.
280 *
281 * 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 */
298 public void escalateAlert() {
299 // don't escalate if we're already on the last alert
300 if(getLastAlertLevel() != Alert.alertLevels.length -1) {
301 setLastAlertLevel(getNextAlertLevel());
302 }
303 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 if (getLastAlertLevel() == Alert.alertLevels.length - 2) {
307 _maxLevelCount++;
308 if(_maxLevelCount > reachFINALcount) {
309 setLastAlertLevel(Alert.alertFINAL);
310 }
311 }
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 }
318
319 //---ATTRIBUTES---
320
321 /**
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
331 /**
332 * The attribute name, as obtained from
333 * the configuration.
334 * eg, idle or /var
335 */
336 private String _attributeName;
337
338 /**
339 * An array of last alert levels for
340 * each attribute this register is looking
341 * after.
342 */
343 private int _lastAlertLevel;
344
345 /**
346 * An array of last threshold levels for
347 * each attribute this register is looking
348 * after.
349 */
350 private int _lastThresholdLevel;
351
352 /**
353 * An array of last alert timeout levels for
354 * each attribute this register is looking
355 * after.
356 */
357 private long _lastAlertTimeout;
358
359 /**
360 * An array of arrays containing
361 * time an alert of each level
362 * was last sent for each attribute.
363 */
364 private long[] _times;
365
366 /**
367 * Initial times that an alert was first
368 * raised.
369 */
370 private long _initialAlertTime;
371
372 /**
373 * A reference to the configuration proxy in use
374 */
375 private ConfigurationProxy _cp = ConfigurationProxy.getInstance();
376
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
385 //---STATIC ATTRIBUTES---
386
387 }