简单提一下opentsdb源代码的获取方式:
在官网上可以下载source code,然后根据网上的教程,将这个源代码变成eclipse项目,方便咱们调试。具体的教程搜一下百度就有,我这里就不赘述了,我就是按照网上的教程一步步做的。
opentsdb的程序入口是TSDMain.java文件
咱们从主函数开始看起:
public static void main(String[] args) throws IOException {
//下面的多行代码都是日志操作,目前我对日志的了解就是可以在程序运行的时候,打印出一些信息
Logger log = LoggerFactory.getLogger(TSDMain.class);
//这个函数可以让打印出的信息前面都加上“TSDMain”
log.info("Starting.");
log.info(BuildData.revisionString());
log.info(BuildData.buildString());
//try catch语句可以让程序在出现异常的时候不崩溃而执行catch部分的语句
try {
System.in.close(); // Release a FD we don't need. 什么意思?有懂得大佬希望能在评论区指点一下
} catch (Exception e) {
log.warn("Failed to close stdin", e);
}
final ArgP argp = new ArgP(); //ArgP是opentsdb项目中的一个类
CliOptions.addCommon(argp); //addCommon,addOption,addAutoMetricFlag这几个函数,归根到底还是addOption
argp.addOption("--port", "NUM", "TCP port to listen on.");
argp.addOption("--bind", "ADDR", "Address to bind to (default: 0.0.0.0).");
argp.addOption("--staticroot", "PATH",
"Web root from which to serve static files (/s URLs).");
argp.addOption("--cachedir", "PATH",
"Directory under which to cache result of requests.");
argp.addOption("--worker-threads", "NUM",
"Number for async io workers (default: cpu * 2).");
argp.addOption("--async-io", "true|false",
"Use async NIO (default true) or traditional blocking io");
argp.addOption("--backlog", "NUM",
"Size of connection attempt queue (default: 3072 or kernel"
+ " somaxconn.");
argp.addOption("--flush-interval", "MSEC",
"Maximum time for which a new data point can be buffered"
+ " (default: " + DEFAULT_FLUSH_INTERVAL + ").");
CliOptions.addAutoMetricFlag(argp);
args = CliOptions.parse(argp, args);
args = null; // free().
// get a config object
Config config = CliOptions.getConfig(argp);
// check for the required parameters
try {
if (config.getString("tsd.http.staticroot").isEmpty())
usage(argp, "Missing static root directory", 1);
} catch(NullPointerException npe) {
usage(argp, "Missing static root directory", 1);
}
try {
if (config.getString("tsd.http.cachedir").isEmpty())
usage(argp, "Missing cache directory", 1);
} catch(NullPointerException npe) {
usage(argp, "Missing cache directory", 1);
}
try {
if (!config.hasProperty("tsd.network.port"))
usage(argp, "Missing network port", 1);
config.getInt("tsd.network.port");
} catch (NumberFormatException nfe) {
usage(argp, "Invalid network port setting", 1);
}
// validate the cache and staticroot directories
try {
checkDirectory(config.getString("tsd.http.staticroot"), DONT_CREATE,
!MUST_BE_WRITEABLE);
checkDirectory(config.getString("tsd.http.cachedir"),
CREATE_IF_NEEDED, MUST_BE_WRITEABLE);
} catch (IllegalArgumentException e) {
usage(argp, e.getMessage(), 3);
}
final ServerSocketChannelFactory factory;
if (config.getBoolean("tsd.network.async_io")) {
int workers = Runtime.getRuntime().availableProcessors() * 2;
if (config.hasProperty("tsd.network.worker_threads")) {
try {
workers = config.getInt("tsd.network.worker_threads");
} catch (NumberFormatException nfe) {
usage(argp, "Invalid worker thread count", 1);
}
}
factory = new NioServerSocketChannelFactory(
Executors.newCachedThreadPool(), Executors.newCachedThreadPool(),
workers);
} else {
factory = new OioServerSocketChannelFactory(
Executors.newCachedThreadPool(), Executors.newCachedThreadPool());
}
TSDB tsdb = null;
try {
tsdb = new TSDB(config);
tsdb.initializePlugins(true);
// Make sure we don't even start if we can't find our tables.
tsdb.checkNecessaryTablesExist().joinUninterruptibly();
registerShutdownHook(tsdb);
final ServerBootstrap server = new ServerBootstrap(factory);
server.setPipelineFactory(new PipelineFactory(tsdb));
if (config.hasProperty("tsd.network.backlog")) {
server.setOption("backlog", config.getInt("tsd.network.backlog"));
}
server.setOption("child.tcpNoDelay",
config.getBoolean("tsd.network.tcp_no_delay"));
server.setOption("child.keepAlive",
config.getBoolean("tsd.network.keep_alive"));
server.setOption("reuseAddress",
config.getBoolean("tsd.network.reuse_address"));
// null is interpreted as the wildcard address.
InetAddress bindAddress = null;
if (config.hasProperty("tsd.network.bind")) {
bindAddress = InetAddress.getByName(config.getString("tsd.network.bind"));
}
// we validated the network port config earlier
final InetSocketAddress addr = new InetSocketAddress(bindAddress,
config.getInt("tsd.network.port"));
server.bind(addr);
log.info("Ready to serve on " + addr);
} catch (Throwable e) {
factory.releaseExternalResources();
try {
if (tsdb != null)
tsdb.shutdown().joinUninterruptibly();
} catch (Exception e2) {
log.error("Failed to shutdown HBase client", e2);
}
throw new RuntimeException("Initialization failed", e);
}
// The server is now running in separate threads, we can exit main.
}