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/Process__Monitor.java
Revision: 1.6
Committed: Tue May 21 16:47:16 2002 UTC (22 years ago) by tdb
Branch: MAIN
Changes since 1.5: +3 -2 lines
Log Message:
Added URL to GPL headers.

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.server.util.*;
29 import uk.org.iscream.cms.server.componentmanager.*;
30
31 /**
32 * This Monitor watches the Process Counts for all machines
33 *
34 * @author $Author: tdb $
35 * @version $Id: Process__Monitor.java,v 1.5 2002/05/18 18:16:00 tdb Exp $
36 */
37 public class Process__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.5 $";
45
46 /**
47 * A description of this monitor
48 */
49 public final String DESC = "Monitors Process Counts.";
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 int newThreshold = checkAttributeThreshold(currentValue, reg);
80 processAlert(newThreshold, attributeName, reg, source, currentValue);
81 }
82 }
83
84 /**
85 * Overrides the {@link java.lang.Object#toString() Object.toString()}
86 * method to provide clean logging (every class should have this).
87 *
88 * This uses the uk.org.iscream.cms.server.util.NameFormat class
89 * to format the toString()
90 *
91 * @return the name of this class and its CVS revision
92 */
93 public String toString() {
94 return FormatName.getName(
95 _name,
96 getClass().getName(),
97 REVISION);
98 }
99
100 /**
101 * return the String representation of what the monitor does
102 */
103 public String getDescription(){
104 return DESC;
105 }
106
107 //---PRIVATE METHODS---
108
109 /**
110 * Checks a piece of current data, and returns the
111 * threshold it breaches, if any.
112 *
113 * @param attributeString a String representing the current data value
114 * @param reg the Register for the host
115 * @return the threshold level breached, if any
116 */
117 private int checkAttributeThreshold(String attributeString, Register reg) {
118 for(int thresholdLevel = Alert.thresholdLevels.length - 1; thresholdLevel >= 0; thresholdLevel--) {
119 if (reg.getThreshold(thresholdLevel) != -1.0) {
120 if(attributeString != null) {
121 try {
122 double attribute = Double.parseDouble(attributeString);
123 if (reg.getThreshold(thresholdLevel) < attribute) return thresholdLevel;
124 } catch (NumberFormatException e) {
125 // we got some duff data in the packet, but we shouldn't have
126 _logger.write(toString(), Logger.DEBUG, "possible errenous packet data, should be double value - " + attributeString);
127 }
128 }
129 }
130 }
131 return Alert.thresholdNORMAL;
132 }
133
134 /**
135 * Initialises a HashMap of Registers with the current list
136 * of attributes. This is only used if we are looking at more
137 * than one distinct attribute.
138 *
139 * @param source the host we are looking at
140 * @param attributeRegisters a HashMap to put the new Registers in
141 */
142 private void initAttributeRegsiters(String source, HashMap attributeRegisters) {
143 for(int attributeNum = 0; attributeNum < _attributes.length; attributeNum++) {
144 String attributeName = _attributes[attributeNum].substring(_attributes[attributeNum].lastIndexOf(".") + 1);
145 attributeRegisters.put(_attributes[attributeNum], new Register(source, _name, attributeName));
146 }
147 }
148
149 //---ACCESSOR/MUTATOR METHODS---
150
151 /**
152 * Returns a reference to a specific Queue for this
153 * monitor. This Queue returns only the data packets
154 * (based on type) that we want too look at.
155 *
156 * @return a reference to a Queue
157 */
158 protected Queue getQueue() {
159 return MonitorManager.getInstance().getDataQueue();
160 }
161
162 //---ATTRIBUTES---
163
164 /**
165 * This is the friendly identifier of the
166 * component this class is running in.
167 * eg, a Filter may be called "filter1",
168 * If this class does not have an owning
169 * component, a name from the configuration
170 * can be placed here. This name could also
171 * be changed to null for utility classes.
172 */
173 private String _name = "Process";
174
175 /**
176 * A HashMap of Registers (or groups of Registers), one
177 * for each host we're monitoring.
178 */
179 private HashMap _hosts = new HashMap();
180
181 /**
182 * An array of attributes which we will be checking.
183 */
184 private String[] _attributes = { "packet.processes.total", "packet.processes.cpu", "packet.processes.sleeping", "packet.processes.stopped", "packet.processes.zombie" };
185
186 /**
187 * An array of "nice names" for the attributes in _attributes.
188 */
189 private String[] _attributeNames = {"Total Processes", "on CPU Processes", "Sleeping Processes", "Stopped Processes", "Zombie Processes"};
190
191 //---STATIC ATTRIBUTES---
192
193 }