org.hyperic.hq.plugin.apache.JkStatusCollector.java Source code

Java tutorial

Introduction

Here is the source code for org.hyperic.hq.plugin.apache.JkStatusCollector.java

Source

/*
 * 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);
            }
        }
    }
}