zorka源码解读之tracer内部实现
2015-06-23 11:07
441 查看
核心类:
ZorkaAsyncThread.javaprotected BlockingQueue<T> submitQueue; /** * Processes single item from submit queue (if any). */ public void runCycle() { try { T obj = submitQueue.take(); if (obj != null) { List<T> lst = new ArrayList<T>(plen); lst.add(obj); if (plen > 1) { submitQueue.drainTo(lst, plen-1); } process(lst); flush(); } } catch (InterruptedException e) { log.error(ZorkaLogger.ZAG_ERRORS, "Cannot perform run cycle", e); } } /** * Submits object to a queue. * * @param obj object to be submitted */ public boolean submit(T obj) { try { return submitQueue.offer(obj, 1, TimeUnit.MILLISECONDS); } catch (InterruptedException e) { return false; } }
主要分为两个关键流程:
ZorkaAgent插桩之后将record提交到相应线程对象的队列submitQueuebeanshell创建线程,线程启动后,从提交队列submitQueue里不断取记录进行处理并发送到目标终端(日志或者其他监控平台)。
一、ZorkaAgent将record提交到队列
插桩过程中的probe会调用MainSubmitter的traceEnter、traceReturn、traceError、submit四个方法,它们主要用于处理trace record,并提交到相应的队列。
在traceReturn、traceError底层会调用pop()、pop()方法底层调用ZorkaAsyncThread继承类里实现的submit方法,将record提交到队列。
二、从队列获取record并处理,发送到目标流。
tracer.bsh创建异步线程,线程启动后,自动从队列获取record对象,处理并发送。每个线程对应一种tracer方式。
ZorkaAsyncThread是一个抽象类,有很多继承,比如ZabbixTrapper、SnmpTrapper、ZicoTraceOutput等。
继承类里面实现的process方法用于讲最终的record提交到目的流。submit方法用于将record提交到待处理队列。
相关文章推荐
- Android xml资源文件中@、@android:type、@*、?、@+含义和区别
- 通用简写表
- Git学习教程:[2]如何创建版本库
- 周记——20150622
- Android 开启或关闭WIFI实现
- 马尾图案之canvas的translate、scale、rotate的方法详解
- 一个android参考网站,工具+源码
- matlab函数 bsxfun浅谈
- 邀请码的生成
- ajax无刷新调用struts2框架中的Action,以用户登录验证为例
- scala的下划线用法
- 【mvc学习】给小白们的第一个MVC学习Demo
- Oracle 行转列
- String.format详解
- lua学习笔记_table
- IsPostBack是什么意思,如何运用?
- C#, Java, PHP, Python和Javascript几种语言的AES加密解密实现
- 从CRITS发展历史解读结构框架
- 简单的javamail之163邮件
- vc 网络编程(socket)