Rumah  >  Artikel  >  hujung hadapan web  >  NestJS + Opentelemetri (Pensampelan)

NestJS + Opentelemetri (Pensampelan)

PHPz
PHPzasal
2024-08-19 17:16:03725semak imbas

Awan Grafana

Dalam catatan sebelumnya, saya menangkap, menyimpan dan melihat data Opentelemetry dalam Grafana Cloud

Jika anda menggunakan versi percuma Grafana Cloud, anda mendapat kira-kira 50GB log dan jejak setiap bulan. Jika ia adalah perkhidmatan yang tidak mengumpul jejak (atau tidak merekodkan log) kerana tidak ramai pengguna, anda boleh menggunakannya, tetapi jika anda memperkenalkannya secara kecil-kecilan, saya takut terlalu banyak log akan terkumpul dan meletup

Pensampelan

Pensampelan bermaksud mengekstrak sebahagian daripada keseluruhan. Akibatnya, tugasnya adalah untuk mengurangkan bilangan data telemetri yang disimpan.

Mengapa perlu persampelan

Mengapa pensampelan perlu?

NestJS + Opentelemetry (Sampling)

Tidak perlu simpan semua bulatan (trace) dalam gambar di atas. Cukup untuk menyimpan hanya kesan penting (ralat atau masa pelaksanaan yang terlalu lama) dan beberapa sampel yang mewakili keseluruhan (beberapa jejak OK).

Jenis Persampelan

Pensampelan boleh dibahagikan secara meluas kepada Pensampelan Kepala dan Pensampelan Ekor.

Pensampelan Kepala

  • Ini merujuk kepada pensampelan dari awal lagi. Contoh biasa ialah persampelan kebarangkalian. Hanya 10% daripada jumlah jejak yang tinggal dan selebihnya tidak dikesan

Javascript

TraceIdRatioBasedSampler disediakan secara lalai.

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

keburukan

  • Terdapat kes di mana jejak penting digugurkan kerana mereka menjatuhkannya tanpa bertanya.

Pensampelan Ekor

  • Pensampelan dilakukan dari belakang. Pada masa ini, memandangkan terdapat banyak maklumat yang tersedia, anda boleh menapisnya mengikut logik yang dikehendaki.

  • Sebagai contoh, kesan ralat sentiasa diambil sampel.

  • Biasanya, pensampelan dilakukan setelah semua kesan diterima daripada pengumpul.

keburukan

  • Pelaksanaan mungkin sukar. Ia adalah sesuatu yang sentiasa perlu diubah apabila sistem berubah dan keadaan berubah.

  • Sukar untuk dilaksanakan kerana ia mesti mengekalkan keadaan stateful untuk pensampelan.

  • Terdapat kes di mana Pensampel Ekor adalah khusus vendor.

avatar

Mari laksanakan Pensampelan Ekor dengan melaksanakan Pemproses Span Tersuai.

Pelaksanaan SamplingSpanProcessor

Buat fail 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); hanya apabila status.code ialah 2 (Ralat) atau kebarangkalian nisbah menang. Eksport dengan memanggil

Kemas Kini OtelSDK

Kemas kini spanProcessors dalam main.ts.

  spanProcessors: [
    new SamplingSpanProcessor(
      new BatchSpanProcessor(traceExporter),
      samplePercentage
    ),
  ],

Atas ialah kandungan terperinci NestJS + Opentelemetri (Pensampelan). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn