"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > NestJS + القياس عن بعد (أخذ العينات)

NestJS + القياس عن بعد (أخذ العينات)

تم النشر بتاريخ 2024-08-23
تصفح:175

سحابة جرافانا

في المنشور السابق، قمت بتصوير بيانات Opentelemetry وحفظها وعرضها في Grafana Cloud.

إذا كنت تستخدم الإصدار المجاني من Grafana Cloud، فستحصل على حوالي 50 جيجابايت من السجلات والتتبعات شهريًا. إذا كانت خدمة لا تتراكم الآثار (أو لا تسجل السجلات) بسبب عدم وجود العديد من المستخدمين، فيمكنك استخدامها فقط، ولكن إذا قدمتها على نطاق صغير، أخشى أن يتراكم عدد كبير جدًا من السجلات تنفجر

أخذ العينات

أخذ العينات يعني استخراج جزء من الكل. ونتيجة لذلك، تتمثل المهمة في تقليل عدد بيانات القياس عن بعد المخزنة.

لماذا تحتاج إلى أخذ العينات

لماذا يعتبر أخذ العينات ضروريا؟

NestJS   Opentelemetry (Sampling)

ليست هناك حاجة لحفظ جميع الدوائر (التتبع) في الصورة أعلاه. يكفي تخزين الآثار المهمة فقط (الأخطاء، أو وقت التنفيذ الطويل جدًا) وبعض العينات التي تمثل الكل (بعض الآثار الجيدة

).

أنواع أخذ العينات

يمكن تقسيم أخذ العينات على نطاق واسع إلى أخذ العينات الرئيسية وأخذ العينات الخلفية.

أخذ عينات الرأس

    يشير إلى أخذ العينات في البداية. والمثال النموذجي هو ببساطة أخذ العينات الاحتمالية. لم يتبق سوى 10% من إجمالي الأثر والباقي لم يتم تتبعه.
جافا سكريبت

يتم توفير TraceIdRatioBasedSampler بشكل افتراضي.


استيراد { TraceIdRatioBasedSampler } من '@opentelemetry/sdk-trace-node'؛ النسبة المئوية لعينة ثابتة = 0.1؛ const sdk = new NodeSDK({ // معلمات تكوين SDK الأخرى تذهب هنا أخذ العينات: جديد 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),
});
العيب

    في بعض الأحيان يتم إسقاط الآثار المهمة لأنها تسقط الأشياء دون طلب.
أخذ العينات الذيل

  • أخذ العينات من الخلف. في الوقت الحالي، نظرًا لوجود الكثير من المعلومات المتاحة، يمكنك تصفيتها وفقًا للمنطق المطلوب.

  • على سبيل المثال، يتم دائمًا أخذ عينات من آثار الأخطاء.

  • عادة، يتم أخذ العينات بعد استلام جميع الآثار من المجمع.

العيب

  • قد يكون التنفيذ صعباً. وهو شيء يجب تغييره دائمًا عندما يتغير النظام وتتغير الظروف.

    يصعب التنفيذ لأنه يجب الحفاظ على حالة الحالة لأخذ العينات.
  • قد تكون أداة أخذ العينات الخلفية خاصة بالمورد.
  • الصورة الرمزية
دعونا نطبق أخذ العينات الخلفية من خلال تنفيذ معالج Span المخصص

تنفيذ SamplingSpanProcessor

إنشاء ملف sampling-span-processor.ts

استيراد { السياق } من "@opentelemetry/api"؛ يستورد { معالج سبان, قابل للقراءة, فترة، } من "@opentelemetry/sdk-trace-node"; /** * معالج نطاق أخذ العينات (بما في ذلك نطاق الخطأ ونسبة النطاقات الأخرى) */ فئة التصدير SamplingSpanProcessor تنفذ SpanProcessor { منشئ( _spanProcessor الخاص: SpanProcessor؛ نسبة_الخاصة: الرقم ) {} /** * القوات لتصدير جميع الفترات الجاهزة */ forceFlush (): الوعد { إرجاع this._spanProcessor.forceFlush(); } onStart(span: Span,parentContext: context): void { this._spanProcessor.onStart(span,parentContext); } ينبغي سامبل (traceId: سلسلة): منطقي { دع التراكم = 0؛ لـ (دع idx = 0; idx { إرجاع this._spanProcessor.shutdown(); } }

this._spanProcessor.onEnd(span); فقط عندما يكون رمز الحالة هو 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 {
    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();
  }
}
تحديث OtelSDK

تحديث المعالجات في main.ts.

المعالجات الممتدة: [ جديدSamplingSpanProcessor ( new BatchSpanProcessor(traceExporter); SamplePercentage )، ]،

            
بيان الافراج تم إعادة نشر هذه المقالة على: https://dev.to/siisee11/nestjs-opentelemetry-sampling-2ome?1 إذا كان هناك أي انتهاك، يرجى الاتصال بـ [email protected] لحذفه
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3