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.18
Committed: Sun Aug 1 10:40:45 2004 UTC (19 years, 9 months ago) by tdb
Branch: MAIN
CVS Tags: HEAD
Changes since 1.17: +3 -3 lines
Error occurred while calculating annotation data.
Log Message:
Catch a lot of old URL's and update them. Also remove a couple of old files
that aren't used.

File Contents

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