Maison >développement back-end >Golang >Utiliser Zipkin et Jaeger pour implémenter le traçage distribué dans Beego

Utiliser Zipkin et Jaeger pour implémenter le traçage distribué dans Beego

WBOY
WBOYoriginal
2023-06-22 15:22:06817parcourir

Utiliser Zipkin et Jaeger pour implémenter le traçage distribué dans Beego

Avec la prévalence des microservices, le développement de systèmes distribués est devenu de plus en plus courant. Cependant, les systèmes distribués apportent également de nouveaux défis, comme comment suivre le flux de demandes entre différents services, comment analyser et optimiser les performances des services, etc. À cet égard, les solutions de traçage distribuées sont devenues un élément de plus en plus important. Cet article explique comment utiliser Zipkin et Jaeger pour implémenter le traçage distribué dans Beego.

Demander un traçage sur plusieurs services est l'objectif principal du traçage distribué. Les flux de journaux ou de métriques centralisés ne peuvent pas résoudre ce problème car ces flux ne peuvent pas assurer la corrélation entre les services. Une demande peut nécessiter la collaboration de plusieurs services, et ces services doivent être conscients des temps de réponse et du comportement des autres services. L'approche traditionnelle consiste à enregistrer diverses métriques, puis à assouplir les seuils pour éviter le blocage lors de la réception de demandes. Mais cette approche peut cacher des problèmes tels que des problèmes et des problèmes de performances. Le traçage distribué est une solution de traçage des demandes interservices. Dans cette approche, lorsqu'une requête circule entre les services, chaque service génère une série d'identifiants qui suivront l'intégralité de la requête.

Voyons comment implémenter le traçage distribué dans Beego.

Zipkin et Jaeger sont actuellement les solutions de traçage distribuées les plus populaires. Les deux outils prennent en charge l'API OpenTracing, permettant aux développeurs de consigner et de tracer les requêtes entre les services de manière cohérente.

Tout d'abord, nous devons installer et démarrer Zipkin ou Jaeger, puis configurer le traçage distribué dans l'application Beego. Dans cet article, nous utiliserons Zipkin.

Installez Zipkin :

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

Une fois Zipkin lancé, vous pouvez accéder à son interface utilisateur Web via http://localhost:9411.

Ensuite, nous devons ajouter la prise en charge de l'API OpenTracing dans Beego. Nous pouvons utiliser le package opentracing-go et enregistrer les demandes interservices et autres événements à l'aide de l'API qu'il fournit. Un exemple de code de suivi est le suivant :

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
}

Dans l'exemple ci-dessus, nous initialisons d'abord le tracker Zipkin, puis nous l'utilisons pour enregistrer certains événements. Nous pouvons ajouter des balises et des paires clé-valeur et terminer la période en appelant span.Finish().

Maintenant, ajoutons le traçage distribué à notre application Beego.

Tout d’abord, ajoutons les dépendances opentracing-go et zipkin-go-opentracing. Nous pouvons le faire en utilisant go mod ou en installant manuellement des packages.

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

Ensuite, nous devons initialiser le middleware Zipkin tracker et Beego tracker dans l'application Beego. Voici un exemple de code pour le middleware Beego tracer :

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
}

Dans l'exemple de code ci-dessus, nous définissons un middleware appelé TraceMiddleware. Ce middleware extraira le contexte de suivi existant de l'en-tête HTTP (le cas échéant) et l'utilisera pour créer un nouveau tracker pour la requête. Nous définissons également la durée dans le contexte de la requête afin que tous les autres middlewares et gestionnaires puissent y accéder. Enfin, une fois l'exécution du gestionnaire terminée, nous appelons la méthode finish() sur le span afin que Zipkin puisse enregistrer le suivi des interdépendances entre tous les services demandés.

Nous devons également connecter ce middleware à notre routeur Beego. Nous pouvons le faire en utilisant le code suivant dans le code d'initialisation du routeur :

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

Maintenant, lancez votre application Beego et visitez http://localhost:9411 pour ouvrir l'interface utilisateur Zipkin et afficher les données de suivi.

Implémenter le traçage distribué dans les applications Beego peut paraître compliqué, mais en utilisant les bibliothèques opentracing-go et zipkin-go-opentracing, nous pouvons facilement ajouter cette fonctionnalité. Cela devient de plus en plus important à mesure que nous continuons à augmenter le nombre et la complexité de nos services, ce qui nous permet de comprendre comment nos services fonctionnent ensemble et de garantir leur bon fonctionnement tout au long du processus de traitement des demandes.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn