"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > NestJS + Opentelemetry (échantillonnage)

NestJS + Opentelemetry (échantillonnage)

Publié le 2024-08-23
Parcourir:937

Nuage de Grafana

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

Échantillonnage

É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 avoir besoin d'un échantillonnage

Pourquoi l'échantillonnage est-il nécessaire ?

NestJS   Opentelemetry (Sampling)

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

).

Types d'échantillonnage

L'échantillonnage peut être largement divisé en échantillonnage de tête et échantillonnage de queue.

Échantillonnage de tête

  • Fait référence à l'échantillonnage au tout début. Un exemple typique est simplement l’échantillonnage probabiliste. Il ne reste que 10 % de la trace totale et le reste n’est pas tracé.

Javascript

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),
});

inconvénient

  • Parfois, des traces importantes sont supprimées parce qu'ils laissent tomber des objets sans rien demander.

Échantillonnage de queue

  • É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.

inconvénient

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

avatar

Implémentons l'échantillonnage de queue en implémentant un processeur Span personnalisé

Implémentation du SamplingSpanProcessor

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

Mise à jour du SDK Otel

Mettre à jour spanProcessors dans main.ts.

  spanProcessors: [
    new SamplingSpanProcessor(
      new BatchSpanProcessor(traceExporter),
      samplePercentage
    ),
  ],
Déclaration de sortie Cet article est reproduit à: https://dev.to/siisee11/nestjs-opentelemetry-sampling-2ome?1 S'il y a une contrefaçon, veuillez contacter [email protected] pour le supprimer.
Dernier tutoriel Plus>

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