En la publicación anterior, grabé, guardé y vi datos de Opentelemetry en Grafana Cloud
.Si utiliza la versión gratuita de Grafana Cloud, obtiene aproximadamente 50 GB de registros y seguimientos por mes. Si es un servicio que no acumula rastros (o no registra registros) porque no hay muchos usuarios, puedes usarlo simplemente, pero si lo introduces a pequeña escala, me temo que se acumularán demasiados registros y explotar
Muestreo significa extraer una parte del todo. Como resultado, la tarea es reducir la cantidad de datos de telemetría almacenados.
¿Por qué es necesario el muestreo?
No es necesario guardar todos los círculos (trazado) en la imagen de arriba. Basta con almacenar sólo las trazas importantes (errores o tiempos de ejecución demasiado largos) y algunas muestras representativas del conjunto (algunas de las trazas correctas
).El muestreo se puede dividir en términos generales en muestreo de cabeza y muestreo de cola.
TraceIdRatioBasedSampler se proporciona de forma predeterminada.
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), });
Muestreo desde atrás. En este momento, como hay mucha información disponible, puedes filtrarla según la lógica deseada.
Por ejemplo, los seguimientos de errores siempre se muestrean.
Por lo general, el muestreo se realiza después de que se hayan recibido todos los rastros del recolector.
La implementación puede ser difícil. Es algo que siempre debe cambiarse cuando el sistema cambia y las condiciones cambian
Difícil de realizar porque se debe mantener el estado con estado para el muestreo.
Tail Sampler puede ser específico del proveedor.
Implementemos Tail Sampling implementando un procesador de tramo personalizado
.Crear archivo 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{ 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(); } }
this._spanProcessor.onEnd(span); solo cuando status.code es 2 (Error) o la probabilidad de proporción es ganadora. Exportar llamando a
Actualizar spanProcessors en main.ts.
spanProcessors: [ new SamplingSpanProcessor( new BatchSpanProcessor(traceExporter), samplePercentage ), ],
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3