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 explodierenProbenahme
Warum brauchen Sie eine Probenahme?
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 speichernArten der Probenahme
Kopfprobenahme
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), });
SamplingSpanProcessor-Implementierung
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(); } }
OtelSDK-Update
spanProcessors: [ new SamplingSpanProcessor( new BatchSpanProcessor(traceExporter), samplePercentage ), ],
Das obige ist der detaillierte Inhalt vonNestJS + Opentelemetry (Sampling). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!