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

# 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.16 * @version $Id: Queue__Monitor.java,v 1.15 2002/05/21 16:47:16 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.16 public final String REVISION = "$Revision: 1.15 $";
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.3 if (packet.getParam("packet.attributes.type").equals("queueStat")) {
72     String source = packet.getParam("packet.attributes.hashCode");
73 ajm 1.1 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 ajm 1.2 String queueSize = packet.getParam(dataKey);
91 tdb 1.12
92     // silently ignore these
93     // they're generated by the queueMonitor for deleted queues
94     if(queueSize.equals("[deleted]")) {
95     break;
96     }
97 ajm 1.1
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 tdb 1.10 queueRegisters.put(dataKey, new Register(_name, _name));
104 ajm 1.1 }
105    
106     // get the register for this disk
107 ajm 1.2 Register reg = (Register) queueRegisters.get(dataKey);
108 ajm 1.1
109     // get the packet data
110 ajm 1.2 double qMax, qSize;
111 ajm 1.1 try {
112    
113 ajm 1.2 if(maxQueueSize==null || queueSize==null) {
114 ajm 1.1 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 tdb 1.9 String option = _cp.getProperty(_name, "Monitor." + _name + ".thresholdMeasure");
127 ajm 1.1 if (option.equals("VALUE")) {
128     useValue = true;
129     }
130     } catch (PropertyNotFoundException e) {
131     // we default to percentage
132     }
133    
134 tdb 1.12 // this bit determines if the queue check is a % check
135     // or a literal value check
136 ajm 1.1 double checkValue;
137     String type;
138     if(useValue) {
139 ajm 1.7 // queue count
140 ajm 1.1 checkValue = qSize;
141     type = "count";
142     } else {
143 ajm 1.7 // % of queue
144 ajm 1.1 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 tdb 1.11 String attributeName = "Size of queue " + type + " in " + queueName + " " + dataKey.substring(dataKey.lastIndexOf('.')+1);
158 ajm 1.1
159 tdb 1.6 processAlert(newThreshold, attributeName, reg, SOURCE, strCheckValue);
160 ajm 1.1
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 tdb 1.16 * This uses the uk.org.iscream.cms.util.NameFormat class
171 ajm 1.1 * 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 tdb 1.8
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 ajm 1.1 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 tdb 1.8
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 ajm 1.4 protected Queue getQueue() {
220     return MonitorManager.getInstance().getOtherQueue();
221     }
222    
223 ajm 1.1
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 tdb 1.8
242     /**
243     * A HashMap of Registers (or groups of Registers), one
244     * for each host we're monitoring.
245     */
246 ajm 1.1 private HashMap _hosts = new HashMap();
247    
248     //---STATIC ATTRIBUTES---
249    
250     }