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/Load__Monitor.java
Revision: 1.5
Committed: Sat May 18 18:16:00 2002 UTC (22 years ago) by tdb
Branch: MAIN
Changes since 1.4: +22 -3 lines
Log Message:
i-scream is now licensed under the GPL. I've added the GPL headers to every
source file, and put a full copy of the license in the appropriate places.
I think I've covered everything. This is going to be a mad commit ;)

File Contents

# User Rev Content
1 tdb 1.5 /*
2     * i-scream central monitoring system
3     * Copyright (C) 2000-2002 i-scream
4     *
5     * This program is free software; you can redistribute it and/or
6     * modify it under the terms of the GNU General Public License
7     * as published by the Free Software Foundation; either version 2
8     * of the License, or (at your option) any later version.
9     *
10     * This program is distributed in the hope that it will be useful,
11     * but WITHOUT ANY WARRANTY; without even the implied warranty of
12     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13     * GNU General Public License for more details.
14     *
15     * You should have received a copy of the GNU General Public License
16     * along with this program; if not, write to the Free Software
17     * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18     */
19    
20 tdb 1.1 //---PACKAGE DECLARATION---
21 tdb 1.4 package uk.org.iscream.cms.server.client.monitors;
22 tdb 1.1
23     //---IMPORTS---
24     import java.util.HashMap;
25 tdb 1.4 import uk.org.iscream.cms.server.client.*;
26     import uk.org.iscream.cms.server.core.*;
27     import uk.org.iscream.cms.server.util.*;
28     import uk.org.iscream.cms.server.componentmanager.*;
29 tdb 1.1
30     /**
31     * This Monitor watches the Load for all machines
32     *
33 tdb 1.5 * @author $Author: tdb $
34     * @version $Id: Load__Monitor.java,v 1.4 2001/05/29 17:02:34 tdb Exp $
35 tdb 1.1 */
36     public class Load__Monitor extends MonitorSkeleton {
37    
38     //---FINAL ATTRIBUTES---
39    
40     /**
41     * The current CVS revision of this class
42     */
43 tdb 1.5 public final String REVISION = "$Revision: 1.4 $";
44 tdb 1.1
45 tdb 1.3 /**
46     * A description of this monitor
47     */
48 tdb 1.1 public final String DESC = "Monitors Load.";
49    
50     //---STATIC METHODS---
51    
52     //---CONSTRUCTORS---
53    
54     //---PUBLIC METHODS---
55 tdb 1.3
56     /**
57     * Analyse a packet of data, and generate an alert if
58     * necessary.
59     *
60     * @param packet the XMLPacket to analyse
61     */
62 tdb 1.1 public void analysePacket(XMLPacket packet) {
63    
64 ajm 1.2 String source = packet.getParam("packet.attributes.machine_name");
65     if (!_hosts.containsKey(source)) {
66     HashMap attributeRegisters = new HashMap();
67     initAttributeRegsiters(source, attributeRegisters);
68     _hosts.put(source, attributeRegisters);
69     }
70    
71     HashMap attributeRegisters = (HashMap) _hosts.get(source);
72     for(int attributeNum = 0; attributeNum < _attributes.length; attributeNum++) {
73     Register reg = (Register) attributeRegisters.get(_attributes[attributeNum]);
74     // find out the threshold level we're at
75     String attribute = _attributes[attributeNum];
76     String attributeName = _attributeNames[attributeNum];
77     String currentValue = packet.getParam(attribute);
78 tdb 1.3 // find out our new threshold
79 ajm 1.2 int newThreshold = checkAttributeThreshold(currentValue, reg);
80 tdb 1.3 // process this data to generate an alert
81 ajm 1.2 processAlert(newThreshold, attributeName, reg, source, currentValue);
82 tdb 1.1 }
83 ajm 1.2
84 tdb 1.1 }
85    
86     /**
87     * Overrides the {@link java.lang.Object#toString() Object.toString()}
88     * method to provide clean logging (every class should have this).
89     *
90 tdb 1.4 * This uses the uk.org.iscream.cms.server.util.NameFormat class
91 tdb 1.1 * to format the toString()
92     *
93     * @return the name of this class and its CVS revision
94     */
95     public String toString() {
96     return FormatName.getName(
97     _name,
98     getClass().getName(),
99     REVISION);
100     }
101    
102     /**
103     * return the String representation of what the monitor does
104     */
105     public String getDescription(){
106     return DESC;
107     }
108    
109     //---PRIVATE METHODS---
110 tdb 1.3
111     /**
112     * Checks a piece of current data, and returns the
113     * threshold it breaches, if any.
114     *
115     * @param attributeString a String representing the current data value
116     * @param reg the Register for the host
117     * @return the threshold level breached, if any
118     */
119 tdb 1.1 private int checkAttributeThreshold(String attributeString, Register reg) {
120     for(int thresholdLevel = Alert.thresholdLevels.length - 1; thresholdLevel >= 0; thresholdLevel--) {
121     if (reg.getThreshold(thresholdLevel) != -1.0) {
122     if(attributeString != null) {
123     try {
124     double attribute = Double.parseDouble(attributeString);
125     if (reg.getThreshold(thresholdLevel) < attribute) return thresholdLevel;
126     } catch (NumberFormatException e) {
127     // we got some duff data in the packet, but we shouldn't have
128     _logger.write(toString(), Logger.DEBUG, "possible errenous packet data, should be double value - " + attributeString);
129     }
130     }
131     }
132     }
133     return Alert.thresholdNORMAL;
134     }
135 tdb 1.3
136     /**
137     * Initialises a HashMap of Registers with the current list
138     * of attributes. This is only used if we are looking at more
139     * than one distinct attribute.
140     *
141     * @param source the host we are looking at
142     * @param attributeRegisters a HashMap to put the new Registers in
143     */
144 tdb 1.1 private void initAttributeRegsiters(String source, HashMap attributeRegisters) {
145     for(int attributeNum = 0; attributeNum < _attributes.length; attributeNum++) {
146     String attributeName = _attributes[attributeNum].substring(_attributes[attributeNum].lastIndexOf(".") + 1);
147     attributeRegisters.put(_attributes[attributeNum], new Register(source, _name, attributeName));
148     }
149     }
150    
151     //---ACCESSOR/MUTATOR METHODS---
152 tdb 1.3
153     /**
154     * Returns a reference to a specific Queue for this
155     * monitor. This Queue returns only the data packets
156     * (based on type) that we want too look at.
157     *
158     * @return a reference to a Queue
159     */
160 ajm 1.2 protected Queue getQueue() {
161     return MonitorManager.getInstance().getDataQueue();
162     }
163    
164 tdb 1.1
165     //---ATTRIBUTES---
166    
167     /**
168     * This is the friendly identifier of the
169     * component this class is running in.
170     * eg, a Filter may be called "filter1",
171     * If this class does not have an owning
172     * component, a name from the configuration
173     * can be placed here. This name could also
174     * be changed to null for utility classes.
175     */
176     private String _name = "Load";
177    
178     /**
179 tdb 1.3 * A HashMap of Registers (or groups of Registers), one
180     * for each host we're monitoring.
181 tdb 1.1 */
182     private HashMap _hosts = new HashMap();
183 tdb 1.3
184     /**
185     * An array of attributes which we will be checking.
186     */
187 tdb 1.1 private String[] _attributes = { "packet.load.load1", "packet.load.load5", "packet.load.load15" };
188 tdb 1.3
189     /**
190     * An array of "nice names" for the attributes in _attributes.
191     */
192 tdb 1.1 private String[] _attributeNames = {"1 min load avg.", "5 min load avg.", "15 min load avg."};
193    
194     //---STATIC ATTRIBUTES---
195    
196     }