Jaeger-2.客戶端使用 (Java版本)


    主要用到了opentracing相關的jar包,而且用到了jaeger的java客戶端實現。

一段簡單的代碼

  首先創建一個簡單的loveyou類,里面有一個簡單的方法hello。本部分之與OpenTracing有關,與Jaeger關系並不是很大。在hello方法體的前后,加入幾行簡單的代碼,主要是根據OpenTracing規范定義的api進行一些調用信息等內容的添加。

 

public class LoveYou {

 

 

  Tracer tracer;

 

 

  public LoveYou() {

 

 

   tracer = JaegerTracerHelper.initTracer("loveYouService");

 

 

  }

 

 

  public void hello(String name) {

 

 

    Span span = tracer.buildSpan("hello").start();

 

 

    span.setTag("name", name);

 

 

    System.out.println("Hello " + name);

 

 

    span.log("Love service say hello to " + name);

 

 

    span.finish();

 

 

  }

 

 

  public static void main(String[] args) {

 

 

    new LoveYou().hello("小姐姐味道");

 

 

  }

 

 

}

  代碼主要加入了以下幾個重要的信息。

  1、構建了一個新的span,每個span有三個id:rootid、parentid、id。它們構成了樹狀調用鏈的每個具體節點。

  2、給新加的span添加了一個tag信息,用來進行一些自定義標識。tag有一些標准的清單,但也可以自定義。

  3、給新加的span添加了log。log信息會附着在信息span上,一塊被收集起來,僅定義一些比較重要的信息,包括異常棧等。一些不重要的信息不建議使用log,它會占用大量存儲空間。


      執行代碼后,可以在jaeger的ui端看到這次的調用信息。如下: 

構建jaeger實現

我們的OpenTracing數據是如何構建,並發送到Jaeger的server端呢?就是通過下面的代碼完成的。

 public class JaegerTracerHelper {

  public static JaegerTracer initTracer(String service) {
    
    final String endPoint = "http://10.30.94.8:14268/api/traces";

    final CompositeReporter compositeReporter = new CompositeReporter(new RemoteReporter.Builder().withSender(new HttpSender.Builder(endPoint).build()).build(),new LoggingReporter());

    final Metrics metrics = new Metrics(new NoopMetricsFactory());

    JaegerTracer.Builder builder = new JaegerTracer.Builder(service).withReporter(compositeReporter).withMetrics(metrics).withExpandExceptionLogs().withSampler(new ConstSampler(true));

    return builder.build();

     }

}

實現一個2層深度的鏈

  以上代碼,僅產生了一個span,也就是一個方法調用。接下來,我們看一下如何完成一個多層的調用鏈條。接下來還是要修改LoveYou類。我們把調用方法hello拆解一下,拆成dispatchhello兩個方法,並在hello方法里sleep一秒鍾。

期望生成兩條trace信息。

dispatch

 

 

 public void dispatch(String cmd, String content) {

  Span span = tracer.buildSpan( "dispatch").start();

 

 

  tracer.activateSpan(span);

 

 

  if (cmd.equals("hello")) {

 

 

    this.hello(content);

 

 

  }

 

 

  if (null != span) {

 

 

    span.setTag("cmd", cmd);

 

 

    span.finish();

 

 

  }

}

 

 

 

hello

 

 

public  void hello(String name) {
 
  Span span = tracer.buildSpan( "hello").start();

 

 

  tracer.activateSpan(span);

 

 

  System.out.println("Hello " + name);

 

 

  try {

 

 

    Thread.sleep(TimeUnit.SECONDS.toMillis(1));

 

 

  } catch (InterruptedException e) {

 

 

    e.printStackTrace();

 

 

  }

 

 

  span.setTag("name", name);

 

 

  span.log("Love service say hello to " + name);

 

 

  span.finish();

}

  與示例一不同的是,每次生成span之后,我們還要將其激活一下 

 

   tracer.activateSpan(span);

 

 

  它的目的主要是讓span實例在當前的ctx里面保持活躍(比如一個線程)。這樣,如果新的span判斷當前有活躍的span,則將它們放在同一個scope中。這樣,鏈條就串起來了。

 

以下是程序運行后的效果。 

 

采樣

 

  有時候,我們的服務QPS非常高,瞬間能夠生成大量的trace信息。這些信息是非常相近的,且會給存儲產生很大的壓力。

  如果不需要統計一些QPS之類的信息,就可以使用sampler,僅收集部分trace。

  還記得我們使用javaapi構建的jaeger實例么?其中,有這么一行代碼:

 

  .withSampler(new ConstSampler(true))

 

 

  這就是最簡單的采樣,意思是收集所有的信息。jaeger支持四種不同的采樣類型。

 

 

Constant

 

  這是一個布爾開關,如果sampler.param=1,則代表收集所有的trace,如果為0,則代表什么都不收集。

Probabilistic

  基於概率進行采樣,比如sampler.param=0.1,則代表有1/10的trace將被收集。

Rate Limiting

  限流方式,使用令牌桶限流。 sampler.param=2.0 則代表每秒有2個trace被收集,超出的將被拋棄。

Remote

  通過遠程配置方式配置,這也是默認的方式。比如在Collector中配置strategies.json

 {

  "service_strategies": [

  {

    "service": "foo",

    "type": "probabilistic",

    "param": 0.8,

    "operation_strategies": [

    {

        "operation": "op1",

        "type": "probabilistic",

        "param": 0.2

    },

    {

        "operation": "op2",

        "type": "probabilistic",

        "param": 0.4

    }

   ]

  },

  {

    "service": "bar",

    "type": "ratelimiting",

    "param": 5

  }

  ],

  "default_strategy": {

  "type": "probabilistic",

  "param": 0.5

  }

}

End

  通過OpenTracing的Api,可以很容易的實現調用鏈功能。但可以看到,由於存在各種各樣的客戶端,主要工作量就集中在對這些客戶端的兼容上。比如線程池、SpringCloud、MQ、數據庫連接池等等等等。

  使用Aop可以省去一些編碼和侵入,但可控制性會弱一些。

  接下來,我們給一個簡單的OkHttp+SpringBoot調用,也就是分布式應用,添加trace功能。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM