マイクロサービス環境では、ビジネスプロセス全体ですべてのマイクロサービスインスタンスを介して要求をトレースする2つの主な利点があります。ビジネスケースZipkinで Spring Sleuth-Tracing Failures
最初の問題を解決するツールは、そこにあるの技術的障害の根、かどうかを見つけるかに関する
- 検索待ち時間のギャップ。しかし、どのようにトレースを使用して、マイクロサービス環境の不具合を明らかにすることができますか?私は間違いなく、すべてのエラーに直面しているスパンをトレースしたいが、何も間違っていない各リクエストではない。 前述のように、カスタムサンプラーを使用することができる。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_"タグでスパンにタグを付けるのも正しい方法ですか?
いいえ、その後、私はSampler.isSampled(スパンスパン)を誤解しました。これは、マイクロサービスのバリアに当たる最初のスパンだけがサンプラーによって検討されているためです。私は答えました.Sunuthはspring.ioのブログ記事で示唆されているように、障害追跡のために使用されることは想定されていませんでした。ただし、現在のHTTPステータスにスパンからアクセスすることは可能ですか、それともHTTPヘッダー全体に適していますか?この場合、私はエラー状態のリクエストだけをzipkinに報告することができました。 – Danny
それは本当ではありません。 * Sleuthを使用して障害を追跡することもできます。サンプリングのために、Zipkinでは(デフォルトで)トレースの10%しか表示されないので、実際にサンプリングすると失敗をトレースできることを覚えておいてください。 1.2.0 Sleuthバージョンでは、手荷物を使用することができます。そこにはあなたが望むものを置くことができ、そのコンテキストはシステム全体を通してさらに伝播します。 –
@marcin isSampledはすべてのスパンに対して呼び出されますか?私がPercentageBasedSamplerのインプラントを見ると、トレース中にスパンが逃してしまう可能性があります。それは正しくないですか? –