日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

通過Jaeger上報Java應用數據

通過Jaeger為應用埋點并上報鏈路數據至可觀測鏈路 OpenTelemetry 版后,可觀測鏈路 OpenTelemetry 版即可開始監控應用,您可以查看應用拓撲、調用鏈路、異常事務、慢事務和SQL分析等一系列監控數據。本文介紹如何進行手動埋點,以及使用Spring Cloud組件和gRPC組件進行自動埋點。

重要

為獲得更豐富的功能、更先進的鏈路追蹤能力,以及最佳使用體驗,建議您使用OpenTelemetry協議將應用接入可觀測鏈路 OpenTelemetry 版

我們為您提供了詳細的OpenTelemetry接入指南和最佳實踐,幫助您快速上手可觀測鏈路 OpenTelemetry 版。更多信息,請參見接入應用

前提條件

獲取接入點信息

  1. 登錄ARMS控制臺,在左側導航欄單擊接入中心

  2. 服務端應用區域單擊Jaeger卡片。

  3. 在彈出的Jaeger面板中選擇數據需要上報的地域。

    說明

    初次接入的地域將會自動進行資源初始化。

  4. 選擇連接方式上報方式,然后復制接入點信息。

    • 連接方式:若您的服務部署在阿里云上,且所屬地域與選擇的接入地域一致,推薦使用阿里云內網方式,否則選擇公網方式。

    • 上報方式:根據客戶端支持的協議類型選擇HTTPgRPC協議上報數據。

    image.png

背景信息

Jaeger是一款開源分布式追蹤系統,兼容OpenTracing API,且已加入CNCF開源組織。其主要功能是聚合來自各個異構系統的實時監控數據。目前OpenTracing社區已有許多組件可支持各種Java框架,例如:

要通過JaegerJava應用數據上報至可觀測鏈路 OpenTelemetry 版控制臺,首先需要完成埋點工作。您可以手動埋點,也可以利用各種現有插件實現埋點的目的。本文介紹以下三種埋點方法。

  • 手動埋點

  • 通過Spring Cloud組件埋點

  • 通過gRPC組件埋點

數據是如何上報的?

  • 不通過Jaeger Agent而直接上報數據的原理如下圖所示。

    image
  • 通過Jaeger Agent上報數據的原理如下圖所示。

    image

Java應用手動埋點

要通過JaegerJava應用數據上報至可觀測鏈路 OpenTelemetry 版控制臺,首先需要完成埋點工作。本示例為手動埋點。

  1. 下載Demo工程,進入manualDemo目錄,并按照Readme的說明運行程序。

  2. 打開pom.xml,添加對Jaeger客戶端的依賴。

    <dependency>
        <groupId>io.jaegertracing</groupId>
        <artifactId>jaeger-client</artifactId>
        <version>0.31.0</version>
    </dependency>
  3. 配置初始化參數并創建Tracer對象。

    Tracer對象可以用來創建Span對象以便記錄分布式操作時間、通過Extract/Inject方法跨機器透傳數據、或設置當前Span。Tracer對象還配置了上報數據的網關地址、本機IP地址、采樣率、服務名等數據。您可以通過調整采樣率來減少因上報數據產生的開銷。

    說明

    請將<endpoint>替換為前提條件中獲取的接入點。

    // 將manualDemo替換為您的應用名稱。
    io.jaegertracing.Configuration config = new io.jaegertracing.Configuration("manualDemo");
    io.jaegertracing.Configuration.SenderConfiguration sender = new io.jaegertracing.Configuration.SenderConfiguration();
    // 將 <endpoint> 替換為前提條件中獲取的接入點。
    sender.withEndpoint("<endpoint>");
    config.withSampler(new io.jaegertracing.Configuration.SamplerConfiguration().withType("const").withParam(1));
    config.withReporter(new io.jaegertracing.Configuration.ReporterConfiguration().withSender(sender).withMaxQueueSize(10000));
    // 設置資源Tag,如應用版本、部署環境。
    Map<String, String> map = new HashMap<>();
    map.put("service.version", "1.0.0");
    map.put("deployment.environment", "test");
    config.withTracerTags(map);
    GlobalTracer.register(config.getTracer());
  4. 記錄請求數據。

    Tracer tracer = GlobalTracer.get();
    // 創建Span。
    Span span = tracer.buildSpan("parentSpan").withTag("myTag", "spanFirst").start();
    tracer.scopeManager().activate(span, false);
    tracer.activeSpan().setTag("methodName", "testTracing");
    // 業務邏輯。
    secondBiz();
    span.finish();
  5. 可選:上一步用于記錄請求的根操作,如果需要記錄請求的上一步和下一步操作,則需要傳入上下文。

    Tracer tracer = GlobalTracer.get();
    Span parentspan = tracer.activeSpan();
    Tracer.SpanBuilder spanBuilder = tracer.buildSpan("childSpan").withTag("myTag", "spanSecond");
    if (parentspan !=null) {
        spanBuilder.asChildOf(parentspan).start();
    }
    Span childSpan = spanBuilder.start();
    Scope scope = tracer.scopeManager().activate(childSpan); // 請求開始執行一次
    // 業務邏輯。 可以執行多次 buildSpan
    childSpan.finish();
    tracer.activeSpan().setTag("methodName", "testCall");
    
    // 請求結束執行一次
    scope.close();
  6. 可選:為了方便排查問題,您可以為某個記錄添加一些自定義標簽(Tag),例如記錄是否發生錯誤、請求的返回值等。

    tracer.activeSpan().setTag("methodName", "testCall");
  7. 在分布式系統中發送RPC請求時會帶上Tracing數據,包括TraceId、ParentSpanId、SpanId、Sampled等。您可以在HTTP請求中使用Extract/Inject方法在HTTP Request Headers上透傳數據。總體流程如下:

    1.jpg

    1. 在客戶端調用Inject方法傳入Context信息。

      private void attachTraceInfo(Tracer tracer, Span span, final Request request) {
              tracer.inject(span.context(), Format.Builtin.TEXT_MAP, new TextMap() {
                  @Override
                  public void put(String key, String value) {
                      request.setHeader(key, value);
                  }
                  @Override
                  public Iterator<Map.Entry<String, String>> iterator() {
                      throw new UnsupportedOperationException("TextMapInjectAdapter should only be used with Tracer.inject()");
                  }
              });
          }
    2. 在服務端調用Extract方法解析Context信息。

      protected Span extractTraceInfo(Request request, Tracer tracer) {
          Tracer.SpanBuilder spanBuilder = tracer.buildSpan("/api/xtrace/test03");
          try {
              SpanContext spanContext = tracer.extract(Format.Builtin.TEXT_MAP, new TextMapExtractAdapter(request.getAttachments()));
              if (spanContext !=null) {
                  spanBuilder.asChildOf(spanContext);
              }
          } catch (Exception e) {
              spanBuilder.withTag("Error", "extract from request fail, error msg:" + e.getMessage());
          }
          return spanBuilder.start();
      }
                                      

