/*
* NOTE: This copyright does *not* cover user programs that use HQ
* program services by normal system calls through the application
* program interfaces provided as part of the Hyperic Plug-in Development
* Kit or the Hyperic Client Development Kit - this is merely considered
* normal use of the program, and does *not* fall under the heading of
* "derived work".
*
* Copyright (C) [2004, 2005, 2006], Hyperic, Inc.
* This file is part of HQ.
*
* HQ is free software; you can redistribute it and/or modify
* it under the terms version 2 of the GNU General Public License as
* published by the Free Software Foundation. This program is distributed
* in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. See the GNU General Public License for more
* details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
* USA.
*/
package org.hyperic.hq.plugin.apache;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.http.HttpResponse;
import org.hyperic.hq.plugin.netservices.HTTPCollector;
import org.hyperic.hq.product.Metric;
import org.hyperic.hq.product.PluginException;
public class JkStatusCollector extends HTTPCollector
{
private static final Log log =
LogFactory.getLog(JkStatusCollector.class.getName());
private static final String MIME_FLAG = "?mime=prop";
static final String JK_NAME = "mod_jk";
static final String WORKER_NAME = JK_NAME + " Worker";
static final String[] WORKER_PROPS = {
//type=ajp13 (cprops)
"host", "address",
};
private static final Map _filter = new HashMap();
private static final Map _state = new HashMap();
private Set _lbs = new HashSet();
private Set _workers = new HashSet();
private static void initConstants()
{
if (_filter.size() != 0) {
return;
}
String[] keys = {
//type=lb
"member_count", "good", "degraded", "bad", "busy",
//type=ajp13 (metrics)
"state", "errors", "client_errors", "transferred", "read", "busy"
};
for (int i=0; i<keys.length; i++) {
_filter.put(keys[i], Boolean.TRUE);
}
for (int i=0; i<WORKER_PROPS.length; i++) {
_filter.put(WORKER_PROPS[i], Boolean.TRUE);
}
_state.put("OK", new Double(Metric.AVAIL_UP));
_state.put("N/A", new Double(Metric.AVAIL_PAUSED));
_state.put("REC", new Double(Metric.AVAIL_WARN));
_state.put("ERR", new Double(Metric.AVAIL_DOWN));
}
protected void init() throws PluginException
{
super.init();
setMethod(METHOD_GET);
String url = getURL();
if (!url.endsWith(MIME_FLAG))
setURL(url + MIME_FLAG);
initConstants();
}
protected void parseResults(HttpResponse response)
{
try {
parse(response);
}
catch (IOException e) {
log.error("Exception parsing: " + getURL(), e);
}
}
Set getLoadBalancers() {
return _lbs;
}
Set getWorkers() {
return _workers;
}
private void parse(HttpResponse response) throws IOException
{
_lbs.clear();
_workers.clear();
InputStream is = response.getEntity().getContent();
String line;
BufferedReader bf = new BufferedReader(new InputStreamReader(is));
final String prefix = "worker.";
String prevKey = null;
while (null != (line = bf.readLine())) {
int ix = line.indexOf('=');
if (ix == -1) {
continue;
}
String worker = line.substring(0, ix);
String val = line.substring(ix+1);
if (!worker.startsWith(prefix)) {
continue;
}
worker = worker.substring(prefix.length());
if ((ix = worker.indexOf('.')) == -1) {
continue;
}
String name = worker.substring(0, ix);
String key = worker.substring(ix+1);
if (key.equals("type")) {
if (val.equals("lb")) {
_lbs.add(name);
}
else if (val.startsWith("ajp")) {
if ("balance_workers".equals(prevKey)) {
_workers.add(name);
}
}
continue;
}
prevKey = key;
if (_filter.get(key) != Boolean.TRUE) {
continue;
}
if (key.equals("state")) {
Double state = (Double)_state.get(val);
double avail;
if (state == null) {
avail = Metric.AVAIL_UP;
}
else {
avail = state.doubleValue();
}
setValue(worker, avail);
}
else {
setValue(worker, val);
}
}
}
}