Ich habe mich mit einer Stackdriver Trace-Integration in Google Cloud Run befasst. Ich kann es mit dem Agenten zum Laufen bringen, aber ein paar Fragen stören mich.
Angesichts dessen
- Der Stackdriver-Agent aggregiert Traces in einem kleinen Puffer und sendet sie regelmäßig.
- Der CPU-Zugriff ist eingeschränkt, wenn ein Cloud Run-Dienst eine Anforderung nicht verarbeitet.
- Es gibt keinen Shutdown-Hook für Cloud Run-Dienste. Sie können den Puffer vor dem Herunterfahren nicht löschen: Der Container erhält nur ein SIGKILL . Dies ist ein Signal, das Sie von Ihrer Anwendung nicht abfangen können.
- Das Ausführen eines Hintergrundprozesses, der Informationen außerhalb des Anforderungs- / Antwortzyklus sendet, scheint gegen den Knative Container Runtime-Vertrag zu verstoßen
- Die Sammlung von Protokolldaten ist dokumentiert und erfordert nicht, dass ich einen Agenten ausführe, aber es gibt keine solche Lösung für die Telemetrie.
- Ich habe einen Bericht von jemandem gefunden, bei dem beim Cloud Run mithilfe des agentenbasierten Ansatzes verlorene Spuren festgestellt wurden
Wie macht Google das?
Ich ging in den Quellcode für das Cloud Endpoints ESP (die Cloud Run-Integration befindet sich in der Beta), um zu sehen, ob sie es auf andere Weise lösen, aber dort wird das gleiche Muster verwendet: Es gibt einen Puffer mit Traces (1s) und es wird regelmäßig gelöscht.
Frage
Während meine Tracing-Integration in meinem Test-Setup zu funktionieren scheint, mache ich mir Sorgen über unvollständige und fehlende Traces, wenn ich diese in einer Produktionsumgebung ausführe.
Ist das ein hypothetisches Problem oder ein echtes Problem?
Es sieht so aus, als ob der richtige Weg, dies zu erreichen, darin besteht, Telemetrie in Protokolle zu schreiben, anstatt einen Agentenprozess zu verwenden. Wird das mit Stackdriver Trace unterstützt?
quelle
Antworten:
Du hast recht. Dies ist ein faires Problem, da die meisten Ablaufverfolgungsbibliotheken dazu neigen, Ablaufverfolgungsbereiche im Hintergrund abzutasten / hochzuladen.
Da (1) Ihre CPU nahezu auf Null skaliert ist, wenn der Container keine Anforderungen verarbeitet, und (2) die Containerinstanz jederzeit aufgrund von Inaktivität beendet werden kann, können Sie die in Ihrer App gesammelten Ablaufverfolgungsbereiche nicht zuverlässig hochladen. Wie Sie sagten, kann es manchmal funktionieren, da wir die CPU nicht vollständig stoppen, aber es wird nicht immer funktionieren.
Es scheint, als könnten Sie mit einigen der Stackdriver-Bibliotheken (und / oder OpenTelemetry fka OpenCensus-Bibliotheken) den Lebenszyklus des Pushings von Trace-Bereichen steuern.
Dieses Go-Paket für den OpenCensus Stackdriver-Exporter verfügt beispielsweise über eine
Flush()
Methode, die Sie aufrufen können, bevor Sie Ihre Anforderung abschließen, anstatt sich auf die Laufzeit zu verlassen, um die Ablaufverfolgungsbereiche regelmäßig hochzuladen: https://godoc.org/contrib.go.opencensus.io/ Exporter / Stackdriver # Exporter.FlushIch gehe davon aus, dass andere Ablaufverfolgungsbibliotheken in anderen Sprachen ähnliche Flush () -Methoden verfügbar machen. Wenn nicht, lassen Sie es mich bitte in den Kommentaren wissen, und dies wäre eine gültige Funktionsanforderung an diese Bibliotheken.
quelle
Wenn Sie davon ausgehen, dass ein Cloud Run-Dienst eine einzelne Anforderung empfängt, ist dies definitiv ein Problem, da die Bibliothek keine Zeit hat, die Daten zu leeren, bevor die CPU der Containerinstanz gedrosselt wird.
In realen Anwendungsfällen:
Beachten Sie, dass Trace-Bibliotheken normalerweise die zu verfolgenden Anforderungen selbst abtasten. Sie verfolgen selten 100% der Anforderungen.
Nein, Stackdriver Trace bezieht seine Daten aus den an seine API gesendeten Bereichen. Beachten Sie, dass Sie zum Senden von Daten an Stackdriver Trace Bibliotheken wie OpenCenss und OpenTelemetry verwenden können. Proprietäre Stackdriver Trace-Bibliotheken werden nicht empfohlen.
quelle