通过TelnetClient获取Zookeeper监控数据

如果想编写一个监控Zookeeper的Java程序,可以通过两种方式 :

(1)通过TelnetClient发送命令 ,命令的详解参考:#sc_zkCommands

(2)通过JMX,说明请参考:

本文通过一个简单的例子来演示如何通过TelnetClient发送mntr命令获取Zookeeper的监控数据

写一个Telnet的工具类

package com.eric.agent.utils;
import org.apache.commons.net.telnet.TelnetClient;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintStream;
/**
 * Telnet操作器,基于commons-net-2.2.jar
 *
 * @author aihua.sun
 * @date 2015/4/9
 * @since V1.0
 */
public class TelnetTools {
    private String prompt = ">"; //结束标识字符串,Windows中是>,Linux中是#
    private char promptChar = '>';  //结束标识字符
    private TelnetClient telnet;
    private InputStream in;    // 输入流,接收返回信息
    private PrintStream out;    // 向服务器写入 命令
    /**
    * @param termtype 协议类型:VT100、VT52、VT220、VTNT、ANSI
    * @param prompt  结果结束标识
    */
    public TelnetTools(String termtype, String prompt) {
        telnet = new TelnetClient(termtype);
        setPrompt(prompt);
    }
    public TelnetTools(String termtype) {
        telnet = new TelnetClient(termtype);
    }
    public TelnetTools() {
        telnet = new TelnetClient();
    }
    /**
    * 登录到目标主机
    *
    * @param ip
    * @param port
    */
    public void login(String ip, int port) {
        try {
            telnet.connect(ip, port);
            in = telnet.getInputStream();
            out = new PrintStream(telnet.getOutputStream());
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
    /**
    * 读取分析结果
    *
    * @param pattern 匹配到该字符串时返回结果
    * @return
    */
    public String readUntil(String pattern) {
        StringBuffer sb = new StringBuffer();
        try {
            char lastChar = (char) -1;
            boolean flag = pattern != null && pattern.length() > 0;
            if (flag)
                lastChar = pattern.charAt(pattern.length() - 1);
            char ch;
            int code = -1;
            while ((code = in.read()) != -1) {
                ch = (char) code;
                sb.append(ch);
                //匹配到结束标识时返回结果
                if (flag) {
                    if (ch == lastChar && sb.toString().endsWith(pattern)) {
                        return sb.toString();
                    }
                } else {
                    //如果没指定结束标识,匹配到默认结束标识字符时返回结果
                    if (ch == promptChar)
                        return sb.toString();
                }
                //登录失败时返回结果
                if (sb.toString().contains("Login Failed")) {
                    return sb.toString();
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return sb.toString();
    }
    /**
    * 发送命令
    *
    * @param value
    */
    public void write(String value) {
        try {
            out.println(value);
            out.flush();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
    * 发送命令,返回执行结果
    *
    * @param command
    * @return
    */
    public String sendCommand(String command) {
        try {
            write(command);
            return readUntil(prompt);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    /**
    * 关闭连接
    */
    public void distinct() {
        try {
            if (telnet != null && !telnet.isConnected())
                telnet.disconnect();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public void setPrompt(String prompt) {
        if (prompt != null) {
            this.prompt = prompt;
            this.promptChar = prompt.charAt(prompt.length() - 1);
        }
    }
}

调用类

package com.tscloud.agent.flume.source.dataprovider;

/**
 * 通过HTTP作为HDFS Master监控信息的source
 * 明细可参考
 * @author aihua.sun
 * @date 2015/4/6
 * @since V1.0
 */

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/991f8042ac5151dde4afc038b26f21a2.html