zico源代码分析(二) 数据读取和解析部分
2015-05-26 22:00
267 查看
第一部分:分析篇
首先,看一下zico的页面,左侧是hostname panel,右侧是该主机对应的traces panel。点击左侧zorka主机名,右侧panel会更新信息,在火狐浏览器中使用firebug插件我们可以看到请求的URL。
其中关键是第二条:/traces/search
根据/traces/search这个URL我们试着在代码中找找线索。可以看到TraceDataService类有@Path("/traces")注解,而其方法searchTraces上有 @Path("/search")标记,所以,POST http://localhost:8642/data/traces/search这条请求执行了TraceDataService类中的searchTraces函数。此处原理不清楚的可以查看: href="http://www.360doc.com/content/11/1214/18/1542811_172254934.shtml" target=_blank>http://www.360doc.com/content/11/1214/18/1542811_172254934.shtml
@Path("/traces") public class TraceDataService { private final static Logger log = LoggerFactory.getLogger(TraceDataService.class); @Inject private HostStoreManager storeManager; @Inject private UserContext userContext; @POST @Path("/search") @Produces(MediaType.APPLICATION_JSON) @Consumes(MediaType.APPLICATION_JSON) public TraceInfoSearchResult searchTraces(TraceInfoSearchQuery query) { userContext.checkHostAccess(query.getHostName()); try { HostStore host = storeManager.getHost(query.getHostName(), false); if (host == null) { throw new ZicoRuntimeException("Unknown host: " + query.getHostName()); } return host.search(query); } catch (EqlParseException e) { log.error("Error while parsing eql query '" + query.getSearchExpr() + "'\n" + e, e); throw new ZicoRuntimeException(e.toString() + " [query '" + query.getSearchExpr() + "']", e); } catch (EqlException e) { log.error("Error searching for traces", e); throw new ZicoRuntimeException(e.toString() + " [query '" + query.getSearchExpr() + "']", e); } catch (Exception e) { log.error("Error searching for traces", e); throw new ZicoRuntimeException("Error while searching '" + query.getSearchExpr() + "': " + e.getMessage(), e); } }
分析查找数据的过程:TraceDataService执行searchTraces函数(在searchTraces函数中会将query的条件作为参数传入)并返回一个TraceInfoSearchResult对象,TraceInfoSearchResult中包含一个TraceInfo的List,而一个TraceInfo对象就是最后显示在网页上的一条信息。
在searchTraces函数中首先根据query查询出对象hostStore对象,然后执行此hostStore对象的search()函数。
所以我们需要看一下HostStore的search()函数。在search()函数最后调用了toTraceInfo()方法,toTraceInfo()方法会将TraceInfoRecord和TraceRecord的信息综合起来形成TraceInfo。
第二部分 验证篇
为了进一步验证上面的想法,我在TraceDataService的public TraceInfoSearchResult searchTraces(TraceInfoSearchQuery query)方法第一句的位置加入System.out.println("---->>searchTraces() ");
在HostStore的search()函数最后一句return之前加入
System.out.println(result.getResults().get(0).toString());
同时再TraceInfo类中覆盖了toString方法
@Override public String toString() { return "---->>TraceInfo: " + " hostName:" + hostName + " calls:" + calls + " description:" + description; }
完成这些后,debug一下,发现在zico页面左侧的hostname panel中点击一个主机名,此时会输出"---->>searchTraces() "这句话,这也表明,当我们点击一个主机名后,便执行了searchTraces()来查询该主机的trace信息。而在searchTraces()函数返回结果之前,zico页面中右侧traces panel是没有内容的。
继续执行,输出了第一条traceInfo的信息如下
---->>TraceInfo: hostName:zorka calls:19 description:HTTP|/|200|localhost:8080|keep-alive|text/html,application/xhtml+xml,application/xml;q=|Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/53|gzip, deflate, sdch|zh-CN,zh;q=0.8 18:22:01.188 [org.eclipse.jetty.server.session.HashSessionManager@2a266d09Timer] DEBUG org.eclipse.jetty.server.session - Scavenging sessions at 1432722121188
把上面这条信息和zico页面中的信息进行比较,发现是一致的,这也验证了每个TraceInfo代表网页中显示的一条记录。
//MapDB数据库中存储的是TraceInfoRecord的map。
相关文章推荐
- 分析某款网络收音机的数据解析部分
- Android数据存储之XmlPull解析XML文件(读取部分)
- hadoop源码解析之hdfs读取数据全流程分析
- zico源代码分析(一) 数据接收和存储部分
- Android数据存储之JSON数据解析(读取部分)
- Android数据存储之DOM解析XML文件(读取部分)
- js读取解析JSON类型数据
- 如何把Ext.data.store里的数据一次性用JSON传给后台(添加了后台解析部分)
- js读取解析JSON类型数据
- Python数据分析--Numpy部分笔记
- FastJson和Gson和Json数据解析分析和用法
- 【ffmpeg】试图从raw buffer中读取数据的ff_read_packet 浅显分析
- hadoop单线程实现server多socket连接读取数据原理分析
- Java解析DBF文件,错误Failed to parse Number: For input string: "-.---" 或读取不出数据或乱码问题都在这里解决
- Android 网络数据读取及解析
- 深度解析数据分析对排名的决定作用(二)
- Yii数据读取与跳转参数传递用法实例分析
- cocos2dx 2.2.2 cocostudio 数据编辑器导出的.json文件读取 解析
- 四家银行三季度部分数据汇总对比分析(续)
- 关于IOS数据解析的错误分析