Stackdriver Trace mit Google Cloud Run

8

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?

Wietse Venema
quelle
2
Was für eine gut geschriebene Frage !!! Nett! Danke dafür.
Kolban
1
Siehe auch
Grayside

Antworten:

1

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.Flush

Ich 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.

AhmetB - Google
quelle
Die aktuelle Node.js Tracing Agent Bibliothek hat keine Flush-Methode :(
Daniel Goldberg
1
Ich denke, dies wäre eine gültige Problemanfrage an das GitHub-Repository. Auch ein gültiger Anwendungsfall für diejenigen von uns bei Google, um eine Umfrage darüber durchzuführen, was dies unterstützt. Danke, dass du es angesprochen hast.
AhmetB - Google
2

Ist das ein hypothetisches Problem oder ein echtes Problem?

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:

  • Ein Cloud Run-Dienst empfängt häufig kontinuierlich oder häufig Anforderungen, was bedeutet, dass seine Containerinstanz entweder: kontinuierlich CPU hat oder von Zeit zu Zeit CPU verfügbar hat.
  • Es ist in Ordnung, Traces zu löschen: Wenn einige Traces nicht erfasst werden, weil die Instanz abgelehnt wurde, haben Sie wahrscheinlich zuvor genügend verschiedene Stichproben gesammelt. Möglicherweise interessieren Sie sich auch nur für die aggregierten Berichte. In diesem Fall spielt das Sammeln einzelner Spuren keine Rolle.

Beachten Sie, dass Trace-Bibliotheken normalerweise die zu verfolgenden Anforderungen selbst abtasten. Sie verfolgen selten 100% der Anforderungen.

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?

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.

Steren
quelle
1
Ich denke, diese Annahme fällt in einem Anwendungsfall wie der Verwendung von Cloud Run für Batch- / Cron-Jobs (z. B. einmal am Tag oder einmal alle 2 Stunden) um. Sie erhalten eine Anfrage, Sie legen die Abtastrate auf 100% fest, aber nach Abschluss der Anfrage besteht eine hohe Wahrscheinlichkeit, dass Sie diese einmal täglich verfolgten Trace-Daten übersehen.
AhmetB - Google