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/CPU__Monitor.java
Revision: 1.27
Committed: Wed Feb 5 16:43:45 2003 UTC (21 years, 3 months ago) by tdb
Branch: MAIN
Changes since 1.26: +4 -4 lines
Log Message:
Changed the server to use the external util package. Quite a minor change,
but does affect a lot of files.

File Contents

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