zoukankan      html  css  js  c++  java
  • zorka源码解读之tracer内部实现

    核心类:

    ZorkaAsyncThread.java

    protected 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;
    }
    }

    主要分为两个关键流程:

    1. ZorkaAgent插桩之后将record提交到相应线程对象的队列submitQueue
    2. beanshell创建线程,线程启动后,从提交队列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提交到待处理队列。

  • 相关阅读:
    并发编程(一) 操作系统基础和进程
    操作系统发展史
    网络编程(三) 大文件传输与UDP通信
    网络编程(二)-socket套接字
    网络编程(一)
    排序算法之冒泡法
    第二章 算法基础 思考题2-1
    查找算法之二分查找
    排序算法之归并排序
    排序算法之插入排序
  • 原文地址:https://www.cnblogs.com/peterpanzsy/p/4594960.html
Copyright © 2011-2022 走看看