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/Heartbeat__Monitor.java
Revision: 1.1
Committed: Mon Mar 5 13:30:34 2001 UTC (23 years, 2 months ago) by tdb
Branch: MAIN
Log Message:
A monitor to watch Heartbeats. This has been built around the architecture of
the CPU Monitor, in the hope that it'll later allow better abstraction. This may
not fully work yet.

File Contents

# Content
1 //---PACKAGE DECLARATION---
2 package uk.ac.ukc.iscream.client.monitors;
3
4 //---IMPORTS---
5 import java.util.HashMap;
6 import java.util.Iterator;
7 import uk.ac.ukc.iscream.client.*;
8 import uk.ac.ukc.iscream.core.*;
9 import uk.ac.ukc.iscream.util.*;
10 import uk.ac.ukc.iscream.componentmanager.*;
11
12 /**
13 * This Monitor watches heartbeats
14 *
15 * @author $Author$
16 * @version $Id$
17 */
18 public class Heartbeat__Monitor extends Thread implements PluginMonitor {
19
20 //---FINAL ATTRIBUTES---
21
22 /**
23 * The current CVS revision of this class
24 */
25 public final String REVISION = "$Revision: 1.1 $";
26
27 public final String DESC = "Monitors Heartbeats.";
28
29 //---STATIC METHODS---
30
31 //---CONSTRUCTORS---
32
33 //---PUBLIC METHODS---
34
35 public void run() {
36 ConfigurationProxy cp = ConfigurationProxy.getInstance();
37 while(true) {
38 // this cycle period could be done better, maybe ?
39 int checkPeriod = Integer.parseInt(cp.getProperty(_name, "Monitor.Heartbeat.checkPeriod"));
40
41 // perform the checks (use HB hash, although they *should* be the same)
42 Iterator i = _hostsHB.keySet().iterator();
43 while(i.hasNext()) {
44 // get host
45 String source = (String) i.next();
46 // check it
47 analyseHB(source);
48 }
49
50 // wait a while
51 try {Thread.sleep(checkPeriod * 1000);} catch (InterruptedException e) {}
52 }
53 }
54
55 // only use attribute num 0 :)
56 public void analyseHB(String source) {
57 ConfigurationProxy cp = ConfigurationProxy.getInstance();
58 Register reg = (Register) _hostsReg.get(source);
59
60 // get host's HB interval (seconds)
61 int hostHBinterval = Integer.parseInt(cp.getProperty("Host."+source, "TCPUpdateTime"));
62 // get host's last HB time (seconds)
63 int lastHeartbeat = ((HeartbeatHolder) _hostsHB.get(source)).getLastHeartbeat();
64 // time since last heartbeat (seconds)
65 int timeSinceLastHB = ((int) (System.currentTimeMillis()/1000)) - lastHeartbeat;
66
67 // find out the threshold level we're at
68 int result = checkAttributeThreshold(timeSinceLastHB, reg);
69
70 // decide what threshold level we're on, if we've changed, record that
71 if (result != reg.getLastThresholdLevel(0)) {
72 reg.setLastThresholdLevel(0, result);
73 }
74
75 // as long as this isn't a normal level
76 if(reg.getLastThresholdLevel(0) != Alert.thresholdNORMAL) {
77 // if the time since the last alert is more than the time for
78 // its timeout, fire an alert, escalate the alert
79 long timeout = reg.getLastAlertTimeout(0);
80 if ((timeout > 0) && (reg.getTimeLastSent(0) > 0)) {
81 if((System.currentTimeMillis() - reg.getTimeLastSent(0)) > timeout) {
82 int lastAlert = reg.getLastAlertLevel(0);
83 reg.escalateAlert(0);
84 reg.setTimeLastSent(0, System.currentTimeMillis());
85 reg.setLastAlertTimeout(0, reg.getAlertTimeout(reg.getLastAlertLevel(0), 0));
86 // -- SEND
87 fireAlert(source, timeSinceLastHB, reg, lastAlert);
88 }
89 // if we don't have a timeout configured...we got STRAIGHT to the next level
90 } else {
91 int lastAlert = reg.getLastAlertLevel(0);
92 reg.escalateAlert(0);
93 reg.setTimeLastSent(0, System.currentTimeMillis());
94 reg.setLastAlertTimeout(0, reg.getAlertTimeout(reg.getLastAlertLevel(0), 0));
95 // -- SEND
96 fireAlert(source, timeSinceLastHB, reg, lastAlert);
97 }
98
99 // we must be on ok, check the timeout value for this
100 } else {
101 // if we were on an OK alert before, then we don't do anything
102 // but if we weren't we only set OK, once the timeout of the last
103 // alert has occourd
104 if (reg.getLastAlertLevel(0) != Alert.alertOK) {
105 long timeout = reg.getLastAlertTimeout(0);
106 if ((timeout > 0) && (reg.getTimeLastSent(0) > 0)) {
107 if ((System.currentTimeMillis() - reg.getTimeLastSent(0)) > timeout) {
108 int lastAlert = reg.getLastAlertLevel(0);
109 reg.setLastAlertLevel(0, Alert.alertOK);
110 reg.setTimeLastSent(0, System.currentTimeMillis());
111 reg.setLastAlertTimeout(0, timeout);
112 // -- SEND
113 fireAlert(source, timeSinceLastHB, reg, lastAlert);
114 }
115 }
116 }
117 }
118 }
119
120 public void analysePacket(XMLPacket packet) {
121 if (packet.getParam("packet.attributes.type").equals("heartbeat")) {
122 String source = packet.getParam("packet.attributes.machine_name");
123 if (!_hostsHB.containsKey(source)) {
124 _hostsReg.put(source, new Register(source, _name, 1));
125 _hostsHB.put(source, new HeartbeatHolder());
126 }
127 HeartbeatHolder lastHeartbeat = (HeartbeatHolder) _hostsReg.get(source);
128 lastHeartbeat.setLastHeartbeat((int)System.currentTimeMillis()/1000);
129 }
130 }
131
132 /**
133 * Overrides the {@link java.lang.Object#toString() Object.toString()}
134 * method to provide clean logging (every class should have this).
135 *
136 * This uses the uk.ac.ukc.iscream.util.NameFormat class
137 * to format the toString()
138 *
139 * @return the name of this class and its CVS revision
140 */
141 public String toString() {
142 return FormatName.getName(
143 _name,
144 getClass().getName(),
145 REVISION);
146 }
147
148 /**
149 * return the String representation of what the monitor does
150 */
151 public String getDescription(){
152 return DESC;
153 }
154
155 //---PRIVATE METHODS---
156
157 private int checkAttributeThreshold(int timeSinceLastHB, Register reg) {
158 for(int thresholdLevel = Alert.thresholdLevels.length - 1; thresholdLevel >= 0; thresholdLevel--) {
159 if (reg.getThreshold(thresholdLevel) != -1.0) {
160 if (reg.getThreshold(thresholdLevel) < timeSinceLastHB) {
161 return thresholdLevel;
162 }
163 }
164 }
165 return 0;
166 }
167
168 private void fireAlert(String source, int timeSinceLastHB, Register reg, int lastAlert) {
169 int alertLevel = reg.getLastAlertLevel(0);
170 int thresholdLevel = reg.getLastThresholdLevel(0);
171 String currentValue = String.valueOf(timeSinceLastHB);
172 String attributeName = "Heartbeat";
173 String thresholdValue = String.valueOf(reg.getThreshold(thresholdLevel));
174 String time = Long.toString(reg.getAlertTimeout(reg.getLastAlertLevel(0), 0) / 1000);
175 if (thresholdLevel == Alert.thresholdNORMAL) {
176 thresholdValue = "-";
177 }
178 if (alertLevel == Alert.alertOK) {
179 time = "0";
180 }
181 Alert alert = new Alert(alertLevel, lastAlert, thresholdLevel, source, thresholdValue, currentValue, attributeName, time);
182 _alerterQueue.add(alert);
183 _logger.write(toString(), Logger.DEBUG, "Fired alert for source:" + source + " at alert level:" + Alert.alertLevels[alertLevel] + " on:" + attributeName + " for threshold level:" + Alert.thresholdLevels[thresholdLevel] + " at:" + currentValue + " exceeding threshold of:" +thresholdValue + " next alert sent in:" + time + "secs");
184 }
185
186 //---ACCESSOR/MUTATOR METHODS---
187
188 //---ATTRIBUTES---
189
190 /**
191 * This is the friendly identifier of the
192 * component this class is running in.
193 * eg, a Filter may be called "filter1",
194 * If this class does not have an owning
195 * component, a name from the configuration
196 * can be placed here. This name could also
197 * be changed to null for utility classes.
198 */
199 private String _name = "Heartbeat";
200
201 /**
202 * This holds a reference to the
203 * system logger that is being used.
204 */
205 private Logger _logger = ReferenceManager.getInstance().getLogger();
206
207 private Queue _alerterQueue = ClientMain._alerterQueue;
208
209 /**
210 * A reference to the configuration proxy in use
211 */
212 private ConfigurationProxy _cp = ConfigurationProxy.getInstance();
213
214 private HashMap _hostsHB = new HashMap();
215 private HashMap _hostsReg = new HashMap();
216
217 //---STATIC ATTRIBUTES---
218
219 //---INNER CLASSES---
220
221 private class HeartbeatHolder {
222
223 public void setLastHeartbeat(int lastHeartbeat) {
224 _lastHeartbeat = lastHeartbeat;
225 }
226
227 public int getLastHeartbeat() {
228 return _lastHeartbeat;
229 }
230
231 private int _lastHeartbeat;
232 }
233
234 }