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/Services__Monitor.java
Revision: 1.6
Committed: Sat May 18 18:16:00 2002 UTC (22 years ago) by tdb
Branch: MAIN
Changes since 1.5: +22 -3 lines
Log Message:
i-scream is now licensed under the GPL. I've added the GPL headers to every
source file, and put a full copy of the license in the appropriate places.
I think I've covered everything. This is going to be a mad commit ;)

File Contents

# User Rev Content
1 tdb 1.6 /*
2     * i-scream central monitoring system
3     * Copyright (C) 2000-2002 i-scream
4     *
5     * This program is free software; you can redistribute it and/or
6     * modify it under the terms of the GNU General Public License
7     * as published by the Free Software Foundation; either version 2
8     * of the License, or (at your option) any later version.
9     *
10     * This program is distributed in the hope that it will be useful,
11     * but WITHOUT ANY WARRANTY; without even the implied warranty of
12     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13     * GNU General Public License for more details.
14     *
15     * You should have received a copy of the GNU General Public License
16     * along with this program; if not, write to the Free Software
17     * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18     */
19    
20 ajm 1.1 //---PACKAGE DECLARATION---
21 tdb 1.5 package uk.org.iscream.cms.server.client.monitors;
22 ajm 1.1
23     //---IMPORTS---
24     import java.util.HashMap;
25     import java.util.ArrayList;
26     import java.util.Set;
27     import java.util.Iterator;
28     import java.text.NumberFormat;
29 tdb 1.5 import uk.org.iscream.cms.server.client.*;
30     import uk.org.iscream.cms.server.core.*;
31     import uk.org.iscream.cms.server.util.*;
32     import uk.org.iscream.cms.server.componentmanager.*;
33 ajm 1.1
34     /**
35     * This Monitor watches the Service checks on hosts
36     *
37 tdb 1.6 * @author $Author: tdb $
38     * @version $Id: Services__Monitor.java,v 1.5 2001/05/29 17:02:34 tdb Exp $
39 ajm 1.1 */
40     public class Services__Monitor extends MonitorSkeleton {
41    
42     //---FINAL ATTRIBUTES---
43    
44     /**
45     * The current CVS revision of this class
46     */
47 tdb 1.6 public final String REVISION = "$Revision: 1.5 $";
48 ajm 1.1
49 tdb 1.4 /**
50     * A description of this monitor
51     */
52 ajm 1.1 public final String DESC = "Monitors a hosts services.";
53    
54     //---STATIC METHODS---
55    
56     //---CONSTRUCTORS---
57    
58     //---PUBLIC METHODS---
59 tdb 1.4
60     /**
61     * Analyse a packet of data, and generate an alert if
62     * necessary.
63     *
64     * @param packet the XMLPacket to analyse
65     */
66 ajm 1.1 public void analysePacket(XMLPacket packet) {
67 ajm 1.3 String source = packet.getParam("packet.attributes.machine_name");
68     if (!_hosts.containsKey(source)) {
69     _hosts.put(source, new HashMap());
70     }
71    
72     HashMap serviceRegisters = (HashMap) _hosts.get(source);
73    
74     // a tempory holder for all the disk attributes we find
75     ArrayList services = new ArrayList();
76 tdb 1.4
77     // the prefix for keys relating to service checks
78     String keyPrefix = "packet.services.";
79    
80 ajm 1.3 // unfortunatly we need to check the whole packet
81     // to find the disks, and then get the data attributes
82     Set packetSet = packet.getSet();
83     Iterator i = packetSet.iterator();
84     while (i.hasNext()) {
85     String dataKey = (String) i.next();
86 tdb 1.4 if(dataKey.startsWith(keyPrefix)) {
87 ajm 1.3 if(!services.contains(dataKey)) {
88     String serviceType = "";
89 tdb 1.4
90 ajm 1.3 // pos is after "packet.services."
91 tdb 1.4 int pos = keyPrefix.length();
92 ajm 1.3 while (dataKey.charAt(pos) != '.') {
93     serviceType = serviceType + dataKey.charAt(pos);
94     pos++;
95     }
96 tdb 1.4
97     // add the service to our list, with the packet data
98     services.add(keyPrefix + serviceType + ".attributes.status");
99     String status = packet.getParam(keyPrefix + serviceType + ".attributes.status");
100    
101     services.add(keyPrefix + serviceType + ".attributes.message");
102     String message = packet.getParam(keyPrefix + serviceType + ".attributes.message");
103    
104 ajm 1.3 // *** now process this service ***
105 tdb 1.4
106 ajm 1.3 // check if we've seen this service before on a previous run
107     // if not, we need to create a register for it
108     if(!serviceRegisters.containsKey(serviceType)) {
109     serviceRegisters.put(serviceType, new Register(source, _name));
110     }
111 tdb 1.4
112 ajm 1.3 // get the register for this service
113     Register reg = (Register) serviceRegisters.get(serviceType);
114 tdb 1.4
115    
116 ajm 1.3 // as we don't really have a threshold for services,
117     // a temporary fix is to use the status value as a threshold.
118     // after all, a 0 status is a NORMAL threshold ;)
119     int newThreshold = 0;
120     try {
121     newThreshold = Integer.parseInt(status);
122     } catch (NumberFormatException e) {
123     _logger.write(this.toString(), Logger.WARNING, "Received heartbeat from "+source+" with bad service information: "+e);
124     // don't try to continue and go try the next service
125     break;
126     }
127 tdb 1.4
128 ajm 1.3 // say which service it was
129     String attributeName = serviceType + " service";
130     String displayValue = "";
131     if (newThreshold == 0) {
132     displayValue = "RUNNING";
133     } else {
134     displayValue = "FAILED";
135 ajm 1.1 }
136 tdb 1.4
137 ajm 1.3 processAlert(newThreshold, attributeName, reg, source, displayValue);
138 ajm 1.1 }
139     }
140     }
141     }
142    
143     /**
144     * Overrides the {@link java.lang.Object#toString() Object.toString()}
145     * method to provide clean logging (every class should have this).
146     *
147 tdb 1.5 * This uses the uk.org.iscream.cms.server.util.NameFormat class
148 ajm 1.1 * to format the toString()
149     *
150     * @return the name of this class and its CVS revision
151     */
152     public String toString() {
153     return FormatName.getName(
154     _name,
155     getClass().getName(),
156     REVISION);
157     }
158    
159     /**
160     * return the String representation of what the monitor does
161     */
162     public String getDescription(){
163     return DESC;
164     }
165    
166     //---PRIVATE METHODS---
167    
168     //---ACCESSOR/MUTATOR METHODS---
169 tdb 1.4
170     /**
171     * Returns a reference to a specific Queue for this
172     * monitor. This Queue returns only the data packets
173     * (based on type) that we want too look at.
174     *
175     * @return a reference to a Queue
176     */
177 ajm 1.3 protected Queue getQueue() {
178     return MonitorManager.getInstance().getHeartbeatQueue();
179     }
180 ajm 1.1
181     //---ATTRIBUTES---
182    
183     /**
184     * This is the friendly identifier of the
185     * component this class is running in.
186     * eg, a Filter may be called "filter1",
187     * If this class does not have an owning
188     * component, a name from the configuration
189     * can be placed here. This name could also
190     * be changed to null for utility classes.
191     */
192     private String _name = "Services";
193    
194     /**
195 tdb 1.4 * A HashMap of Registers (or groups of Registers), one
196     * for each host we're monitoring.
197 ajm 1.1 */
198     private HashMap _hosts = new HashMap();
199    
200     //---STATIC ATTRIBUTES---
201    
202     }