Heim > Web-Frontend > js-Tutorial > NestJS + Opentelemetry (Sampling)

NestJS + Opentelemetry (Sampling)

PHPz
Freigeben: 2024-08-19 17:16:03
Original
767 Leute haben es durchsucht

Grafana-Wolke

Im vorherigen Beitrag habe ich Opentelemetry-Daten in Grafana Cloud aufgenommen, gespeichert und angezeigt

Wenn Sie die kostenlose Version von Grafana Cloud nutzen, erhalten Sie etwa 50 GB an Protokollen und Traces pro Monat. Wenn es sich um einen Dienst handelt, der nicht viele Spuren ansammelt (oder keine Protokolle aufzeichnet), weil nicht viele Benutzer vorhanden sind, können Sie ihn einfach verwenden. Wenn Sie ihn jedoch in kleinem Maßstab einführen, befürchte ich, dass sich zu viele Protokolle ansammeln und explodieren

Probenahme

Sampling bedeutet, aus dem Ganzen einen Teil herauszuarbeiten. Daher besteht die Aufgabe darin, die Anzahl der gespeicherten Telemetriedaten zu reduzieren.

Warum brauchen Sie eine Probenahme?

Warum ist eine Probenahme notwendig?

NestJS + Opentelemetry (Sampling)Es ist nicht erforderlich, alle Kreise (Spur) im Bild oben zu speichern. Es reicht aus, nur wichtige Spuren (Fehler oder zu lange Ausführungszeit) und einige für das Ganze repräsentative Beispiele (einige der OK-Spuren

) zu speichern

Arten der Probenahme

Die Probenahme kann grob in Kopfprobenahme und Schwanzprobenahme unterteilt werden.

Kopfprobenahme

Hiermit ist die Bemusterung von Beginn an gemeint. Ein typisches Beispiel ist die einfache probabilistische Stichprobenziehung. Von der Gesamtspur sind nur noch 10 % übrig, der Rest wird nicht verfolgt
  • Javascript

TraceIdRatioBasedSampler wird standardmäßig bereitgestellt.


Nachteil
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),
});
Nach dem Login kopieren

Es gibt Fälle, in denen wichtige Spuren gelöscht werden, weil sie sie ungefragt löschen.
  • Schwanzprobenahme

    Die Probenahme erfolgt von hinten. Da zu diesem Zeitpunkt viele Informationen verfügbar sind, können Sie diese nach der gewünschten Logik filtern.
  • Beispielsweise werden Fehlerspuren immer abgetastet.
  • Normalerweise wird die Probenahme durchgeführt, sobald alle Spuren vom Sammler eingegangen sind.
  • Nachteil

    Die Umsetzung kann schwierig sein. Es ist etwas, das sich immer ändern muss, wenn sich das System und die Bedingungen ändern.
  • Die Durchführung ist schwierig, da für die Probenahme ein zustandsbehafteter Zustand aufrechterhalten werden muss.
  • Es gibt Fälle, in denen der Tail Sampler herstellerspezifisch ist.
  • Avatar

Lassen Sie uns Tail Sampling implementieren, indem wir einen benutzerdefinierten Span-Prozessor implementieren.

SamplingSpanProcessor-Implementierung

Sampling-span-processor.ts-Datei erstellen


This._spanProcessor.onEnd(span); nur wenn status.code 2 ist (Fehler) oder die Verhältniswahrscheinlichkeit gewinnt. Exportieren Sie, indem Sie
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();
  }
}
Nach dem Login kopieren
aufrufen

OtelSDK-Update

spanProcessors in main.ts aktualisieren.


  spanProcessors: [
    new SamplingSpanProcessor(
      new BatchSpanProcessor(traceExporter),
      samplePercentage
    ),
  ],
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonNestJS + Opentelemetry (Sampling). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:dev.to
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage