第一部分:分析篇

首先,看一下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函数。此处原理不清楚的可以查看: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。

zico源代码分析(二) 数据读取和解析部分的更多相关文章

  1. Java学习-028-JSON 之二 -- 数据读取

    JSON数据由 JSONObject.JSONArray.key_value 组合而成.通常来说,JSONObject 可以包含 JSONObject.JSONArray.key_value:JSON ...

  2. 分布式缓存系统 Memcached 状态机之网络数据读取与解析

    整个状态机的基本流程如下图所示,后续分析将按该流程来进行. 接上节分解,主线程将接收的连接socket分发给了某工作线程,然后工作线程从任务队列中取出该连接socket的CQ_ITEM,开始处理该连接 ...

  3. [Android]Volley源代码分析(二)Cache

    Cache作为Volley最为核心的一部分,Volley花了重彩来实现它.本章我们顺着Volley的源代码思路往下,来看下Volley对Cache的处理逻辑. 我们回忆一下昨天的简单代码,我们的入口是 ...

  4. 【Netty源码分析】数据读取过程

    首先客户端连接到服务端时服务端会开启一个线程,不断的监听客户端的操作.

  5. Android 中View的绘制机制源代码分析 二

    尊重原创:http://blog.csdn.net/yuanzeyao/article/details/46842891 本篇文章接着上篇文章的内容来继续讨论View的绘制机制,上篇文章中我们主要解说 ...

  6. zico源代码分析(一) 数据接收和存储部分

    zorka和zico的代码地址:https://github.com/jitlogic 由于zico是zorka的collecter端,所以在介绍zico之前首先说一下zorka和数据结构化存储和传输 ...

  7. Hadoop源代码分析:HDFS读取和写入数据流控制(DataTransferThrottler类别)

    DataTransferThrottler类别Datanode读取和写入数据时控制传输数据速率.这个类是线程安全的,它可以由多个线程共享. 用途是构建DataTransferThrottler对象,并 ...

  8. 【原创】Kakfa utils源代码分析(二)

    我们继续研究kafka.utils包 八.KafkaScheduler.scala 首先该文件定义了一个trait:Scheduler——它就是运行任务的一个调度器.任务调度的方式支持重复执行的后台任 ...

  9. 【原创】kafka server源代码分析(二)

    十四.AbstractFetcherManager.scala 该scala定义了两个case类和一个抽象类.两个case类很简单: 1. BrokerAndFectherId:封装了一个broker ...

随机推荐

  1. thinkphp里面使用原生php

    thinkphp里面使用原生php Php代码可以和标签在模板文件中混合使用,可以在模板文件里面书写任意的PHP语句代码 ,包括下面两种方式: 使用php标签 例如: {php}echo 'Hello ...

  2. Dom4j 查找节点或属性

    Dom4j  查找节点或属性 例如 1 查找下面xml中的student节点的age属性, xpathstr="/students/student/@age"; 2 查找下面xml ...

  3. su su- sudo区别概述

    在Linux的操作中经常会用到su 命令进行用户的切换和sudo命令获取root权限,su su- sudo三个命令经常弄混,下面简单的讲解下. 一.查看su的命令帮助信息: pipci@openSU ...

  4. javaScript for in循环遍历对象

    for循环常被我们用来遍历数组,而如何遍历对象呢? 这时就需要用到for in循环了 写一个遍历对象名简写如下: for(var xxx in ooo){console.log(xxx)} 其中xxx ...

  5. Swift学习笔记(1)--基本语法

    1.分号; 1>Swift不要求每个语句后面跟一个分号作为语句结束的标识,如果加上也可以,看个人喜好 2>在一行中写了两句执行语句,需要用分号隔开,比如 let x = 0; printl ...

  6. 洛谷—— P2387 魔法森林

    题目描述 为了得到书法大家的真传,小 E 同学下定决心去拜访住在魔法森林中的隐 士.魔法森林可以被看成一个包含 n 个节点 m 条边的无向图,节点标号为 1,2,3,…,n,边标号为 1,2,3,…, ...

  7. Vijos——T1053 Easy sssp

    https://vijos.org/p/1053 描述 输入数据给出一个有N(2 <= N <= 1,000)个节点,M(M <= 100,000)条边的带权有向图. 要求你写一个程 ...

  8. jmeter名词解释之聚合报告

    新浪围脖>@o蜗牛快跑o    温馨提示: 1. tps(吞吐量)表征系统性能,系统的好坏能够用这个评估 2. 90%Line是满足需求响应时间的重要指标,假设用户需求说是响应时间不小于5s,那 ...

  9. Razor数组数据

    控制器层 public ActionResult DemoArray() { Product[] array = { new Product {Name = "Kayak", Pr ...

  10. hello world! hello cnbog

    第一次开通博客,以后见证我的成长吧!