Heim > Backend-Entwicklung > Golang > Protokollierungsclient im Interceptor der Golang-Grpc-Servermethode wiederverwenden

Protokollierungsclient im Interceptor der Golang-Grpc-Servermethode wiederverwenden

PHPz
Freigeben: 2024-02-06 09:03:12
nach vorne
443 Leute haben es durchsucht

在 Golang grpc 服务器方法的拦截器中重用日志客户端

Frageninhalt

Ich baue einen GRPC-Server mit Go. Derzeit bietet der Server drei Methoden:

  • Senden Sie Ihre Aufgabe
  • Auftrag abbrechen
  • Stellenstatus abrufen

Ich verwende Datadog, um einige Kennzahlen wie die Anzahl der Anfragen, die Dauer usw. zu protokollieren. Die Submitjob-Methode sieht folgendermaßen aus:

func (s *myserver) submitjob(ctx context.context, request *submitjobrequest) (*submitjobresponse, error) {
        s.dd_client.logrequestcount("submitjob")
        start_time := time.now()
        defer s.dd_client.logrequestduration("submitjob", time.since(start_time))

        resp := somefunc()

    return resp, nil
}
Nach dem Login kopieren

Der Protokollierungscode in diesen drei verschiedenen Servermethoden ist nahezu identisch. Deshalb möchte ich wissen, wie ich diese Doppelarbeit vermeiden kann.

Mir ist aufgefallen, dass Golang Grpc das Konzept von Abfangjägern hat. Grundsätzlich kann ich eine Interceptor-Funktion definieren und sie für die Vor-/Nachbearbeitung von Servermethodenaufrufen verwenden.

Im Anschluss an die Dokumentation habe ich einen Interceptor wie folgt geschrieben:

func unaryInterceptor(ctx context.Context,
    req interface{},
    info *grpc.UnaryServerInfo,
    handler grpc.UnaryHandler,
) (interface{}, error) {
    dd_client := NewDatadogClient()
    defer dd_client.Close()

        dd_client.LogRequestCount(info.FullMethod)

        start_time := time.Now()

    resp, err := handler(ctx, req)

        dd_client.LogRequestDuration(info.FullMethod, time.Since(start_time))

    return resp, err
}
Nach dem Login kopieren

Das Problem besteht darin, dass jedes Mal, wenn der Interceptor aufgerufen wird, ein neuer Datadog-Client erstellt und zerstört wird. Ich denke, das ist unnötig. Aber da unaryinterceptor nur eine Methode und keine Klasse ist, sehe ich keine Möglichkeit, den Datadog-Client einmal zu erstellen und ihn später wiederzuverwenden? Gibt es eine Möglichkeit, meine Bedürfnisse zu erfüllen?


Richtige Antwort


Ja, erstellen Sie es nicht sofort, sondern verschieben Sie es in eine andere Datei/ein anderes Paket, nennen wir es datadog.go

Sie müssen es als Singleton deklarieren, damit es in allen Verwendungen wie ... nur einen Zeiger hat

(Ich verwende den Typ „datadogtype“, um auf den von der Funktion „newdatadogclient“ zurückgegebenen Datentyp zu verweisen. Bitte geben Sie das Paket und die Version an, um einen genaueren Beispielcode zu erhalten.)

//your package code....


var dataDog DataDogType

//access it through a wrapper, the wrapper will init the var the first time, 
//the remaining times it will be reused

func GetDataDog()(*DataDogType) {

if dataDog == nil {
    dataDog = NewDatadogClient()
}


return dataDog

}
Nach dem Login kopieren
Wenn Sie ihn nun je nach Anwendungsfall als Zeiger zurückgeben und schließen, schließen Sie ihn für alle Zwecke. Geben Sie also den Zeiger selbst zurück und lassen Sie den Teil weg, der ihn schließt, oder geben Sie den Wert zurück, sodass es eine Kopie davon ist das Original

Übrigens, können Sie uns mitteilen, welche Datadog-Version und welches spezifische Paket Sie verwenden?

Das obige ist der detaillierte Inhalt vonProtokollierungsclient im Interceptor der Golang-Grpc-Servermethode wiederverwenden. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage