zipkin之brave

  brave是同步收集信息,及計算調用時間,可是異步發送日誌信息給zipkin;因此不少時候你沒法在第一時間獲取日誌數據可能須要等一會。另外在寫一個demo的時候,由於最後睡了1秒,常常會發現丟了一些日誌;後來最後sleep(5000)以後,日誌都成功獲取了。java

  brave在report發送了一個日誌以後實際上是放到了一個隊列裏面了;而後會有消費者線程從隊列中取出數據,當數據達到必定程度(或者一段時間以後,這個是根據現象推測的)在批量告知zipkin 服務器。
servlet.isAsync是隻有servlet3以後纔會支持異步調用;git

  brave總體分爲兩部分來理解:
  當前節點做爲Client端(發送request請求),將會在RestTemplate埋下一個攔截器,這個攔截器將會記錄下請求的往來的信息,包括時間間隔;調用完成後將會發送到zipkin服務器;可是想要是攔截器生效前提條件當前應用發送請求使用的是RestTemplate對象。
  當前節點做爲Server端(接收請求),將會在經過web的Filter(javax.servlet.Filter)來進行埋點;在Filter的doFilter調用中實現對servlet的service()的調用先後攔截處理;github

  TracingClientHttpRequestInterceptor
  明白了client和server端,下面就是二者對應的處理,在RestTemplate埋點的對象是TracingClientHttpRequestInterceptor,這個interceptor核心方法是intercept,Interceptor和Filter處理機制相似,都是在在調用真諦函數(Interceptor的真諦函數就是execution.execute(request, body),執行請求,Filter的真諦函數就是servlet.service())前和後進行攔截處理;
  真諦函數以前是調用handler的handler.handleSend,handleSend裏面將會把Kind設置爲Client,從request中獲取span信息(經過span.customizer(),這個函數在handleReceive裏面也會用到,主要就是從request以及response中獲取信息,而後填充到tags節點中),最後調用span.start,來啓動一個span;
  真諦函數以後調用的是handler的handleReceive,經過span.customizer()來填充span的信息;最後調用span.finish來向zipkin server提交日誌內容。web

  TracingFilter
  是server角色埋的點,默認狀況下第一個Filter是DelegatingTracingFilter,這個filter在init的時候就建立了TracingFilter(構造函數裏面傳的是HttpTracing),而後在doFilter的時候,調用TracingFilter的doFilter來進行攔截;TracingFilter裏面也是有着HttpServerHandler,在doFilter裏面在真諦函數先後的就是調用HttpServerHandler的handleReceive和handleSend兩個函數。
  handleReceive函數裏面,首先設置Kind類型爲Server,而後經過HttpServerParser來從request裏面獲取數據填充到span中;最後調用一下span.start來標記一個span的開始;
  問題:nextSpan是否會把parent的span獲取?
  handleSend函數中,首先從response中獲取相應的信息填充信息,最後調用span.finish向服務器提交一下span內容。
  問題:client和server都會想zipkinServer提交log內容嗎?
  最後還有一個攔截器要交代一下,就是SpanCustomizingAsyncHandlerInterceptor,這個實際上是一個server角色攔截器,
  問題:這個SpanCustomizingAsyncHandlerInterceptor還須要深刻了解一下,尤爲裏面提到的http.route我記得在別的地方還有用到。api

 坑tomcat

改寫
爲何我改寫了CrmTracingHttpClientBuilder裏面的decorateProtocolExec的實現類,可是還說是走原生的?

  原來CrmTracingHttpClientBuilder是我複製的類,雖然改寫了decorateProtocolExec函數裏面返回類,可是CrmTracingHttpClientBuilder建立的create函數裏面返回的builder仍是TracingHttpClientBuilder,因此根本就沒有走CrmTracingHttpClientBuilder裏面的decorateProtocolExec。服務器

  這個問題和brave無關,是本身大腦短路。

  servlet2.0怎麼辦?mvc

  我靠,發現maven版本里面打的servletapi是3.0,可是tomcat5確實低版本的servlet(2.4);致使某些方法沒法使用!關鍵是maven裏面居然沒有2.4,由於太古老了。是的maven裏面沒有該jar包。沒辦法只好從tomcat5中拷貝出來一款
  開始是使用:強轉方式,可是後來發現到了servlet3以後,這種強轉是報錯的;
 int statusCode = ((brave.servlet.ServletRuntime.Servlet25ServerResponseAdapter)httpResponse).httpStatus; 
  還好後來找到了brave的超級強大的地方,本身判斷平臺。
 int statusCode = brave.servlet.ServletRuntime.get().status(httpResponse); 
搞掂了。異步

參考:maven

1.這強推墨竹的博客,對於zipkin的brave組價講解十分透徹。

http://blog.mozhu.org/categories/zipkin/

2.brave的一個demo

相關文章
相關標籤/搜索