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/Paging__Monitor.java
Revision: 1.1
Committed: Sun Mar 9 21:49:13 2003 UTC (21 years, 2 months ago) by tdb
Branch: MAIN
Log Message:
Added support for all the new stuff that ihost provides us with. Ideally
this lot needs to be revamped some day, but for now this brings it all back
up to date.

The biggest change is in the Disk monitor. It wasn't overly neat before,
so I've tidied that up, and also added support for inode monitoring.

Created the DiskIO, NetIO, and Paging monitors to support new types of data
we now handle. The first two sprung from the Disk monitor, whilst the last
is pretty normal.

Configuration has been updated to support the new monitors, although I
don't really have a feel for thresholds for the new types of data.

File Contents

# User Rev Content
1 tdb 1.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 uk.org.iscream.cms.server.client.*;
27     import uk.org.iscream.cms.server.core.*;
28     import uk.org.iscream.cms.util.*;
29     import uk.org.iscream.cms.server.componentmanager.*;
30    
31     /**
32     * This Monitor watches the Paging activity for all machines
33     *
34     * @author $Author$
35     * @version $Id$
36     */
37     public class Paging__Monitor extends MonitorSkeleton {
38    
39     //---FINAL ATTRIBUTES---
40    
41     /**
42     * The current CVS revision of this class
43     */
44     public final String REVISION = "$Revision: 1.1 $";
45    
46     /**
47     * A description of this monitor
48     */
49     public final String DESC = "Monitors Paging activity.";
50    
51     //---STATIC METHODS---
52    
53     //---CONSTRUCTORS---
54    
55     //---PUBLIC METHODS---
56    
57     /**
58     * Analyse a packet of data, and generate an alert if
59     * necessary.
60     *
61     * @param packet the XMLPacket to analyse
62     */
63     public void analysePacket(XMLPacket packet) {
64    
65     String source = packet.getParam("packet.attributes.machine_name");
66     if (!_hosts.containsKey(source)) {
67     HashMap attributeRegisters = new HashMap();
68     initAttributeRegsiters(source, attributeRegisters);
69     _hosts.put(source, attributeRegisters);
70     }
71    
72     HashMap attributeRegisters = (HashMap) _hosts.get(source);
73     for(int attributeNum = 0; attributeNum < _attributes.length; attributeNum++) {
74     Register reg = (Register) attributeRegisters.get(_attributes[attributeNum]);
75     // find out the threshold level we're at
76     String attribute = _attributes[attributeNum];
77     String attributeName = _attributeNames[attributeNum];
78     String currentValue = packet.getParam(attribute);
79     // find out our new threshold
80     int newThreshold = checkAttributeThreshold(currentValue, reg);
81     // process this data to generate an alert
82     processAlert(newThreshold, attributeName, reg, source, currentValue);
83     }
84    
85     }
86    
87     /**
88     * Overrides the {@link java.lang.Object#toString() Object.toString()}
89     * method to provide clean logging (every class should have this).
90     *
91     * This uses the uk.org.iscream.cms.util.NameFormat class
92     * to format the toString()
93     *
94     * @return the name of this class and its CVS revision
95     */
96     public String toString() {
97     return FormatName.getName(
98     _name,
99     getClass().getName(),
100     REVISION);
101     }
102    
103     /**
104     * return the String representation of what the monitor does
105     */
106     public String getDescription(){
107     return DESC;
108     }
109    
110     //---PRIVATE METHODS---
111    
112     /**
113     * Checks a piece of current data, and returns the
114     * threshold it breaches, if any.
115     *
116     * @param attributeString a String representing the current data value
117     * @param reg the Register for the host
118     * @return the threshold level breached, if any
119     */
120     private int checkAttributeThreshold(String attributeString, Register reg) {
121     for(int thresholdLevel = Alert.thresholdLevels.length - 1; thresholdLevel >= 0; thresholdLevel--) {
122     if (reg.getThreshold(thresholdLevel) != -1.0) {
123     if(attributeString != null) {
124     try {
125     int attribute = Integer.parseInt(attributeString);
126     if (reg.getThreshold(thresholdLevel) < attribute) return thresholdLevel;
127     } catch (NumberFormatException e) {
128     // we got some duff data in the packet, but we shouldn't have
129     _logger.write(toString(), Logger.DEBUG, "possible errenous packet data, should be double value - " + attributeString);
130     }
131     }
132     }
133     }
134     return Alert.thresholdNORMAL;
135     }
136    
137     /**
138     * Initialises a HashMap of Registers with the current list
139     * of attributes. This is only used if we are looking at more
140     * than one distinct attribute.
141     *
142     * @param source the host we are looking at
143     * @param attributeRegisters a HashMap to put the new Registers in
144     */
145     private void initAttributeRegsiters(String source, HashMap attributeRegisters) {
146     for(int attributeNum = 0; attributeNum < _attributes.length; attributeNum++) {
147     String attributeName = _attributes[attributeNum].substring(_attributes[attributeNum].lastIndexOf(".") + 1);
148     attributeRegisters.put(_attributes[attributeNum], new Register(source, _name, attributeName));
149     }
150     }
151    
152     //---ACCESSOR/MUTATOR METHODS---
153    
154     /**
155     * Returns a reference to a specific Queue for this
156     * monitor. This Queue returns only the data packets
157     * (based on type) that we want too look at.
158     *
159     * @return a reference to a Queue
160     */
161     protected Queue getQueue() {
162     return MonitorManager.getInstance().getDataQueue();
163     }
164    
165    
166     //---ATTRIBUTES---
167    
168     /**
169     * This is the friendly identifier of the
170     * component this class is running in.
171     * eg, a Filter may be called "filter1",
172     * If this class does not have an owning
173     * component, a name from the configuration
174     * can be placed here. This name could also
175     * be changed to null for utility classes.
176     */
177     private String _name = "Paging";
178    
179     /**
180     * A HashMap of Registers (or groups of Registers), one
181     * for each host we're monitoring.
182     */
183     private HashMap _hosts = new HashMap();
184    
185     /**
186     * An array of attributes which we will be checking.
187     */
188     private String[] _attributes = { "packet.pages.swapins", "packet.pages.swapouts" };
189    
190     /**
191     * An array of "nice names" for the attributes in _attributes.
192     */
193     private String[] _attributeNames = {"Pages in", "Pages out"};
194    
195     //---STATIC ATTRIBUTES---
196    
197     }