Zipkin と Yeter を使用して Beego に分散トレーシングを実装する
マイクロサービスの人気に伴い、分散システムの開発はますます一般的になってきました。ただし、分散システムは、さまざまなサービス間のリクエストのフローを追跡する方法、サービスのパフォーマンスを分析して最適化する方法など、新たな課題ももたらします。これらの点で、分散トレーシング ソリューションはますます重要なコンポーネントになっています。この記事では、Zipkin と Yeter を使用して Beego に分散トレーシングを実装する方法を紹介します。
複数のサービスにわたるリクエストのトレースは、分散トレースの主な目的です。一元化されたログ ストリームやメトリック ストリームでは、サービス間の相関関係を提供できないため、この問題を解決できません。リクエストには複数のサービスの連携が必要な場合があり、これらのサービスは他のサービスの応答時間と動作を認識している必要があります。従来のアプローチでは、さまざまなメトリクスをログに記録し、しきい値を緩和してリクエスト受信時のブロックを回避します。ただし、このアプローチでは、不具合やパフォーマンスの問題などの問題が隠れてしまう可能性があります。分散トレーシングは、サービス間のリクエスト トレースのソリューションです。このアプローチでは、リクエストがサービス間を流れるとき、各サービスはリクエスト全体を追跡する一連の ID を生成します。
Beego で分散トレーシングを実装する方法を見てみましょう。
Zipkin と Yeter は、現在最も人気のある分散トレース ソリューションです。どちらのツールも OpenTracing API をサポートしているため、開発者はサービス全体で一貫した方法でリクエストをログに記録し、追跡することができます。
まず、Zipkin または Yeter をインストールして起動し、Beego アプリケーションで分散トレーシングを構成する必要があります。この記事ではZipkinを使用します。
Zipkin をインストールします:
curl -sSL https://zipkin.io/quickstart.sh | bash -s java -jar zipkin.jar
Zipkin が起動すると、http://localhost:9411 経由で Web UI にアクセスできます。
次に、Beego に OpenTracing API のサポートを追加する必要があります。 opentracing-go パッケージを使用し、それが提供する API を使用してサービス間のリクエストやその他のイベントをログに記録できます。トラッキング コードの例は次のとおりです。
import ( "github.com/opentracing/opentracing-go" ) func main() { // Initialize the tracer tracer, closer := initTracer() defer closer.Close() // Start a new span span := tracer.StartSpan("example-span") // Record some events span.SetTag("example-tag", "example-value") span.LogKV("example-key", "example-value") // Finish the span span.Finish() } func initTracer() (opentracing.Tracer, io.Closer) { // Initialize the tracer tracer, closer := zipkin.NewTracer( zipkin.NewReporter(httpTransport.NewReporter("http://localhost:9411/api/v2/spans")), zipkin.WithLocalEndpoint(zipkin.NewEndpoint("example-service", "localhost:80")), zipkin.WithTraceID128Bit(true), ) // Set the tracer as the global tracer opentracing.SetGlobalTracer(tracer) return tracer, closer }
上記の例では、最初に Zipkin トラッカーを初期化し、それを使用していくつかのイベントを記録します。タグとキーと値のペアを追加し、span.Finish() を呼び出すことでスパンを終了できます。
次に、分散トレーシングを Beego アプリケーションに追加しましょう。
まず、opentracing-go と zipkin-go-opentracing の依存関係を追加しましょう。これは、go mod を使用するか、手動でパッケージをインストールすることで実行できます。
go get github.com/opentracing/opentracing-go go get github.com/openzipkin/zipkin-go-opentracing
次に、Beego アプリケーションで Zipkin トラッカーと Beego トラッカー ミドルウェアを初期化する必要があります。以下は、Beego トレーサー ミドルウェアのサンプル コードです。
import ( "net/http" "github.com/astaxie/beego" opentracing "github.com/opentracing/opentracing-go" "github.com/openzipkin/zipkin-go-opentracing" ) func TraceMiddleware() func(http.ResponseWriter, *http.Request, http.HandlerFunc) { return func(w http.ResponseWriter, r *http.Request, next http.HandlerFunc) { // Initialize the tracer tracer, closer := initTracer() defer closer.Close() // Extract the span context from the HTTP headers spanCtx, err := tracer.Extract(opentracing.HTTPHeaders, opentracing.HTTPHeadersCarrier(r.Header)) if err != nil && err != opentracing.ErrSpanContextNotFound { beego.Error("failed to extract span context:", err) } // Start a new span span := tracer.StartSpan(r.URL.Path, ext.RPCServerOption(spanCtx)) // Set some tags span.SetTag("http.method", r.Method) span.SetTag("http.url", r.URL.String()) // Inject the span context into the HTTP headers carrier := opentracing.HTTPHeadersCarrier(r.Header) if err := tracer.Inject(span.Context(), opentracing.HTTPHeaders, carrier); err != nil { beego.Error("failed to inject span context:", err) } // Set the span as a variable in the request context r = r.WithContext(opentracing.ContextWithSpan(r.Context(), span)) // Call the next middleware/handler next(w, r) // Finish the span span.Finish() } } func initTracer() (opentracing.Tracer, io.Closer) { // Initialize the Zipkin tracer report := zipkinhttp.NewReporter("http://localhost:9411/api/v2/spans") defer report.Close() endpoint, err := zipkin.NewEndpoint("example-service", "localhost:80") if err != nil { beego.Error("failed to create Zipkin endpoint:", err) } nativeTracer, err := zipkin.NewTracer( report, zipkin.WithLocalEndpoint(endpoint), zipkin.WithTraceID128Bit(true)) if err != nil { beego.Error("failed to create Zipkin tracer:", err) } // Initialize the OpenTracing API tracer tracer := zipkinopentracing.Wrap(nativeTracer) // Set the tracer as the global tracer opentracing.SetGlobalTracer(tracer) return tracer, report }
上記のサンプル コードでは、TraceMiddleware という名前のミドルウェアを定義します。このミドルウェアは、HTTP ヘッダー (存在する場合) から既存の追跡コンテキストを抽出し、それを使用してリクエストの新しいトラッカーを作成します。また、他のすべてのミドルウェアとハンドラーがそれにアクセスできるように、リクエスト コンテキストでスパンを設定します。最後に、ハンドラーの実行が終了した後、スパンでfinish() メソッドを呼び出します。これにより、Zipkin は、要求されたすべてのサービスにわたる相互依存関係の追跡を記録できるようになります。
このミドルウェアを Beego ルーターに接続する必要もあります。これは、ルーターの初期化コードで次のコードを使用して実行できます。
beego.InsertFilter("*", beego.BeforeRouter, TraceMiddleware())
ここで、Beego アプリケーションを起動し、http://localhost:9411 にアクセスして Zipkin UI を開いて追跡データを表示します。
Beego アプリケーションに分散トレーシングを実装するのは複雑に思えるかもしれませんが、opentracing-go ライブラリと zipkin-go-opentracing ライブラリを使用することで、この機能を簡単に追加できます。これは、サービスの数と複雑さが増加し続けるにつれてますます重要になり、サービスがどのように連携して機能するかを理解し、リクエスト処理プロセス全体で適切に動作することを保証できるようになります。
以上がZipkin と Yeter を使用して Beego に分散トレーシングを実装するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。