Dans le post précédent, j'ai filmé, enregistré et visualisé des données Opentelemetry dans Grafana Cloud
.Si vous utilisez la version gratuite de Grafana Cloud, vous obtenez environ 50 Go de journaux et de traces par mois. S'il s'agit d'un service qui n'accumule pas de traces (ou n'enregistre pas de journaux) parce qu'il n'y a pas beaucoup d'utilisateurs, vous pouvez simplement l'utiliser, mais si vous l'introduisez à petite échelle, j'ai peur que trop de journaux s'accumulent et exploser
Échantillonner signifie extraire une partie du tout. En conséquence, la tâche consiste à réduire le nombre de données télémétriques stockées.
Pourquoi l'échantillonnage est-il nécessaire ?
Il n'est pas nécessaire de sauvegarder tous les cercles (traces) dans l'image ci-dessus. Il suffit de stocker uniquement les traces importantes (erreurs, ou temps d'exécution trop long) et quelques échantillons représentatifs de l'ensemble (certaines traces OK
).L'échantillonnage peut être largement divisé en échantillonnage de tête et échantillonnage de queue.
TraceIdRatioBasedSampler est fourni par défaut.
import { TraceIdRatioBasedSampler } from '@opentelemetry/sdk-trace-node'; const samplePercentage = 0.1; const sdk = new NodeSDK({ // Other SDK configuration parameters go here sampler: new TraceIdRatioBasedSampler(samplePercentage), });
Échantillonnage par l'arrière. À l'heure actuelle, comme de nombreuses informations sont disponibles, vous pouvez les filtrer selon la logique souhaitée.
Par exemple, les traces d'erreurs sont toujours échantillonnées.
Habituellement, l'échantillonnage est effectué une fois que toutes les traces ont été reçues du collecteur.
La mise en œuvre peut être difficile. C'est quelque chose qui doit toujours être changé lorsque le système change et que les conditions changent
Difficile à réaliser car l'état avec état doit être conservé pour l'échantillonnage.
Tail Sampler peut être spécifique au fournisseur.
Implémentons l'échantillonnage de queue en implémentant un processeur Span personnalisé
Créer le fichier sampling-span-processor.ts
import { Context } from "@opentelemetry/api"; import { SpanProcessor, ReadableSpan, Span, } from "@opentelemetry/sdk-trace-node"; /** * Sampling span processor (including all error span and ratio of other spans) */ export class SamplingSpanProcessor implements SpanProcessor { constructor( private _spanProcessor: SpanProcessor, private _ratio: number ) {} /** * Forces to export all finished spans */ forceFlush(): Promise{ return this._spanProcessor.forceFlush(); } onStart(span: Span, parentContext: Context): void { this._spanProcessor.onStart(span, parentContext); } shouldSample(traceId: string): boolean { let accumulation = 0; for (let idx = 0; idx { return this._spanProcessor.shutdown(); } }
this._spanProcessor.onEnd(span); uniquement lorsque status.code est 2 (Erreur) ou que le rapport de probabilité est gagnant. Exporter en appelant
Mettre à jour spanProcessors dans main.ts.
spanProcessors: [ new SamplingSpanProcessor( new BatchSpanProcessor(traceExporter), samplePercentage ), ],
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3