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

# Content
1 /*
2 * i-scream central monitoring system
3 * http://www.i-scream.org.uk
4 * 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 //---PACKAGE DECLARATION---
22 package uk.org.iscream.cms.server.client.monitors;
23
24 //---IMPORTS---
25 import java.util.HashMap;
26 import uk.org.iscream.cms.server.client.*;
27 import uk.org.iscream.cms.server.core.*;
28 import uk.org.iscream.cms.util.*;
29 import uk.org.iscream.cms.server.componentmanager.*;
30
31 /**
32 * This Monitor watches the CPU load for all machines
33 *
34 * @author $Author: tdb $
35 * @version $Id: CPU__Monitor.java,v 1.26 2002/05/21 16:47:16 tdb Exp $
36 */
37 public class CPU__Monitor extends MonitorSkeleton {
38
39 //---FINAL ATTRIBUTES---
40
41 /**
42 * The current CVS revision of this class
43 */
44 public final String REVISION = "$Revision: 1.26 $";
45
46 /**
47 * A description of this monitor
48 */
49 public final String DESC = "Monitors CPU.";
50
51 //---STATIC METHODS---
52
53 //---CONSTRUCTORS---
54
55 //---PUBLIC METHODS---
56
57 /**
58 * Analyse a packet of data, and generate an alert if
59 * necessary.
60 *
61 * @param packet the XMLPacket to analyse
62 */
63 public void analysePacket(XMLPacket packet) {
64 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 int newThreshold = checkAttributeThreshold(currentValue, reg);
79 processAlert(newThreshold, attributeName, reg, source, currentValue);
80 }
81 }
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 * This uses the uk.org.iscream.cms.util.NameFormat class
88 * 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 * return the String representation of what the monitor does
101 */
102 public String getDescription(){
103 return DESC;
104 }
105
106 //---PRIVATE METHODS---
107
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 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 }
128 }
129 }
130 return Alert.thresholdNORMAL;
131 }
132
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 private void initAttributeRegsiters(String source, HashMap attributeRegisters) {
142 for(int attributeNum = 0; attributeNum < _attributes.length; attributeNum++) {
143 String attributeName = _attributes[attributeNum].substring(_attributes[attributeNum].lastIndexOf(".") + 1);
144 attributeRegisters.put(_attributes[attributeNum], new Register(source, _name, attributeName));
145 }
146 }
147
148 //---ACCESSOR/MUTATOR METHODS---
149
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 protected Queue getQueue() {
158 return MonitorManager.getInstance().getDataQueue();
159 }
160
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 private String _name = "CPU";
173
174 /**
175 * A HashMap of Registers (or groups of Registers), one
176 * for each host we're monitoring.
177 */
178 private HashMap _hosts = new HashMap();
179
180 /**
181 * An array of attributes which we will be checking.
182 */
183 private String[] _attributes = { "packet.cpu.user", "packet.cpu.kernel", "packet.cpu.iowait", "packet.cpu.swap" };
184
185 /**
186 * An array of "nice names" for the attributes in _attributes.
187 */
188 private String[] _attributeNames = {"User CPU", "Kernel CPU", "I/O Wait CPU", "Swap CPU"};
189
190 //---STATIC ATTRIBUTES---
191
192 }