ホームページ  >  記事  >  バックエンド開発  >  Zipkin と Yeter を使用して Beego に分散トレーシングを実装する

Zipkin と Yeter を使用して Beego に分散トレーシングを実装する

WBOY
WBOYオリジナル
2023-06-22 15:22:06783ブラウズ

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。