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
(Generate patch)

Comparing projects/cms/source/server/uk/org/iscream/cms/server/client/monitors/Heartbeat__Monitor.java (file contents):
Revision 1.7 by tdb, Tue Mar 6 22:35:01 2001 UTC vs.
Revision 1.17 by ajm, Fri Mar 23 01:08:00 2001 UTC

# Line 1 | Line 1
1   //---PACKAGE DECLARATION---
2 < package uk.ac.ukc.iscream.client.monitors;
2 > package uk.org.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.*;
7 > import uk.org.iscream.client.*;
8 > import uk.org.iscream.core.*;
9 > import uk.org.iscream.util.*;
10 > import uk.org.iscream.componentmanager.*;
11  
12   /**
13   * This Monitor watches heartbeats
# Line 15 | Line 15 | import uk.ac.ukc.iscream.componentmanager.*;
15   * @author  $Author$
16   * @version $Id$
17   */
18 < public class Heartbeat__Monitor extends MonitorSkeleton implements Runnable {
18 > public class Heartbeat__Monitor extends MonitorSkeleton {
19  
20   //---FINAL ATTRIBUTES---
21  
# Line 33 | Line 33 | public class Heartbeat__Monitor extends MonitorSkeleto
33   //---CONSTRUCTORS---
34  
35      public Heartbeat__Monitor() {
36 <        new Thread(this).start();
36 >        super();
37 >        new HeartbeatWorker().start();
38      }
39  
40   //---PUBLIC METHODS---
41      
41    public void run() {
42        ConfigurationProxy cp = ConfigurationProxy.getInstance();
43        while(true) {
44            // this cycle period of this monitor's checks
45            int checkPeriod = 0;
46            try {
47                checkPeriod = Integer.parseInt(cp.getProperty(_name, "Monitor.Heartbeat.checkPeriod"));
48            } catch (PropertyNotFoundException e) {
49                checkPeriod = DEFAULT_CHECK_PERIOD;
50                _logger.write(toString(), Logger.WARNING, "Monitor.Heartbeat.checkPeriod value unavailable using default of " + checkPeriod + " seconds");
51            } catch (NumberFormatException e) {
52                checkPeriod = DEFAULT_CHECK_PERIOD;
53                _logger.write(toString(), Logger.WARNING, "Erronous Monitor.Heartbeat.checkPeriod value in configuration using default of " + checkPeriod + " seconds");
54            }
55            
56            // perform the checks (use HB hash, although they *should* be the same)
57            Iterator i = _hosts.keySet().iterator();
58            while(i.hasNext()) {
59                // get host
60                String source = (String) i.next();
61                // check it
62                boolean remove = analyseHB(source);
63                if(remove) {
64                    i.remove();
65                }
66            }
67            
68            // wait a while
69            try {Thread.sleep(checkPeriod * 1000);} catch (InterruptedException e) {}
70        }
71    }
72    
42      public void analysePacket(XMLPacket packet) {
43 <        if (packet.getParam("packet.attributes.type").equals("heartbeat")) {
44 <            String source = packet.getParam("packet.attributes.machine_name");
45 <            if (!_hosts.containsKey(source)) {
43 >        String source = packet.getParam("packet.attributes.machine_name");
44 >        if (!_hosts.containsKey(source)) {
45 >            synchronized(this) {
46                  HashMap registerHash = new HashMap();
47 <                registerHash.put(source, new Register(source, _name, 1));
47 >                registerHash.put(source, new Register(source, _name));
48                  _hosts.put(source, new HeartbeatHolder(registerHash));
49              }
81            HeartbeatHolder lastHeartbeat = (HeartbeatHolder) _hosts.get(source);
82            lastHeartbeat.setLastHeartbeat(System.currentTimeMillis()/1000);
50          }
51 +        HeartbeatHolder lastHeartbeat = (HeartbeatHolder) _hosts.get(source);
52 +        lastHeartbeat.setLastHeartbeat(System.currentTimeMillis()/1000);
53      }
54      
55      /**
56       * Overrides the {@link java.lang.Object#toString() Object.toString()}
57       * method to provide clean logging (every class should have this).
58       *
59 <     * This uses the uk.ac.ukc.iscream.util.NameFormat class
59 >     * This uses the uk.org.iscream.util.NameFormat class
60       * to format the toString()
61       *
62       * @return the name of this class and its CVS revision
# Line 107 | Line 76 | public class Heartbeat__Monitor extends MonitorSkeleto
76      }
77  
78   //---PRIVATE METHODS---
110
111    private boolean analyseHB(String source) {
112        ConfigurationProxy cp = ConfigurationProxy.getInstance();
113        HeartbeatHolder hbHolder = (HeartbeatHolder) _hosts.get(source);
114        Register reg = (Register) ((HashMap) hbHolder.getRegisterHash()).get(source);
115        
116        // get host's HB interval (seconds)
117        // this should always exist, thus we set to 0
118        int hostHBinterval = 0;
119        try {
120            hostHBinterval = Integer.parseInt(cp.getProperty("Host."+source, "Host.TCPUpdateTime"));
121        } catch (PropertyNotFoundException e) {
122            hostHBinterval = 0;
123            _logger.write(toString(), Logger.WARNING, "TCPUpdateTime value unavailable using default of " + hostHBinterval + " seconds");
124        } catch (NumberFormatException e) {
125            hostHBinterval = 0;
126            _logger.write(toString(), Logger.WARNING, "Erronous TCPUpdateTime value in configuration using default of " + hostHBinterval + " seconds");
127        }
128        
129        // get host's last HB time (seconds)
130        long lastHeartbeat = hbHolder.getLastHeartbeat();
131        // time since last heartbeat (seconds)
132        long timeSinceLastHB = (System.currentTimeMillis()/1000) - lastHeartbeat;
133        
134        // find out the threshold level we're at
135        int newThreshold = checkAttributeThreshold(timeSinceLastHB, reg);
136        
137        // process the alert
138        processAlert(newThreshold, 0, "Heartbeat", reg, source, String.valueOf(timeSinceLastHB));
139        
140        if(reg.getLastAlertLevel(0) == Alert.alertFINAL) {
141            return true;
142        }
143        return false;
144    }
79      
80      private int checkAttributeThreshold(long timeSinceLastHB, Register reg) {
81          for(int thresholdLevel = Alert.thresholdLevels.length - 1; thresholdLevel >= 0; thresholdLevel--) {
# Line 156 | Line 90 | public class Heartbeat__Monitor extends MonitorSkeleto
90  
91   //---ACCESSOR/MUTATOR METHODS---
92  
93 +    protected Queue getQueue() {
94 +        return MonitorManager.getInstance().getHeartbeatQueue();
95 +    }
96 +    
97   //---ATTRIBUTES---
98  
99      /**
# Line 176 | Line 114 | public class Heartbeat__Monitor extends MonitorSkeleto
114  
115      private HashMap _hosts = new HashMap();
116  
117 +    private Logger _logger = ReferenceManager.getInstance().getLogger();
118 +
119   //---STATIC ATTRIBUTES---
120  
121   //---INNER CLASSES---
# Line 200 | Line 140 | public class Heartbeat__Monitor extends MonitorSkeleto
140          
141          private long _lastHeartbeat;
142          private HashMap _registerHash;
143 <    }  
144 <
143 >    }
144 >    
145 >    private class HeartbeatWorker extends Thread {
146 >        
147 >        public void run() {
148 >            ConfigurationProxy cp = ConfigurationProxy.getInstance();
149 >            while(true) {
150 >                // this cycle period of this monitor's checks
151 >                int checkPeriod = 0;
152 >                try {
153 >                    checkPeriod = Integer.parseInt(cp.getProperty(_name, "Monitor.Heartbeat.checkPeriod"));
154 >                } catch (PropertyNotFoundException e) {
155 >                    checkPeriod = DEFAULT_CHECK_PERIOD;
156 >                    _logger.write(this.toString(), Logger.WARNING, "Monitor.Heartbeat.checkPeriod value unavailable using default of " + checkPeriod + " seconds");
157 >                } catch (NumberFormatException e) {
158 >                    checkPeriod = DEFAULT_CHECK_PERIOD;
159 >                    _logger.write(this.toString(), Logger.WARNING, "Erronous Monitor.Heartbeat.checkPeriod value in configuration using default of " + checkPeriod + " seconds");
160 >                }
161 >                
162 >                synchronized(this) {
163 >                    // perform the checks (use HB hash, although they *should* be the same)
164 >                    Iterator i = _hosts.keySet().iterator();
165 >                    while(i.hasNext()) {
166 >                        // get host
167 >                        String source = (String) i.next();
168 >                        // check it
169 >                        boolean remove = analyseHB(source);
170 >                        if(remove) {
171 >                            i.remove();
172 >                        }
173 >                    }
174 >                }
175 >                
176 >                // wait a while
177 >                try {Thread.sleep(checkPeriod * 1000);} catch (InterruptedException e) {}
178 >            }
179 >        }
180 >        
181 >        private boolean analyseHB(String source) {
182 >            ConfigurationProxy cp = ConfigurationProxy.getInstance();
183 >            HeartbeatHolder hbHolder = (HeartbeatHolder) _hosts.get(source);
184 >            Register reg = (Register) ((HashMap) hbHolder.getRegisterHash()).get(source);
185 >            
186 >            // get host's HB interval (seconds)
187 >            // this should always exist, thus we set to 0
188 >            int hostHBinterval = 0;
189 >            try {
190 >                hostHBinterval = Integer.parseInt(cp.getProperty("Host."+source, "Host.TCPUpdateTime"));
191 >            } catch (PropertyNotFoundException e) {
192 >                hostHBinterval = 0;
193 >                _logger.write(this.toString(), Logger.WARNING, "TCPUpdateTime value unavailable using default of " + hostHBinterval + " seconds");
194 >            } catch (NumberFormatException e) {
195 >                hostHBinterval = 0;
196 >                _logger.write(this.toString(), Logger.WARNING, "Erronous TCPUpdateTime value in configuration using default of " + hostHBinterval + " seconds");
197 >            }
198 >            
199 >            // get host's last HB time (seconds)
200 >            long lastHeartbeat = hbHolder.getLastHeartbeat();
201 >            // time since last heartbeat (seconds)
202 >            long timeSinceLastHB = (System.currentTimeMillis()/1000) - lastHeartbeat;
203 >            // time since (or until if negative) the expected heartbeat
204 >            long timeSinceExpectedHB = timeSinceLastHB - (long) hostHBinterval;
205 >            
206 >            // best do a check in case the expected heartbeat is in the future
207 >            if(timeSinceExpectedHB < 0) {
208 >                timeSinceExpectedHB = 0;
209 >            }
210 >            
211 >            // find out the threshold level we're at
212 >            int newThreshold = checkAttributeThreshold(timeSinceExpectedHB, reg);
213 >            
214 >            // process the alert
215 >            Heartbeat__Monitor.this.processAlert(newThreshold, "Heartbeat", reg, source, String.valueOf(timeSinceExpectedHB));
216 >            
217 >            if(reg.getLastAlertLevel() == Alert.alertFINAL) {
218 >                return true;
219 >            }
220 >            return false;
221 >        }
222 >    }
223   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines