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

# 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 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 }