通過Spring Cloud組件為Java應用埋點

要通過JaegerJava應用數據上報至可觀測鏈路 OpenTelemetry 版控制臺,首先需要完成埋點工作。本示例為通過Spring Cloud組件埋點。Spring Cloud提供了下列組件的埋點:

  • @Async, @Scheduled, Executors

  • Feign, HystrixFeign

  • Hystrix

  • JDBC

  • JMS

  • Mongo

  • RabbitMQ

  • Redis

  • RxJava

  • Spring Messaging - 鏈路消息通過消息通道發送

  • Spring Web (RestControllers, RestTemplates, WebAsyncTask)

  • Standard Logging - 日志被添加至當前Span

  • WebSocket STOMP

  • Zuul

請按照以下步驟通過Spring Cloud組件埋點。

說明

請下載Demo工程,進入springMvcDemo/webmvc4-boot目錄,并按照Readme的說明運行程序。

  1. 打開pom.xml,添加Jar包依賴。

    <dependency>
       <groupId>io.opentracing.contrib</groupId>
      <artifactId>opentracing-spring-cloud-starter</artifactId>
      <version>0.5.8</version>
    </dependency>
    <dependency>
      <groupId>io.jaegertracing</groupId>
      <artifactId>jaeger-client</artifactId>
      <version>1.4.0</version>
    </dependency>
  2. 添加OpenTracing Tracer Bean。

    說明

    請將<endpoint>替換為前提條件中獲取的接入點。

    @Bean
    public io.opentracing.Tracer tracer() {
        io.jaegertracing.Configuration config = new io.jaegertracing.Configuration("springFrontend");
        io.jaegertracing.Configuration.SenderConfiguration sender = new io.jaegertracing.Configuration.SenderConfiguration();
        sender.withEndpoint("<endpoint>");
        config.withSampler(new io.jaegertracing.Configuration.SamplerConfiguration().withType("const").withParam(1));
        config.withReporter(new io.jaegertracing.Configuration.ReporterConfiguration().withSender(sender).withMaxQueueSize(10000));
        return config.getTracer();
    }

通過gRPC組件為Java應用埋點

要通過JaegerJava應用數據上報至可觀測鏈路 OpenTelemetry 版控制臺,首先需要完成埋點工作。本示例為通過gRPC組件埋點。

請按照以下步驟通過gRPC組件埋點。

說明

請下載Demo工程,進入grpcDemo目錄,并按照Readme的說明運行程序。

  1. 打開pom.xml,添加Jar包依賴。

    <dependency>
        <groupId>io.opentracing.contrib</groupId>
        <artifactId>opentracing-grpc</artifactId>
        <version>0.2.3</version>
    </dependency>
  2. 在服務端初始化Tracing對象,創建ServerTracingInterceptor,并添加對Server的攔截。

    import io.opentracing.Tracer;
    
        public class YourServer {
    
            private int port;
            private Server server;
            private final Tracer tracer;
    
            private void start() throws IOException {
                ServerTracingInterceptor tracingInterceptor = new ServerTracingInterceptor(this.tracer);
    
                // If GlobalTracer is used: 
                // ServerTracingInterceptor tracingInterceptor = new ServerTracingInterceptor();
    
                server = ServerBuilder.forPort(port)
                    .addService(tracingInterceptor.intercept(someServiceDef))
                    .build()
                    .start();
            }
        }
  3. 在客戶端初始化Tracing對象,創建ClientTracingInterceptor,并添加對Client Channel的攔截。

    import io.opentracing.Tracer;
    
        public class YourClient {
    
            private final ManagedChannel channel;
            private final GreeterGrpc.GreeterBlockingStub blockingStub;
            private final Tracer tracer;
    
            public YourClient(String host, int port) {
    
                channel = ManagedChannelBuilder.forAddress(host, port)
                    .usePlaintext(true)
                    .build();
    
                ClientTracingInterceptor tracingInterceptor = new ClientTracingInterceptor(this.tracer);
    
                // If GlobalTracer is used: 
                // ClientTracingInterceptor tracingInterceptor = new ClientTracingInterceptor();
    
                blockingStub = GreeterGrpc.newBlockingStub(tracingInterceptor.intercept(channel));
            }
        }
                            

常見問題

問:Demo程序執行成功,為什么控制臺上沒有上報數據?

答:請調試方法io.jaegertracing.thrift.internal.senders.HttpSender.send(Process process, List<Span> spans),并查看上報數據時的返回值。如果報403錯誤,則表明接入點配置不正確,請檢查并修改。