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 est de réduire le nombre de données télémétriques stockées.
Pourquoi un é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 longs) et quelques échantillons qui représentent 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), });
Le prélèvement se fait par l'arrière. A ce moment, comme il y a beaucoup d'informations 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 changer lorsque le système change et que les conditions changent.
Il est difficile à réaliser car il doit maintenir un état avec état pour l'échantillonnage.
Il existe des cas où le Tail Sampler est 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<void> { 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 < traceId.length; idx++) { accumulation += traceId.charCodeAt(idx); } const cmp = (accumulation % 100) / 100; return cmp < this._ratio; } /** * Called when a {@link ReadableSpan} is ended, if the `span.isRecording()` * returns true. * @param span the Span that just ended. */ onEnd(span: ReadableSpan): void { // Only process spans that have an error status if (span.status.code === 2) { // Status code 0 means "UNSET", 1 means "OK", and 2 means "ERROR" this._spanProcessor.onEnd(span); } else { if (this.shouldSample(span.spanContext().traceId)) { this._spanProcessor.onEnd(span); } } } /** * Shuts down the processor. Called when SDK is shut down. This is an * opportunity for processor to do any cleanup required. */ async shutdown(): Promise<void> { return this._spanProcessor.shutdown(); } }
This._spanProcessor.onEnd(span); uniquement lorsque status.code est 2 (Erreur) ou que le rapport de probabilité est gagnant. Exportez en appelant
Mettre à jour spanProcessors dans main.ts.
spanProcessors: [ new SamplingSpanProcessor( new BatchSpanProcessor(traceExporter), samplePercentage ), ],
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!