2016-11-10 3 views
1

マイクロサービス環境では、ビジネスプロセス全体ですべてのマイクロサービスインスタンスを介して要求をトレースする2つの主な利点があります。ビジネスケースZipkinSpring Sleuth-Tracing Failures

最初の問題を解決するツールは、そこにあるの技術的障害の根、かどうかを見つけるかに関する

  • 間またはサービスインスタンスで

    1. 検索待ち時間のギャップ。しかし、どのようにトレースを使用して、マイクロサービス環境の不具合を明らかにすることができますか?私は間違いなく、すべてのエラーに直面しているスパンをトレースしたいが、何も間違っていない各リクエストではない。 前述のように、カスタムサンプラーを使用することができる。here

      また、独自のサンプラBean定義を登録して、どのリクエストをサンプリングするかをプログラムで決定することもできます。たとえば、正常な要求を無視したり、コンポーネントがエラー状態にあるかどうか、または実際に何か他のものがあるかどうかをチェックするなど、トレースする項目をより賢明に選択できます。

      私はそれを実装しようとしましたが、動作しないか、間違って使用しました。ブログ記事が提案されているよう だから、私は自分のサンプラーを登録:

      @Bean 
          Sampler customSampler() { 
          return new Sampler() { 
           @Override 
           public boolean isSampled(Span span) { 
      
            boolean isErrorSpan = false; 
            for(String tagKey : span.tags().keySet()){ 
             if(tagKey.startsWith("error_")){ 
              isErrorSpan = true; 
             } 
            } 
            return isErrorSpan ; 
           } 
          }; 
      } 
      

      そして、私のコントローラで私は例外が今

      private final Tracer tracer; 
      
      @Autowired 
      public DemoController(Tracer tracer) { 
          this.tracer = tracer; 
      } 
      
      @RequestMapping(value = "/calc/{i}") 
      public String calc(@PathVariable String i){ 
          Span span = null; 
          try { 
           span = this.tracer.createSpan("my_business_logic"); 
           return "1/" + i + " = " + new Float(1.0/Integer.parseInt(i)).toString(); 
          }catch(Exception ex){ 
           log.error(ex.getMessage(), ex); 
      
           span.logEvent("ERROR: " + ex.getMessage()); 
           this.tracer.addTag("error_" + ex.hashCode(), ex.getMessage()); 
           throw ex; 
          } 
          finally{ 
           this.tracer.close(span); 
          } 
      } 
      

      を提起する場合にはエラーとしてタグ付けされている新しいスパンを作成しますこれは機能しません。私が/ calc/aメソッドを要求した場合、ControllerメソッドがNumberFormatExceptionをスローする前にSampler.isSampled(Span)メソッドが呼び出されています。これは、isSampled()がSpanをチェックするとき、まだタグがないことを意味します。そして、サンプラーメソッドは後でこのプロセスで呼び出されることはありません。私がサンプラーを開き、すべてのスパンをサンプリングすることができる場合にのみ、後でZipkinでタグ付きエラースパンが表示されます。この場合、Sampler.isSampled(スパン)は1回だけ呼び出されましたが、HttpZipkinSpanReporter.report(スパン)は3回実行されました。

      したがって、エラースパンを持つトレースのみを送信すると、ユースケースはどのように見えますか?任意の "error_"タグでスパンにタグを付けるのも正しい方法ですか?

  • 答えて

    0

    サンプリングの決定はトレースに対して行われます。つまり、最初のリクエストが到着してスパンが作成されたら、決定を下す必要があります。その時点でタグ/手荷物がないので、タグの内容に依存してこの決定を下すことはできません。それは間違ったアプローチです。

    あなたは非常にカスタムのアプローチを取っています。そのようにしたい場合(これはお勧めしません)、SpanReporter - https://github.com/spring-cloud/spring-cloud-sleuth/blob/master/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/SpanReporter.java#L30のカスタム実装を作成することができます。 SpanReporterは、ジップパンにスパンを送信しているものです。既存のSpanReporter実装をラップする実装を作成し、タグの値が一致した場合にのみ実行を委譲します。しかし、私の見解からは、それは正しいとは言えません。

    +0

    いいえ、その後、私はSampler.isSampled(スパンスパン)を誤解しました。これは、マイクロサービスのバリアに当たる最初のスパンだけがサンプラーによって検討されているためです。私は答えました.Sunuthはspring.ioのブログ記事で示唆されているように、障害追跡のために使用されることは想定されていませんでした。ただし、現在のHTTPステータスにスパンからアクセスすることは可能ですか、それともHTTPヘッダー全体に適していますか?この場合、私はエラー状態のリクエストだけをzipkinに報告することができました。 – Danny

    +1

    それは本当ではありません。 * Sleuthを使用して障害を追跡することもできます。サンプリングのために、Zipkinでは(デフォルトで)トレースの10%しか表示されないので、実際にサンプリングすると失敗をトレースできることを覚えておいてください。 1.2.0 Sleuthバージョンでは、手荷物を使用することができます。そこにはあなたが望むものを置くことができ、そのコンテキストはシステム全体を通してさらに伝播します。 –

    +0

    @marcin isSampledはすべてのスパンに対して呼び出されますか?私がPercentageBasedSamplerのインプラントを見ると、トレース中にスパンが逃してしまう可能性があります。それは正しくないですか? –

    関連する問題