JaegerとSpringBootアプリケーションの統合

(Himank Batra)(9月9日) 、2020)

JaegerとSpringBootアプリケーションの統合

最初にJaegerとは何かを理解しましょう

Jaegerはトランザクションをトレースするためのオープンソースソフトウェアです分散サービス間。

複雑なマイクロサービス環境の監視とトラブルシューティングに使用されます。

ライドシェアリング会社のUberは、2015年にオープンソースプロジェクトとしてJaegerを開発しました。クラウドとして承認されました。 2017年にNativeComputing Foundation(CNCF)インキュベーションプロジェクトを実施し、2019年に卒業ステータスに昇格しました。

分散トレースとは何ですか?

分散トレースは、thを確認して理解する方法です。マイクロサービス間の複雑な相互作用における一連のイベント全体。

最新のクラウドネイティブソフトウェア開発は、マイクロサービスに依存しています。マイクロサービスは、それぞれが異なるコア機能を提供する独立したサービスです。ユーザーがアプリでリクエストを行うと、多くの個別のサービスが応答して結果を生成します。

アプリでの1回の呼び出しで、相互作用する数十の異なるサービスを呼び出すことができます。何かがうまくいかなかったり、リクエストの実行が遅い場合、開発者やエンジニアはどのようにして問題を切り分けることができますか?すべての接続を追跡する方法が必要です。

分散トレースの出番です。多くの場合、マイクロサービスを管理および監視する方法であるサービスメッシュの一部として実行されます。

Jaegerは分散トレースを使用して、さまざまなマイクロサービスを介したリクエストのパスを追跡します。推測するのではなく、コールフローを視覚的に表現できます。

トランザクションに関する整理された情報は、デバッグと最適化に役立ちます。 Jaegerには、分散トランザクションを監視し、パフォーマンスとレイテンシを最適化し、問題解決の方法である根本原因分析(RCA)を実行するためのツールが含まれています。

Jaegerの用語およびコンポーネント

Jaegerは実行要求をトレースとして提示します。トレースは、システムを通過するデータ/実行パスを示します。

トレースは、1つ以上のスパンで構成されます。スパンは、イエーガーの論理的な作業単位です。各スパンには、操作名、開始時間、および期間が含まれます。スパンはネストして並べ替えることができます。

Jaegerには、スパンとトレースを収集、保存、視覚化するために連携するいくつかのコンポーネントが含まれています。

Jaegerクライアントには言語が含まれています-分散トレース用のOpenTracingAPIの特定の実装。これらは手動で、またはさまざまなオープンソースフレームワークで使用できます。

JaegerAgent は、ユーザーデータグラムプロトコルを介して送信されるスパンをリッスンするネットワークデーモンです。エージェントは、インストルメントされたアプリケーションと同じホストに配置されることを意図しています。これは通常、Kubernetesなどのコンテナ環境のサイドカーを介して実装されます。

JaegerCollector はスパンを受信し、処理のためにキューに入れます。

コレクタには永続ストレージバックエンドであるため、Jaegerにはスパンストレージ用のプラグ可能なメカニズムもあります。

クエリはストレージからトレースを取得するサービスです。

Jaeger Console は、分散トレースデータを視覚化できるユーザーインターフェースです。

Jaegerを選ぶ理由

オンザグラウンドのマイクロサービスの実践者がすぐに気付いているように、分散アーキテクチャに移行するときに発生する運用上の問題の大部分は、最終的にはネットワーキングと2つの領域に基づいています。可観測性。単一のモノリシックアプリケーションと比較して、絡み合った分散サービスのセットをネットワーク化してデバッグすることは、単に桁違いに大きな問題です。

Jaeger in Action

イェーガーをスプリングブートアプリケーションに統合します。

まず、スプリングブートアプリケーションを簡単にセットアップしましょう。

ここでのアイデアは、有名な科学者の名前と動物の名前を連結して名前を生成することです。

そこで、スプリングブートを使用して3つのマイクロサービスを構築します。 animal-name-service name-generator-service、および scientist-name-service

name-generator-serviceからの科学者と動物の連結名に対するクライアントリクエスト内部で animal-name-service scientist-name-service を呼び出します。

同じことが次の図に示されています。

マイクロサービスの例

spring initialize rを使用して、3つのマイクロサービスをすばやく構築しましょう。

SpringBootアプリケーションの生成中に spring-boot-starter-web 依存関係を追加します。

これで、3つのSpringBootアプリケーションの準備が整いました。これらの3つのマイクロサービスを opentracing-microservices-example という名前のフォルダーに追加しましょう。

