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

# Content
1 /*
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 //---PACKAGE DECLARATION---
21 package uk.org.iscream.cms.server.client.monitors;
22
23 //---IMPORTS---
24 import java.util.HashMap;
25 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
30 /**
31 * This Monitor watches the Load for all machines
32 *
33 * @author $Author: tdb $
34 * @version $Id: Load__Monitor.java,v 1.4 2001/05/29 17:02:34 tdb Exp $
35 */
36 public class Load__Monitor extends MonitorSkeleton {
37
38 //---FINAL ATTRIBUTES---
39
40 /**
41 * The current CVS revision of this class
42 */
43 public final String REVISION = "$Revision: 1.4 $";
44
45 /**
46 * A description of this monitor
47 */
48 public final String DESC = "Monitors Load.";
49
50 //---STATIC METHODS---
51
52 //---CONSTRUCTORS---
53
54 //---PUBLIC METHODS---
55
56 /**
57 * Analyse a packet of data, and generate an alert if
58 * necessary.
59 *
60 * @param packet the XMLPacket to analyse
61 */
62 public void analysePacket(XMLPacket packet) {
63
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 // find out our new threshold
79 int newThreshold = checkAttributeThreshold(currentValue, reg);
80 // process this data to generate an alert
81 processAlert(newThreshold, attributeName, reg, source, currentValue);
82 }
83
84 }
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 * This uses the uk.org.iscream.cms.server.util.NameFormat class
91 * 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
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 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
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 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
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 protected Queue getQueue() {
161 return MonitorManager.getInstance().getDataQueue();
162 }
163
164
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 * A HashMap of Registers (or groups of Registers), one
180 * for each host we're monitoring.
181 */
182 private HashMap _hosts = new HashMap();
183
184 /**
185 * An array of attributes which we will be checking.
186 */
187 private String[] _attributes = { "packet.load.load1", "packet.load.load5", "packet.load.load15" };
188
189 /**
190 * An array of "nice names" for the attributes in _attributes.
191 */
192 private String[] _attributeNames = {"1 min load avg.", "5 min load avg.", "15 min load avg."};
193
194 //---STATIC ATTRIBUTES---
195
196 }