首頁 > web前端 > js教程 > NestJS + Opentelemetry(採樣)

NestJS + Opentelemetry(採樣)

PHPz
發布: 2024-08-19 17:16:03
原創
777 人瀏覽過

格拉法納雲

在上一篇文章中,我在 Grafana Cloud 中拍攝、保存和查看了 Opentelemetry 資料

如果您使用免費版本的 Grafana Cloud,您每月可以獲得約 50GB 的日誌和追蹤。如果是因為使用者不多,所以不會累積太多trace(或不記錄日誌)的服務,直接使用即可,但如果小規模引入的話,恐怕會累積太多日誌並爆炸。

取樣

抽樣是指從整體中提取一部分。因此,任務是減少儲存的遙測資料的數量。

為什麼需要抽樣

為什麼需要取樣?

NestJS + Opentelemetry (Sampling)

上圖中的所有圓圈(軌跡)無需保存。僅儲存重要的追蹤(錯誤或太長的執行時間)和一些代表整體的樣本(一些正常的追蹤)就足夠了。

抽樣類型

取樣大致可分為頭部取樣和尾部取樣。

頭部採樣

這是指從一開始就取樣。一個典型的例子就是機率抽樣。只留下了總痕跡的10%,其餘的都沒有痕跡。
  • JavaScript

預設提供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),
});
登入後複製

在某些情況下,重要的痕跡會被刪除,因為他們在沒有詢問的情況下就刪除了它。
  • 尾部取樣

    取樣是從後面進行的。此時,由於可用資訊較多,您可以根據想要的邏輯進行過濾。
  • 例如,錯誤追蹤總是會被取樣。
  • 通常,一旦從收集器收到所有痕跡,就會進行取樣。
  • 劣勢

    實施可能會很困難。當系統改變、條件改變時,它總是必須改變。
  • 很難執行,因為它必須保持有狀態才能取樣。
  • 在某些情況下,尾部採樣器是特定於供應商的。
  • 頭像

讓我們透過實作自訂跨度處理器來實現尾部取樣。

SamplingSpanProcessor 實現

建立取樣-span-processor.ts 檔案


This._spanProcessor.onEnd(span);僅當status.code為2(錯誤)或比率機率獲勝時。透過呼叫
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更新

更新 main.ts 中的 spanProcessors。


  spanProcessors: [
    new SamplingSpanProcessor(
      new BatchSpanProcessor(traceExporter),
      samplePercentage
    ),
  ],
登入後複製

以上是NestJS + Opentelemetry(採樣)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板