• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
导航菜单
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • windows
  • 服务器硬件
  • 服务器运维
  • 云计算
  • 虚拟化
  • IIS教程
  • Linux
  • Apache
  • Ftp
  • DNS
  • Nginx
您的位置:首页 > 服务器 >云计算 > 通过TelnetClient获取Zookeeper监控数据,zookeeperclient

通过TelnetClient获取Zookeeper监控数据,zookeeperclient

作者:网友 字体:[增加 减小] 来源:互联网

本文主要包含telnetclient,java telnetclient,zookeeper client,zookeeper数据结构,zookeeper数据迁移等服务器相关知识,网友希望可以进行参考

通过TelnetClient获取Zookeeper监控数据,zookeeperclient


如果想编写一个监控Zookeeper的Java程序,可以通过两种方式 : (1)通过TelnetClient发送命令 ,命令的详解参考:http://zookeeper.apache.org/doc/trunk/zookeeperAdmin.html#sc_zkCommands (2)通过JMX,说明请参考:http://zookeeper.apache.org/doc/trunk/zookeeperJMX.html
本文通过一个简单的例子来演示如何通过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
 * 明细可参考http://zookeeper.apache.org/doc/r3.4.6/zookeeperAdmin.html#sc_zkCommands
 * @author aihua.sun
 * @date 2015/4/6
 * @since V1.0
 */

import com.eric.agent.flume.model.ZookeeperRoleInfo;
import com.eric.agent.flume.source.base.IClusterServiceRoleDataProvider;
import com.eric.agent.utils.AgentConstants;
import com.eric.agent.utils.TelnetTools;
import com.eric.common.utils.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.UnsupportedEncodingException;
import java.util.*;

public class ZookeeperDataProvider{
    protected final Logger LOGGER = LoggerFactory.getLogger(getClass());
    private static final String zk_avg_latency = "zk_avg_latency";
    private static final String zk_max_latency = "zk_max_latency";
    private static final String zk_min_latency = "zk_min_latency";
    private static final String zk_packets_received = "zk_packets_received";
    private static final String zk_packets_sent = "zk_packets_sent";
    private static final String zk_server_state = "zk_server_state";
    private static final String zk_znode_count = "zk_znode_count";
    private static final String zk_followers = "zk_followers";
    private static final String zk_open_file_descriptor_count = "zk_open_file_descriptor_count";

    public String extractMonitorData() {
        //TODO 通过调用API获得IP以及参数
        ZookeeperRoleInfo monitorDataPoint = new ZookeeperRoleInfo();
        String IP = "192.168.40.242";
        int port = 2181;
        TelnetTools telnet=null;
        try {
            telnet = new TelnetTools();
            telnet.login(IP, port);
            String rs = telnet.sendCommand("mntr");
            Map<String, String> telnetResultMap = parseTelnetResult(rs);
            monitorDataPoint.setZkAvgLatency(translateStrToLong(telnetResultMap.get(zk_avg_latency)));
            monitorDataPoint.setZkMaxLatency(translateStrToLong(telnetResultMap.get(zk_max_latency)));
            monitorDataPoint.setZkMinLatency(translateStrToLong(telnetResultMap.get(zk_min_latency)));
            monitorDataPoint.setZkPacketsReceived(translateStrToLong(telnetResultMap.get(zk_packets_received)));
            monitorDataPoint.setZkPacketsSent(translateStrToLong(telnetResultMap.get(zk_packets_sent)));
            monitorDataPoint.setZkServerState(telnetResultMap.get(zk_server_state));
            monitorDataPoint.setZkZnodeCount(translateStrToLong(telnetResultMap.get(zk_znode_count)));
            monitorDataPoint.setZkFollowers(translateStrToLong(telnetResultMap.get(zk_followers)));
            monitorDataPoint.setZkOpenFileDescriptorCount(translateStrToLong(telnetResultMap.get(zk_open_file_descriptor_count)));
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            telnet.distinct();
        }

        return monitorDataPoint.toString();
    }

    private Long translateStrToLong(String value) {
        if (org.apache.commons.lang.StringUtils.isAlphanumeric(value)) {
            return Long.valueOf(value);
        }
        return 0L;
    }

    private Map<String, String> parseTelnetResult(String rs) {
        //The output contains multiple lines with the following format:
        //key \t value
        String[] resultArray = rs.split("\n");
        Map<String, String> resultMap = new HashMap<String, String>();
        for (String recordLine : resultArray) {
            String[] recordKeyValue = recordLine.split("\t");
            LOGGER.debug("############recor
  


 
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 通过TelnetClient获取Zookeeper监控数据,zookeeperclient

相关文章

  • Hbase shell操作(完整版记录),hbaseshell
  • Spark Streaming和Flume集成指南V1.4.1,flumev1.4.1
  • Openstack中为虚拟机使用CDROM光驱设备,openstackcdrom
  • MyEclipse字体和保护色设置,myeclipse保护色
  • JS中split用法和数组中元素的删除,jssplit
  • Spark调研笔记第3篇,spark调研第3篇
  • Hadoop之——HBase笔记,hadoophbase
  • MapReduce编程之倒排索引,mapreduce编程索引
  • 《1》CentOS7.0+OpenStack+kvm云平台部署—基础配置,centos7.0kvm
  • 几本京东上的CISCO云计算相关书籍,cisco相关书籍

文章分类

  • windows
  • 服务器硬件
  • 服务器运维
  • 云计算
  • 虚拟化
  • IIS教程
  • Linux
  • Apache
  • Ftp
  • DNS
  • Nginx

最近更新的内容

    • 机器学习-组合算法总结,机器组合算法总结
    • hive 报错/tmp/hive on HDFS should be writable. Current permissions are: rwx--x--x,hdfswritable
    • 联想台式机启天m4350 启用intel vt-x,m4350vt-x
    • SSH无密码登陆配置,ssh无密码登陆
    • Hadoop学习笔记0005——centos下运行Hadoop实例,centoshadoop
    • apache hadoop-2.6.0-CDH5.4.1 安装笔记,hadoop2.6.0安装
    • 机器学习-模型评估与选择
    • Hadoop之——搭建ZooKeeper服务器集群,hadoopzookeeper
    • Spark中配置Parquet参数,sparkparquet参数
    • Hive之简单查询不启用MapReduce,hive启用mapreduce

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有