Trace-Sampling bestimmt, welche Anfragen und Spans von Cloud Trace aufgenommen werden. So können Sie Speicherkosten kontrollieren und Quotas einhalten und gleichzeitig genügend Daten erfassen, um Probleme mit der Anwendungsleistung zu beheben. Wenn jeder Span in einer End-to-End-Anfrage aufgezeichnet wird, ist der Trace vollständig. Um jedoch hohe Anfragevolumen zu verwalten, werden in verteilten Tracing-Systemen in der Regel nur Stichproben von Traces erhoben oder die Sampling-Entscheidungen der übergeordneten Spans übernommen.
Sampling unterscheidet sich von der Kontextweitergabe. Beim Sampling wird festgelegt, ob eine Komponente Spandaten aufzeichnet. Bei der Kontextweitergabe werden Trace-IDs zwischen Komponenten weitergegeben, damit Stichproben von Spans verknüpft werden können.
Sampling-Strategien
Sampling-Entscheidungen können entweder auf dem Head oder dem Tail basieren. Beim Head-basierten Sampling wird die Sampling-Entscheidung getroffen, wenn die Anfrage von der Komponente empfangen wird, die den Span verarbeitet. Beim Tail-basierten Sampling wird die Sampling-Entscheidung erst getroffen nachdem der gesamte Trace verfügbar ist.
In der Dokumentation für verteilte Tracing-Systeme wird möglicherweise der Begriff „100% Sampling“ verwendet. Dieser Begriff kann sich auf einen Trace oder eine Komponente beziehen. Wenn er auf einen Trace angewendet wird, bedeutet das, dass alle Spans als Stichprobe erhoben wurden oder dass der Trace vollständig ist. Wenn er auf eine Komponente angewendet wird, bedeutet das, dass die Komponente jeden Span als Stichprobe erhebt, den sie verarbeitet.
Head-basiertes Sampling
Head-basierte Sampler werden in der Regel so konfiguriert, dass sie immer Spans als Stichprobe erheben oder eine probabilistische Sampling-Strategie verwenden:
Bei Konfigurationen mit immer Stichprobe erheben erheben Komponenten, die Trace-Daten verarbeiten und schreiben, jeden Span als Stichprobe. Im Idealfall sind alle Traces vollständig und Sie haben die Informationen, die Sie zur Fehlerbehebung benötigen. Eine Konfiguration mit „immer Stichprobe erheben“ kann jedoch dazu führen, dass Sie Quotas oder Ihre Grenzwerte für Speicherkosten überschreiten.
Beim probabilistischen Sampling werden nicht alle Spans als Stichprobe erhoben. Das tatsächliche Verhalten hängt von der Implementierung der Komponente ab. In einigen Implementierungen haben alle Spans die gleiche Wahrscheinlichkeit, als Stichprobe erhoben zu werden. In anderen Implementierungen beeinflusst die Sampling-Entscheidung des übergeordneten Elements, ob ein Span als Stichprobe erhoben wird.
Ein Trace enthält möglicherweise nicht alle Spans. Wenn Sie probabilistisches Sampling verwenden, Quotas überschreiten oder Komponenten verwenden, die Spans verarbeiten, aber nicht als Stichprobe erheben, sind unvollständige Traces zu erwarten.
Tail-basiertes Sampling
Cloud Trace unterstützt kein Tail-basiertes Sampling. Sampling-Entscheidungen müssen in den Komponenten getroffen werden, die Daten an Cloud Trace senden.
Wenn Sie Tail-basiertes Sampling verwenden, können Sie auch einen Zwischenserver verwenden, um Trace-Daten zu empfangen, Sampling-Entscheidungen zu treffen und Stichproben von Spans an Trace weiterzuleiten. Sie können beispielsweise einen OpenTelemetry Collector mit dem Tail Sampling Processor verwenden, um eine verzögerte Sampling-Entscheidung zu treffen.
Wenn Sie Tail-Sampling verwenden möchten, beachten Sie Folgendes:
- Sie müssen alle Spans in einem Trace speichern, bevor Sie eine Sampling-Entscheidung treffen. Daher benötigen Sie möglicherweise viel temporären Speicher oder es entstehen andere Kosten.
- Im Allgemeinen müssen alle Komponenten, die Spans für einen Trace generieren können, koordiniert werden. In der Regel leiten Entwickler, die OpenTelemetry verwenden, alle Spans für dieselbe Trace-ID an denselben Collector weiter.
Komponenten treffen Sampling-Entscheidungen
Jede Komponente entscheidet selbst, ob der von ihr verarbeitete Span als Stichprobe erhoben werden soll. Die Sampling-Entscheidung des übergeordneten Elements, die der Komponente möglicherweise über den Trace-Kontext zur Verfügung steht, kann jedoch die Entscheidung der Komponente beeinflussen. Anwendungen, die den
traceparent Header verwenden, können die Sampling
Entscheidung des übergeordneten Elements mit dem sampled Flag weitergeben.
Angenommen, jede Komponente hat eine Regel, die besagt: „Wenn der übergeordnete Span als Stichprobe erhoben wird, erhebe den aktuellen Span als Stichprobe. Andernfalls erhebe 50% der Spans als Stichprobe.“ In diesem Szenario gilt Folgendes:
- Der Stamm-Span bestimmt, ob alle Spans im Trace als Stichprobe erhoben werden.
- Wenn der Stamm-Span als Stichprobe erhoben wird, werden alle Spans im Trace als Stichprobe erhoben. Daher ist der Trace vollständig.
Sampling und Google Cloud Dienste
Jeder Google Cloud Dienst trifft seine eigenen Sampling-Entscheidungen, und nicht alle Google Cloud Dienste erheben Stichproben. Das heißt, ein Dienst sendet möglicherweise nie Daten an Cloud Trace.
Wenn Sampling von einem Google Cloud Dienst unterstützt wird, implementiert dieser Dienst in der Regel Folgendes:
- Eine Standard-Sampling-Rate.
- Ein Mechanismus, mit dem die Sampling-Entscheidung des übergeordneten Elements als Hinweis darauf verwendet werden kann, ob der Span als Stichprobe erhoben werden soll.
- Maximale Sampling-Rate.
Wenn Sie möchten, dass ein Google Cloud Dienst Unterstützung für Sampling hinzufügt, verwenden Sie den Google Issue Tracker.
Nächste Schritte
Eine Diskussion darüber, wie Sie eine Sampling-Strategie nach Spannamen auswählen können, finden Sie unter Jaeger-Remote-Sampling.
Wir empfehlen Ihnen, die folgende Open-Source-Dokumentation zu lesen, um zu ermitteln, welcher Sampling-Ansatz für Ihre Anwendungen in der Entwicklung und bereitgestellten Anwendungen am besten geeignet ist:
Google Cloud Dienstdokumentation: