package com.taobao.metamorphosis.tools.shell;
import java.io.IOException;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.util.Properties;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.Option;
import org.apache.commons.cli.Options;
import org.apache.commons.lang.StringUtils;
import com.taobao.metamorphosis.client.MetaClientConfig;
import com.taobao.metamorphosis.client.MetaMessageSessionFactory;
import com.taobao.metamorphosis.network.BooleanCommand;
import com.taobao.metamorphosis.network.StatsCommand;
import com.taobao.metamorphosis.tools.utils.CommandLineUtils;
import com.taobao.metamorphosis.tools.utils.StringUtil;
import com.taobao.metamorphosis.utils.ResourceUtils;
import com.taobao.metamorphosis.utils.ZkUtils.ZKConfig;
/**
* Usage: stats -config configFilePath -item item
*
* @author apple
*
*/
public class BrokerStatsTool extends ShellTool {
public BrokerStatsTool(PrintStream out) {
super(out);
}
public static void main(String[] args) throws Exception {
new BrokerStatsTool(System.out).doMain(args);
}
public BrokerStatsTool(PrintWriter out) {
super(out);
}
@Override
public void doMain(String[] args) throws Exception {
CommandLine commandLine = getCommandLine(args);
String item = commandLine.getOptionValue("item", null);
String configFile = commandLine.getOptionValue("config");
Properties props = ResourceUtils.getResourceAsProperties(configFile);
MetaClientConfig metaClientConfig = new MetaClientConfig();
String host = props.getProperty("hostName");
if (StringUtils.isBlank(host)) {
host = "localhost";
}
String serverUrl = "meta://" + host + ":" + props.getProperty("serverPort");
metaClientConfig.setServerUrl(serverUrl);
metaClientConfig.setZkConfig(initZkConfig(props));
MetaMessageSessionFactory sessionFactory = new MetaMessageSessionFactory(metaClientConfig);
sessionFactory.getRemotingClient().connect(serverUrl);
sessionFactory.getRemotingClient().awaitReadyInterrupt(serverUrl);
BooleanCommand resp =
(BooleanCommand) sessionFactory.getRemotingClient().invokeToGroup(serverUrl, new StatsCommand(0, item));
if (resp != null) {
System.out.println(resp.getErrorMsg());
}
sessionFactory.shutdown();
}
private static ZKConfig initZkConfig(Properties serverProperties) throws IOException {
final String zkConnect = serverProperties.getProperty("zk.zkConnect");
final String zkRoot = serverProperties.getProperty("zk.zkRoot");
if (!StringUtil.empty(zkConnect)) {
final int zkSessionTimeoutMs = Integer.parseInt(serverProperties.getProperty("zk.zkSessionTimeoutMs"));
final int zkConnectionTimeoutMs =
Integer.parseInt(serverProperties.getProperty("zk.zkConnectionTimeoutMs"));
final int zkSyncTimeMs = Integer.parseInt(serverProperties.getProperty("zk.zkSyncTimeMs"));
return setZkRoot(new ZKConfig(zkConnect, zkSessionTimeoutMs, zkConnectionTimeoutMs, zkSyncTimeMs), zkRoot);
}
else {
return null;
}
}
private static ZKConfig setZkRoot(final ZKConfig zkConfig2, final String zkRoot) {
if (StringUtils.isNotBlank(zkRoot)) {
zkConfig2.zkRoot = zkRoot;
}
return zkConfig2;
}
private CommandLine getCommandLine(String[] args) {
Option itemOpt = new Option("item", true, "stats item");
itemOpt.setRequired(false);
Option configOpt = new Option("config", true, "start partition num");
configOpt.setRequired(true);
return CommandLineUtils.parseCmdLine(args, new Options().addOption(itemOpt).addOption(configOpt));
}
}