本篇文章的目的就是尝试来阅读以下具体实现的源码。
首先 https://issues.apache.org/jira/browse/CASSANDRA-5977 。在这个issue之中,附带了patch的实现。从path之中,可以看到commitor首先修改了TableStats的代码。
将Cassandra的代码从github clone下来之后,用Eclipse来看。
PS: 用Eclipse的话,会遇到找不到“net.nicoulaj”的编译错误,这个应该是Cassandra的作者都是用idea来写的吧~ 暂时可以不管它。 不影响我们阅读代码
原文链接: http://www.flyml.net/2017/01/06/cassandra-nodetool-how-to-output-json/
之前一直习惯使用Apache commin-line, 这次看到了新东西:通过Annotation的方式的command line。
不说哪种更好吧,至少是看到新东西了。借助的是io.airlift.command.*;
Github: https://github.com/airlift/airline
原文链接: http://www.flyml.net/2017/01/06/cassandra-nodetool-how-to-output-json/
接下来会先看看TableStatsHolder,再看看TableStatsPrinter
原文链接: http://www.flyml.net/2017/01/06/cassandra-nodetool-how-to-output-json/
从前一副图也可以看到,等号左边的是StatsHolder, 等号右边是TableStatsHolder.
原文链接: http://www.flyml.net/2017/01/06/cassandra-nodetool-how-to-output-json/
字面意思: 节点探针
上面的解释可以看到,这是JMX相关的操作,而JMX就是用来看Cassandra相关的各种Metric的。从下面的代码可以简要看出:
具体就不深究了~
这个NodeProbe 定义在 package org.apache.cassandra.tools; 正常情况下,cassandra client 代码是无法引用到的。
TableStatsPrinter.from(xxxx)在这里,我们终于可以看到json/yaml的相关输出了
从上一幅图可以看到,最终的json输出,用的是json-simple, 居然不是大名鼎鼎的Gson/FastJson之类的。 惊讶
同时注意: 这个JsonPrinter 又是一个内部类~ OMG, 我需要回去补充一下内部类的使用了。
使用Eclipse的代码搜索,我们看到,还有其他几个都有调用到JsonPrinter:
原文链接: http://www.flyml.net/2017/01/06/cassandra-nodetool-how-to-output-json/
我用的不多,看看就好:
主要是基于org.yaml.snakeyaml.*的实现
总结:
Nodetool输出Json,首先在实现了StatsHolder接口的TableStatsHolder使用NodeProbe探针,把相关Metric抽取出来,放到一个Map之中,然后调用TableStatsPrinter之中的JsonPrinter这个内部类的打印方法,使用simple json 将一个map直接输出成json
后记:
第一次写源码阅读的文章,经验不足,还请大神指点