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/Queue__Monitor.java
Revision: 1.16
Committed: Wed Feb 5 16:43:46 2003 UTC (21 years, 3 months ago) by tdb
Branch: MAIN
Changes since 1.15: +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 java.util.ArrayList;
27 import java.util.Set;
28 import java.util.Iterator;
29 import java.text.NumberFormat;
30 import uk.org.iscream.cms.server.client.*;
31 import uk.org.iscream.cms.server.core.*;
32 import uk.org.iscream.cms.util.*;
33 import uk.org.iscream.cms.server.componentmanager.*;
34
35 /**
36 * This Monitor watches the internal server queues.
37 * YES! this system is SO great it monitors itself!
38 *
39 * @author $Author: tdb $
40 * @version $Id: Queue__Monitor.java,v 1.15 2002/05/21 16:47:16 tdb Exp $
41 */
42 public class Queue__Monitor extends MonitorSkeleton {
43
44 //---FINAL ATTRIBUTES---
45
46 /**
47 * The current CVS revision of this class
48 */
49 public final String REVISION = "$Revision: 1.15 $";
50
51 /**
52 * A description of this monitor
53 */
54 public final String DESC = "Who watches the watchmen?";
55
56 private final String SOURCE = "i-scream-server";
57
58 //---STATIC METHODS---
59
60 //---CONSTRUCTORS---
61
62 //---PUBLIC METHODS---
63
64 /**
65 * Analyse a packet of data, and generate an alert if
66 * necessary.
67 *
68 * @param packet the XMLPacket to analyse
69 */
70 public void analysePacket(XMLPacket packet) {
71 if (packet.getParam("packet.attributes.type").equals("queueStat")) {
72 String source = packet.getParam("packet.attributes.hashCode");
73 if (!_hosts.containsKey(source)) {
74 _hosts.put(source, new HashMap());
75 }
76
77 HashMap queueRegisters = (HashMap) _hosts.get(source);
78
79 // get info about the source queue class instance
80 String queueName = packet.getParam("packet.attributes.name");
81 String maxQueueSize = packet.getParam("packet.queue.attributes.maxSize");
82 // unfortunatly we need to check the whole packet
83 // to find the queues, and then get the data attributes
84 Set packetSet = packet.getSet();
85 Iterator i = packetSet.iterator();
86
87 while (i.hasNext()) {
88 String dataKey = (String) i.next();
89 if(dataKey.startsWith("packet.queue.attributes.queue")) {
90 String queueSize = packet.getParam(dataKey);
91
92 // silently ignore these
93 // they're generated by the queueMonitor for deleted queues
94 if(queueSize.equals("[deleted]")) {
95 break;
96 }
97
98 // *** now process this queue ***
99
100 // check if we've seen this queue before on a previous run
101 // if not, we need to create a register for it
102 if(!queueRegisters.containsKey(dataKey)) {
103 queueRegisters.put(dataKey, new Register(_name, _name));
104 }
105
106 // get the register for this disk
107 Register reg = (Register) queueRegisters.get(dataKey);
108
109 // get the packet data
110 double qMax, qSize;
111 try {
112
113 if(maxQueueSize==null || queueSize==null) {
114 throw new NumberFormatException("Queue data invalid");
115 }
116 qMax = Double.parseDouble(maxQueueSize);
117 qSize = Double.parseDouble(queueSize);
118 } catch (NumberFormatException e) {
119 _logger.write(this.toString(), Logger.WARNING, "Received packet from "+source+" with bad queue information: "+e);
120 // don't try to continue and process, try next queue
121 break;
122 }
123
124 boolean useValue = false;
125 try {
126 String option = _cp.getProperty(_name, "Monitor." + _name + ".thresholdMeasure");
127 if (option.equals("VALUE")) {
128 useValue = true;
129 }
130 } catch (PropertyNotFoundException e) {
131 // we default to percentage
132 }
133
134 // this bit determines if the queue check is a % check
135 // or a literal value check
136 double checkValue;
137 String type;
138 if(useValue) {
139 // queue count
140 checkValue = qSize;
141 type = "count";
142 } else {
143 // % of queue
144 checkValue = (qSize / qMax) * 100;
145 type = "%";
146 }
147
148 int newThreshold = checkAttributeThreshold(checkValue, reg);
149
150 // format the checkValue to a String
151 NumberFormat nf = NumberFormat.getInstance();
152 nf.setMaximumFractionDigits(2);
153 nf.setMinimumFractionDigits(2);
154 String strCheckValue = nf.format(checkValue);
155
156 // say which disk had the problem
157 String attributeName = "Size of queue " + type + " in " + queueName + " " + dataKey.substring(dataKey.lastIndexOf('.')+1);
158
159 processAlert(newThreshold, attributeName, reg, SOURCE, strCheckValue);
160
161 }
162 }
163 }
164 }
165
166 /**
167 * Overrides the {@link java.lang.Object#toString() Object.toString()}
168 * method to provide clean logging (every class should have this).
169 *
170 * This uses the uk.org.iscream.cms.util.NameFormat class
171 * to format the toString()
172 *
173 * @return the name of this class and its CVS revision
174 */
175 public String toString() {
176 return FormatName.getName(
177 _name,
178 getClass().getName(),
179 REVISION);
180 }
181
182 /**
183 * return the String representation of what the monitor does
184 */
185 public String getDescription(){
186 return DESC;
187 }
188
189 //---PRIVATE METHODS---
190
191 /**
192 * Checks a piece of current data, and returns the
193 * threshold it breaches, if any.
194 *
195 * @param qSize the size of a queue
196 * @param reg the Register for the host
197 * @return the threshold level breached, if any
198 */
199 private int checkAttributeThreshold(double qSize, Register reg) {
200 for(int thresholdLevel = Alert.thresholdLevels.length - 1; thresholdLevel >= 0; thresholdLevel--) {
201 if (reg.getThreshold(thresholdLevel) != -1.0) {
202 if(((double) reg.getThreshold(thresholdLevel)) < qSize) {
203 return thresholdLevel;
204 }
205 }
206 }
207 return Alert.thresholdNORMAL;
208 }
209
210 //---ACCESSOR/MUTATOR METHODS---
211
212 /**
213 * Returns a reference to a specific Queue for this
214 * monitor. This Queue returns only the data packets
215 * (based on type) that we want too look at.
216 *
217 * @return a reference to a Queue
218 */
219 protected Queue getQueue() {
220 return MonitorManager.getInstance().getOtherQueue();
221 }
222
223
224 //---ATTRIBUTES---
225
226 /**
227 * This is the friendly identifier of the
228 * component this class is running in.
229 * eg, a Filter may be called "filter1",
230 * If this class does not have an owning
231 * component, a name from the configuration
232 * can be placed here. This name could also
233 * be changed to null for utility classes.
234 */
235 private String _name = "Queue";
236
237 /**
238 * A reference to the configuration proxy in use
239 */
240 private ConfigurationProxy _cp = ConfigurationProxy.getInstance();
241
242 /**
243 * A HashMap of Registers (or groups of Registers), one
244 * for each host we're monitoring.
245 */
246 private HashMap _hosts = new HashMap();
247
248 //---STATIC ATTRIBUTES---
249
250 }