org.hyperic.hq.plugin.system.OtherUnixCollector.java Source code

Java tutorial

Introduction

Here is the source code for org.hyperic.hq.plugin.system.OtherUnixCollector.java

Source

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package org.hyperic.hq.plugin.system;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hyperic.hq.product.Collector;

/**
 *
 * @author glaullon
 */
public class OtherUnixCollector extends Collector {

    private static final Log log = LogFactory.getLog(OtherUnixCollector.class);
    private static final String VMSTAT[] = { "vmstat", "-s" };
    private static final String METRICS[][] = { { "pgfault", "minor (as) faults" },
            { "pgmajfault", "major faults" }, // Solaris
            { "pgfault", "total address trans. faults" }, { "pgmajfault", "executable filled pages faults" }, // AIX
            { "pgfault", "total address trans. faults taken" }, { "pgmajfault", "executable fill page faults" }, // HPUX

    };

    @Override
    public void collect() {
        log.info("[collect]");
        Process cmd;
        try {
            cmd = Runtime.getRuntime().exec(VMSTAT);
            cmd.waitFor();
            if (cmd.exitValue() != 0) {
                String msg = inputStreamAsString(cmd.getErrorStream());
                log.info("[collect] cmd error: " + msg);
                setErrorMessage(msg);
            } else {
                Map<String, Double> stats = parseVMStat(cmd.getInputStream());
                for (String[] metric : METRICS) {
                    final Double val = stats.get(metric[1]);
                    log.info("[collect] " + metric[0] + "=" + val);
                    if (val != null) {
                        setValue(metric[0], val);
                    }
                }
            }
        } catch (IOException e) {
            log.info("[collect] error: " + e.getMessage(), e);
            setErrorMessage(e.getLocalizedMessage(), e);
        } catch (InterruptedException e) {
            log.info("[collect] error: " + e.getMessage(), e);
            setErrorMessage(e.getLocalizedMessage(), e);
        }
    }

    static final Map<String, Double> parseVMStat(InputStream stream) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(stream));
        Map<String, Double> res = new HashMap<String, Double>();
        try {
            String line;
            while ((line = br.readLine()) != null) {
                line = line.trim();
                int sep = line.indexOf(" ");
                log.info("[parseVMStat] line='" + line + "' (" + sep + ")");
                if (sep > 0) {
                    String key = line.substring(sep).trim();
                    String val = line.substring(0, sep).trim();
                    log.info("[parseVMStat] " + key + " = " + val);
                    res.put(key, Double.parseDouble(val));
                }
            }
        } finally {
            br.close();
        }
        return res;
    }

    static final String inputStreamAsString(InputStream stream) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(stream));
        StringBuilder sb = new StringBuilder();
        try {
            String line;
            while ((line = br.readLine()) != null) {
                sb.append(line).append("\n");
            }
        } finally {
            br.close();
        }
        return sb.toString();
    }
}