Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Menggunakan Zipkin dan Jaeger untuk melaksanakan pengesanan teragih dalam Beego

Menggunakan Zipkin dan Jaeger untuk melaksanakan pengesanan teragih dalam Beego

WBOY
WBOYasal
2023-06-22 15:22:06741semak imbas

Menggunakan Zipkin dan Jaeger untuk melaksanakan pengesanan teragih dalam Beego

Dengan populariti perkhidmatan mikro, pembangunan sistem teragih telah menjadi semakin biasa. Walau bagaimanapun, sistem yang diedarkan juga membawa cabaran baharu, seperti cara menjejak aliran permintaan antara pelbagai perkhidmatan, cara menganalisis dan mengoptimumkan prestasi perkhidmatan, dsb. Dalam hal ini, penyelesaian pengesanan yang diedarkan telah menjadi komponen yang semakin penting. Artikel ini akan memperkenalkan cara menggunakan Zipkin dan Jaeger untuk melaksanakan pengesanan teragih dalam Beego.

Permintaan pengesanan merentas berbilang perkhidmatan ialah matlamat utama pengesanan teragih. Aliran log berpusat atau aliran metrik tidak dapat menyelesaikan masalah ini kerana aliran ini tidak dapat memberikan korelasi antara perkhidmatan. Permintaan mungkin memerlukan berbilang perkhidmatan untuk berfungsi bersama, dan perkhidmatan ini mesti mengetahui masa tindak balas dan gelagat perkhidmatan lain. Pendekatan tradisional adalah untuk mencatat pelbagai metrik dan kemudian melonggarkan ambang untuk mengelakkan sekatan apabila menerima permintaan. Tetapi pendekatan ini boleh menyembunyikan masalah seperti gangguan dan isu prestasi. Pengesanan teragih ialah penyelesaian untuk pengesanan permintaan silang perkhidmatan. Dalam pendekatan ini, apabila permintaan mengalir antara perkhidmatan, setiap perkhidmatan menjana satu siri ID yang akan menjejaki keseluruhan permintaan.

Mari lihat cara melaksanakan pengesanan teragih dalam Beego.

Zipkin dan Jaeger kini merupakan penyelesaian pengesanan teragih yang paling popular. Kedua-dua alatan menyokong OpenTracing API, membolehkan pembangun log dan mengesan permintaan merentas perkhidmatan dengan cara yang konsisten.

Pertama, kita perlu memasang dan memulakan Zipkin atau Jaeger, dan kemudian mengkonfigurasi pengesanan teragih dalam aplikasi Beego. Dalam artikel ini, kami akan menggunakan Zipkin.

Pasang Zipkin:

curl -sSL https://zipkin.io/quickstart.sh | bash -s
java -jar zipkin.jar

Setelah Zipkin dilancarkan, anda boleh mengakses UI webnya melalui http://localhost:9411.

Seterusnya, kami perlu menambah sokongan untuk OpenTracing API dalam Beego. Kami boleh menggunakan pakej opentracing-go dan log permintaan silang perkhidmatan dan acara lain menggunakan API yang disediakannya. Contoh kod penjejakan adalah seperti berikut:

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
}

Dalam contoh di atas, kami mula-mula memulakan penjejak Zipkin dan kemudian menggunakannya untuk merekodkan beberapa acara. Kita boleh menambah teg dan pasangan nilai kunci dan menamatkan span dengan memanggil span.Finish().

Sekarang, mari tambahkan pengesanan teragih pada aplikasi Beego kami.

Pertama, mari tambahkan kebergantungan opentracing-go dan zipkin-go-opentracing. Kita boleh melakukan ini menggunakan mod go atau memasang pakej secara manual.

go get github.com/opentracing/opentracing-go
go get github.com/openzipkin/zipkin-go-opentracing

Kemudian, kita perlu memulakan perisian tengah penjejak Zipkin dan penjejak Beego dalam aplikasi Beego. Berikut ialah kod sampel untuk perisian tengah pengesan 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
}

Dalam kod sampel di atas, kami mentakrifkan perisian tengah bernama TraceMiddleware. Perisian tengah ini akan mengekstrak konteks penjejakan sedia ada daripada pengepala HTTP (jika ada) dan menggunakannya untuk mencipta penjejak baharu untuk permintaan tersebut. Kami juga menetapkan rentang dalam konteks permintaan supaya semua perisian tengah dan pengendali lain boleh mengaksesnya. Akhir sekali, selepas pelaksanaan pengendali tamat, kami memanggil kaedah finish() pada span supaya Zipkin boleh merekodkan penjejakan saling bergantung merentas semua perkhidmatan yang diminta.

Kami juga perlu melampirkan perisian tengah ini pada penghala Beego kami. Kita boleh melakukan ini menggunakan kod berikut dalam kod permulaan penghala:

beego.InsertFilter("*", beego.BeforeRouter, TraceMiddleware())

Sekarang, lancarkan aplikasi Beego anda dan lawati http://localhost:9411 untuk membuka UI Zipkin untuk melihat data penjejakan.

Melaksanakan pengesanan teragih dalam aplikasi Beego mungkin kelihatan rumit, tetapi dengan menggunakan perpustakaan opentracing-go dan zipkin-go-opentracing, kami boleh menambah fungsi ini dengan mudah. Ini menjadi semakin penting apabila kami terus meningkatkan bilangan dan kerumitan perkhidmatan kami, membolehkan kami memahami cara perkhidmatan kami berfungsi bersama dan memastikan ia berfungsi dengan baik sepanjang proses pengendalian permintaan.

Atas ialah kandungan terperinci Menggunakan Zipkin dan Jaeger untuk melaksanakan pengesanan teragih dalam Beego. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn