Maison > interface Web > js tutoriel > NestJS + Opentelemetry (échantillonnage)

NestJS + Opentelemetry (échantillonnage)

PHPz
Libérer: 2024-08-19 17:16:03
original
767 Les gens l'ont consulté

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 est de réduire le nombre de données télémétriques stockées.

Pourquoi avoir besoin d'un échantillonnage

Pourquoi un é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 longs) et quelques échantillons qui représentent 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 la tête

  • Cela fait référence à l'échantillonnage dès le 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),
});
Copier après la connexion

inconvénient

  • Il y a des cas où des traces importantes sont supprimées parce qu'ils les laissent tomber sans demander.

Échantillonnage de queue

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

inconvénient

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

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<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();
  }
}
Copier après la connexion

This._spanProcessor.onEnd(span); uniquement lorsque status.code est 2 (Erreur) ou que le rapport de probabilité est gagnant. Exportez en appelant

Mise à jour du SDK Otel

Mettre à jour spanProcessors dans main.ts.

  spanProcessors: [
    new SamplingSpanProcessor(
      new BatchSpanProcessor(traceExporter),
      samplePercentage
    ),
  ],
Copier après la connexion

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!

source:dev.to
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal