「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > NestJS + Opentelemetry (サンプリング)

NestJS + Opentelemetry (サンプリング)

2024 年 8 月 23 日に公開
ブラウズ:245

Grafana Cloud

以前の投稿でGrafana CloudにOpentelemetry dataを撮影して保存して見ることをしました。

グラパナクラウド無料版を使用すると、月にログとトレースに50GB程度を与える。ユーザーがいくらなくてTraceがあまり積み重ねる(あるいはログを枯渇する)サービスならばそのまま使用してもよいが、少し規模のある状態で導入すればログがあまりにも積み重ねてしまうのではないかと怖い。

Sampling

Samplingとは全体から一部を抜いて使うものだ。その結果、保存されるテレメトリデータの数を減らす作業です。

Why need Sampling

サンプリングはなぜ必要ですか?

NestJS   Opentelemetry (Sampling)

上記の図では、すべての円(トレース)を保存する必要はありません。重要なトレース(エラー、またはあまりにも実行時間が長い)と全体を代表するいくつかのサンプル(OK traceの一部)だけを保存すれば十分です。

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), });

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),
});

尋ねて問わずDropしてしまうので、重要なtraceがドロップされる場合がある。
  • Tail Sampling

後ろからサンプリングするのだ。このときは、利用できる情報が多いので、好きなロジックに応じてフィルタリングすることができます。
  • たとえば、エラートレースは無条件にサンプリングする式です。

  • 通常、コレクターで一度すべてのトレースを受けた後にサンプリングをする。

  • 欠点

実装が難しいかもしれません。システムが変わり、条件が変わったら常に変えなければならない存在だ。

    サンプリングするためにStatefulの状態を維持していなければ実行が難しい。
  • Tail Samplerがvendor-specificの場合があります。
  • 実装
  • Tail SamplingをCustom Span Processorを実装して実装しましょう。

    SamplingSpanProcessorの実装
sampling-span-processor.ts ファイルの生成

import { Context } from "@opentelemetry/api"; import { SpanProcessor, ReadableSpan, スパン、 } from "@opentelemetry/sdk-trace-node"; /** * Sampling span processor (including all error span and ratio of other spans) */ export class SamplingSpanProcessor implements SpanProcessor { コンストラクタ( 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(); } }

status.codeが2(Error)またはratio確率に勝った場合にのみthis._spanProcessor.onEnd(span);を呼び出してエクスポートします。

OtelSDKアップデート

main.tsでspanProcessorsを更新します。
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();
  }
}

spanProcessors: [ new SamplingSpanProcessor( new BatchSpanProcessor(traceExporter), samplePercentage )、 ],

リリースステートメント この記事は次の場所に転載されています: https://dev.to/siisee11/nestjs-opentelemetry-sampling-2ome?1 侵害がある場合は、[email protected] に連絡して削除してください。
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3