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.17
Committed: Thu Jan 15 13:41:48 2004 UTC (20 years, 4 months ago) by tdb
Branch: MAIN
Changes since 1.16: +5 -2 lines
Log Message:
Assuming I can still program in Java, these changes allow monitoring to
be disabled at a per-host level or a per-host-per-monitor level.

File Contents

# User Rev Content
1 tdb 1.14 /*
2     * i-scream central monitoring system
3 tdb 1.15 * http://www.i-scream.org.uk
4 tdb 1.14 * 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 ajm 1.1 //---PACKAGE DECLARATION---
22 tdb 1.13 package uk.org.iscream.cms.server.client.monitors;
23 ajm 1.1
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 tdb 1.13 import uk.org.iscream.cms.server.client.*;
31     import uk.org.iscream.cms.server.core.*;
32 tdb 1.16 import uk.org.iscream.cms.util.*;
33 tdb 1.13 import uk.org.iscream.cms.server.componentmanager.*;
34 ajm 1.1
35     /**
36     * This Monitor watches the internal server queues.
37     * YES! this system is SO great it monitors itself!
38     *
39 tdb 1.14 * @author $Author: tdb $
40 tdb 1.17 * @version $Id: Queue__Monitor.java,v 1.16 2003/02/05 16:43:46 tdb Exp $
41 ajm 1.1 */
42     public class Queue__Monitor extends MonitorSkeleton {
43    
44     //---FINAL ATTRIBUTES---
45    
46     /**
47     * The current CVS revision of this class
48     */
49 tdb 1.17 public final String REVISION = "$Revision: 1.16 $";
50 ajm 1.1
51 tdb 1.8 /**
52     * A description of this monitor
53     */
54 ajm 1.1 public final String DESC = "Who watches the watchmen?";
55    
56 tdb 1.6 private final String SOURCE = "i-scream-server";
57    
58 ajm 1.1 //---STATIC METHODS---
59    
60     //---CONSTRUCTORS---
61    
62     //---PUBLIC METHODS---
63 tdb 1.8
64     /**
65     * Analyse a packet of data, and generate an alert if
66     * necessary.
67     *
68     * @param packet the XMLPacket to analyse
69     */
70 ajm 1.1 public void analysePacket(XMLPacket packet) {
71 tdb 1.17 if(!checkBooleanConfig("Queue", "Monitor." + _name + ".enable")) {
72     return;
73     }
74 tdb 1.3 if (packet.getParam("packet.attributes.type").equals("queueStat")) {
75     String source = packet.getParam("packet.attributes.hashCode");
76 ajm 1.1 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 ajm 1.2 String queueSize = packet.getParam(dataKey);
94 tdb 1.12
95     // silently ignore these
96     // they're generated by the queueMonitor for deleted queues
97     if(queueSize.equals("[deleted]")) {
98     break;
99     }
100 ajm 1.1
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 tdb 1.10 queueRegisters.put(dataKey, new Register(_name, _name));
107 ajm 1.1 }
108    
109     // get the register for this disk
110 ajm 1.2 Register reg = (Register) queueRegisters.get(dataKey);
111 ajm 1.1
112     // get the packet data
113 ajm 1.2 double qMax, qSize;
114 ajm 1.1 try {
115    
116 ajm 1.2 if(maxQueueSize==null || queueSize==null) {
117 ajm 1.1 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 tdb 1.9 String option = _cp.getProperty(_name, "Monitor." + _name + ".thresholdMeasure");
130 ajm 1.1 if (option.equals("VALUE")) {
131     useValue = true;
132     }
133     } catch (PropertyNotFoundException e) {
134     // we default to percentage
135     }
136    
137 tdb 1.12 // this bit determines if the queue check is a % check
138     // or a literal value check
139 ajm 1.1 double checkValue;
140     String type;
141     if(useValue) {
142 ajm 1.7 // queue count
143 ajm 1.1 checkValue = qSize;
144     type = "count";
145     } else {
146 ajm 1.7 // % of queue
147 ajm 1.1 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 tdb 1.11 String attributeName = "Size of queue " + type + " in " + queueName + " " + dataKey.substring(dataKey.lastIndexOf('.')+1);
161 ajm 1.1
162 tdb 1.6 processAlert(newThreshold, attributeName, reg, SOURCE, strCheckValue);
163 ajm 1.1
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 tdb 1.16 * This uses the uk.org.iscream.cms.util.NameFormat class
174 ajm 1.1 * 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 tdb 1.8
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 ajm 1.1 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 tdb 1.8
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 ajm 1.4 protected Queue getQueue() {
223     return MonitorManager.getInstance().getOtherQueue();
224     }
225    
226 ajm 1.1
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 tdb 1.8
245     /**
246     * A HashMap of Registers (or groups of Registers), one
247     * for each host we're monitoring.
248     */
249 ajm 1.1 private HashMap _hosts = new HashMap();
250    
251     //---STATIC ATTRIBUTES---
252    
253     }