„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > NestJS + Opentelemetry (Sampling)

NestJS + Opentelemetry (Sampling)

Veröffentlicht am 23.08.2024
Durchsuche:198

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 Protokolle und Traces pro Monat. Wenn es sich um einen Dienst handelt, der keine Spuren sammelt (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 zu extrahieren. Dadurch 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 Traces (Fehler oder zu lange Ausführungszeit) und einige für das Ganze repräsentative Beispiele (einige der OK-Traces) zu speichern.

Arten der Probenahme

Sampling kann grob in Head Sampling und Tail Sampling unterteilt werden.

Kopfprobenahme

Bezieht sich auf das Sampling ganz am Anfang. Ein typisches Beispiel ist die einfache probabilistische Stichprobenziehung. Nur 10 % der gesamten Spur bleiben übrig und der Rest wird nicht verfolgt.

  • Javascript
TraceIdRatioBasedSampler wird standardmäßig bereitgestellt.

import { TraceIdRatioBasedSampler } from '@opentelemetry/sdk-trace-node'; const samplePercentage = 0,1; const sdk = neues NodeSDK({ // Weitere SDK-Konfigurationsparameter finden Sie hier Sampler: new TraceIdRatioBasedSampler(samplePercentage); });

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

Manchmal werden wichtige Spuren gelöscht, weil sie Dinge ungefragt fallen lassen.

  • Schwanzprobenahme

Probenahme 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, nachdem alle Spuren vom Kollektor empfangen wurden.
  • Nachteil

Die Implementierung kann schwierig sein. Es ist etwas, das immer geändert werden muss, wenn sich das System ändert und sich die Bedingungen ändern.
  • Schwierig durchzuführen, da der Zustandszustand für die Stichprobenerhebung beibehalten werden muss.

  • Tail Sampler kann herstellerspezifisch sein.

  • Avatar

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

Sampling-span-processor.ts-Datei erstellen

import { Context } from „@opentelemetry/api“; importieren { SpanProcessor, ReadableSpan, Spanne, } von „@opentelemetry/sdk-trace-node“; /** * Sampling-Span-Prozessor (einschließlich aller Fehlerspannen und Verhältnisse anderer Spannen) */ Die Exportklasse SamplingSpanProcessor implementiert SpanProcessor { Konstruktor( privater _spanProcessor: SpanProcessor; private_ratio: Zahl ) {} /** * Erzwingt den Export aller fertigen Abschnitte */ forceFlush(): Promise { return this._spanProcessor.forceFlush(); } onStart(span: Span, parentContext: Context): void { this._spanProcessor.onStart(span, parentContext); } ShouldSample(traceId: string): boolean { sei Akkumulation = 0; for (let idx = 0; idx { return this._spanProcessor.shutdown(); } }

this._spanProcessor.onEnd(span); nur wenn status.code 2 ist (Fehler) oder die Verhältniswahrscheinlichkeit gewinnt. Exportieren durch Aufruf von


OtelSDK-Update

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

spanProcessors: [ newSamplingSpanProcessor( neuer BatchSpanProcessor(traceExporter); Beispielprozentsatz ), ],

Freigabeerklärung Dieser Artikel ist abgedruckt unter: https://dev.to/siisee11/nestjs-opentelemetry-sampling-2ome?1 Bei Verstößen wenden Sie sich bitte an [email protected], um ihn zu löschen
Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3