Ce document présente le concept d'échantillonnage, qui détermine si les données d'un span sont envoyées à Cloud Trace. Lorsqu'un segment est envoyé à Cloud Trace, il est échantillonné. Une trace est complète lorsque les données de chaque span sont enregistrées. Toutefois, les traces comportent souvent des spans manquants, car chaque composant instrumenté d'un système de traçage distribué décide indépendamment d'enregistrer ou non le span qu'il traite.
Bien que chaque composant décide lui-même si le segment qu'il traite est échantillonné, cette décision peut être influencée par la décision d'échantillonnage du parent. Par exemple, supposons que chaque composant dispose d'une règle qui stipule "si le segment parent est échantillonné, échantillonnez le segment actuel ; sinon, échantillonnez 50% des segments". Dans ce scénario, les conditions suivantes sont remplies :
- Le span racine détermine si tous les spans de la trace sont échantillonnés.
- Lorsque le span racine est échantillonné, tous les spans de la trace le sont également. La trace est donc complète.
Les composants peuvent transmettre leur décision d'échantillonnage à l'enfant en utilisant le contexte.
Par exemple, dans l'en-tête traceparent du World Wide Web Consortium (W3C), le indicateur sampled stocke la décision d'échantillonnage du parent.
Ne confondez pas l'échantillonnage avec la propagation du contexte. L'échantillonnage indique si un composant enregistre des données sur une portée. La propagation du contexte fait référence à la transmission d'informations sur la portée, telles que l'ID de portée, aux composants enfants.
Stratégies d'échantillonnage
Les décisions d'échantillonnage peuvent être basées sur l'en-tête ou la fin de la requête. Dans l'échantillonnage basé sur l'en-tête, la décision d'échantillonnage est prise lorsque la requête est reçue par le composant qui traite la portée. Dans l'échantillonnage basé sur la fin de la trace, la décision d'échantillonnage est différée jusqu'à ce que la trace complète soit disponible.
Vous pouvez rencontrer l'expression "échantillonnage à 100 %" dans la documentation des systèmes de traçage distribué. Cette expression peut s'appliquer à une trace ou à un composant. Lorsqu'il est appliqué à une trace, cela signifie que tous les spans ont été échantillonnés ou, de manière équivalente, que la trace est complète. Lorsqu'il est appliqué à un composant, cela signifie que le composant échantillonne chaque span qu'il traite.
Échantillonnage basé sur l'en-tête
Les échantillonneurs basés sur l'en-tête sont généralement configurés pour toujours échantillonner les portées ou pour utiliser une stratégie d'échantillonnage probabiliste :
Avec les configurations always sample, tous les composants que le service couvre et qui peuvent écrire des données de trace échantillonnent les spans qu'ils traitent. Idéalement, toutes les traces sont complètes et vous disposez donc des informations nécessaires pour résoudre les échecs. Ce type de configuration peut entraîner le dépassement des quotas ou des limites de coûts de stockage.
Avec l'échantillonnage probabiliste, toutes les portées ne sont pas échantillonnées. Le comportement réel de cette approche dépend de l'implémentation du composant. Dans certaines implémentations, toutes les portées ont la même probabilité d'être échantillonnées. Dans d'autres, la décision d'échantillonnage du parent influence l'échantillonnage d'une portée.
Il est possible que les traces ne contiennent pas toutes les étendues. Cela peut être attendu en raison de l'utilisation de l'échantillonnage probabiliste, ou cela peut être dû à un quota ou à des composants qui traitent une requête, mais n'échantillonnent pas le segment.
Échantillonnage basé sur la queue
Cloud Trace n'est pas compatible avec l'échantillonnage basé sur la fin de la trace. Les décisions d'échantillonnage doivent être prises dans les composants qui envoient des données à Cloud Trace.
Si vous souhaitez utiliser l'échantillonnage basé sur la fin, vous pouvez utiliser un serveur intermédiaire qui reçoit les informations de traçage et les relaie à Cloud Trace après avoir pris une décision d'échantillonnage. Par exemple, vous pouvez utiliser le collecteur OpenTelemetry avec le processeur d'échantillonnage de queue pour prendre une décision d'échantillonnage différée.
Si vous prévoyez d'utiliser l'échantillonnage de queue, tenez compte des points suivants :
- Vous devez stocker toutes les portées dans une trace avant de prendre une décision d'échantillonnage. Par conséquent, vous aurez peut-être besoin d'une grande quantité d'espace de stockage temporaire ou d'autres frais généraux.
- En général, tous les composants pouvant générer des spans pour une trace doivent se coordonner. En règle générale, les développeurs qui utilisent OpenTelemetry acheminent toutes les portées pour le même ID de trace vers le même collecteur.
Échantillonnage et Google Cloud services
Chaque service Google Cloud prend ses propres décisions d'échantillonnage, et tous les services Google Cloud n'échantillonnent pas. Autrement dit, un service peut ne jamais envoyer de données à Cloud Trace.
Lorsqu'un service Google Cloud prend en charge l'échantillonnage, il implémente généralement les éléments suivants :
- Taux d'échantillonnage par défaut.
- Mécanisme permettant d'utiliser la décision d'échantillonnage du parent comme indication pour savoir s'il faut échantillonner la portée.
- Taux d'échantillonnage maximal.
Pour demander à un service Google Cloud d'ajouter la prise en charge de l'échantillonnage, utilisez Google Issue Tracker.
Étapes suivantes
Pour savoir comment choisir une stratégie d'échantillonnage par nom de portée, consultez Échantillonnage à distance Jaeger.
Nous vous recommandons de consulter la documentation Open Source suivante pour vous aider à déterminer l'approche d'échantillonnage la mieux adaptée à vos applications en cours de développement et déployées :
Documentation du serviceGoogle Cloud :