Rumah > Artikel > hujung hadapan web > NestJS + Opentelemetri (Pensampelan)
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 bermaksud mengekstrak sebahagian daripada keseluruhan. Akibatnya, tugasnya adalah untuk mengurangkan bilangan data telemetri yang disimpan.
Mengapa pensampelan perlu?
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).
Pensampelan boleh dibahagikan secara meluas kepada Pensampelan Kepala dan Pensampelan Ekor.
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), });
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.
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.
Mari laksanakan Pensampelan Ekor dengan melaksanakan Pemproses Span Tersuai.
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 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!