そして、このフォルダーをお気に入りのエディターにインポートします。 IntelliJ を使用しています。

animal-name-service scientist-に電話する必要があるため name-generator-service のname-service

このためにクライアントを装うことを選択しています。それでは、 name-generator-service spring-cloud-starter-openfeign:2.2.3.RELEASE 依存関係を追加しましょう。

次のコードは3つのマイクロサービスすべて。

AnimalNameService

package com.example.ans;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.core.io.ClassPathResource;import org.springframework.http.HttpHeaders;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RequestHeader;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.util.List;import java.util.Random;import java.util.stream.Collectors;@SpringBootApplication
public class AnimalNameService {public static void main(String[] args) {SpringApplication.run(AnimalNameService.class, args);}}@RestController
@RequestMapping("/api/v1/animals")
class AnimalNameResource {private final List animalNames;private Random random;public AnimalNameResource() throws IOException {InputStream inputStream = new ClassPathResource("/animals.txt").getInputStream();try (BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))) {animalNames = reader.lines().collect(Collectors.toList());}random = new Random();}@GetMapping(path = "/random")
public String name(@RequestHeader HttpHeaders headers) {String name = animalNames.get(random.nextInt(animalNames.size()));return name;}}

application.properties:

server.port=9000

NameGeneratorService:

ここでは、 com.shekhargulati:strman:0.4を使用しています.0 動物と科学者の名前をケバブケースに変換するためのライブラリ。

application.properties:

server.port=8080scientist.service.prefix.url=http://localhost:8090animal.service.prefix.url=http://localhost:9000

ScientificsNameService:

package com.example.sns;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.core.io.ClassPathResource;import org.springframework.http.HttpHeaders;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RequestHeader;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.util.List;import java.util.Random;import java.util.stream.Collectors;@SpringBootApplication
public class ScientistNameService {public static void main(String[] args) {SpringApplication.run(ScientistNameService.class, args);}}@RestController
@RequestMapping("/api/v1/scientists")
class ScientistNameResource {private final List scientistsNames;private Random random;public ScientistNameResource() throws IOException {InputStream inputStream = new ClassPathResource("/scientists.txt").getInputStream();try (BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))) {scientistsNames = reader.lines().collect(Collectors.toList());}random = new Random();}@GetMapping(path = "/random")
public String name(@RequestHeader HttpHeaders headers) {String name = scientistsNames.get(random.nextInt(scientistsNames.size()));return name;}}

application.properties :

server.port=8090

次に、3つのアプリケーションすべてを実行し、 http:// localhost:8080 / api / v1 / namesに移動します。 / random ブラウザで。

ランダムな名前の例をいくつか取得します: john-cockcroft-snapping-turtle

これで、アプリケーションがセットアップが完了しました。

次に、jaegerをこれらのアプリケーションに統合して、traを実行できるようにします。各リクエストを処理します。

3つのpom.xmlすべてに以下の依存関係を追加する必要があります。

そして3つのアプリケーションすべてのapplication.propertiesファイルに以下のプロパティを追加する必要があります。

次のコマンドを使用してDockerでJaegerを実行します:

docker run -p 9090:16686 — name jaeger -d jaegertracing/all-in-one:1.17

ここで、アプリケーションを再起動します。そして、ブラウザでlocalhost:9090に移動します。イェーガーのホームページが表示されます。

また、ブラウザで http:// localhost:8080 / api / v1 / names / random にアクセスします。同様に、ランダムな名前が付けられます。

しかし、これでリクエストを追跡できます。イェーガーダッシュボードをチェックインして、サービス name-generator-service

を選択し、[トレースの検索]をクリックします。以下の画像に示すように、 name-generator-service のトレースが取得されます。

Jaeger Name Generator Service

これをドリルダウンすると、5つのスパンがあることがはっきりとわかります。

name-generator-service(1 span)

name-generator-service-> animal-name-service(2 spans)

name-generator-service-> Scientific- name-service(2スパン)

これを下の画像に示します。

Jaeger Name Generator Service Trace

ここでは、すべてが opentracing-spring-jaeger-cloud-starter 基本的に魔法を実行する TracingAspectという名前のクラスを持つライブラリ。

Dockerfile、docker-compose、docker-を追加しました。このアプリケーションの実行を容易にするためのsetup.sh。コードをチェックアウトし、docker-setup.shを直接実行します。

コードはGithubリポジトリ

リンクにあります。

これは、 ShekharGulatiのブログに触発されています。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です