В предыдущем посте я снимал, сохранял и просматривал данные Opentelemetry в Grafana Cloud
Если вы используете бесплатную версию Grafana Cloud, вы получаете около 50 ГБ журналов и трассировок в месяц. Если это сервис, который не накапливает трассировки (или не записывает логи), поскольку пользователей не так много, то можно просто использовать его, но если внедрить его в небольших масштабах, боюсь, что накопится слишком много логов и взорваться.
Выборка означает выделение части из целого. В результате стоит задача сократить количество хранимых данных телеметрии.
Почему необходима выборка?
Сохранять все кружочки (следы) на картинке выше не нужно. Достаточно хранить только важные трассировки (ошибки или слишком долгое время выполнения) и несколько образцов, представляющих целое (некоторые трассировки ОК
).Сэмплирование можно условно разделить на начальную и хвостовую выборку.
TraceIdRatioBasedSampler предоставляется по умолчанию.
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), });
Сэмпл со спины. В настоящее время, поскольку информации доступно много, вы можете фильтровать ее по желаемой логике.
Например, всегда выполняется выборка трассировок ошибок.
Обычно выборка производится после того, как от коллектора получены все трассы.
Реализация может оказаться сложной. Это то, что всегда необходимо менять, когда меняется система и условия.
Сложно выполнить, поскольку для выборки необходимо поддерживать состояние с отслеживанием состояния.
Tail Sampler может зависеть от поставщика.
Давайте реализуем хвостовую выборку, реализовав процессор пользовательского диапазона
Создать файл sample-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); только тогда, когда status.code равен 2 (ошибка) или вероятность выигрыша. Экспортируйте, вызвав
Обновить spanProcessors в main.ts.
spanProcessors: [ new SamplingSpanProcessor( new BatchSpanProcessor(traceExporter), samplePercentage ), ],
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3