"यदि कोई कर्मचारी अपना काम अच्छी तरह से करना चाहता है, तो उसे पहले अपने औजारों को तेज करना होगा।" - कन्फ्यूशियस, "द एनालेक्ट्स ऑफ कन्फ्यूशियस। लू लिंगगोंग"
मुखपृष्ठ > प्रोग्रामिंग > NestJS + ओपनटेलीमेट्री (नमूनाकरण)

NestJS + ओपनटेलीमेट्री (नमूनाकरण)

2024-08-23 को प्रकाशित
ब्राउज़ करें:151

ग्राफाना बादल

पिछली पोस्ट में, मैंने ग्राफाना क्लाउड में ओपनटेलीमेट्री डेटा को शूट किया, सहेजा और देखा।

यदि आप ग्राफाना क्लाउड के मुफ्त संस्करण का उपयोग करते हैं, तो आपको प्रति माह लगभग 50 जीबी लॉग और ट्रेस मिलते हैं। यदि यह एक ऐसी सेवा है जो निशान जमा नहीं करती है (या लॉग रिकॉर्ड नहीं करती है) क्योंकि बहुत सारे उपयोगकर्ता नहीं हैं, तो आप बस इसका उपयोग कर सकते हैं, लेकिन यदि आप इसे छोटे पैमाने पर पेश करते हैं, तो मुझे डर है कि बहुत सारे लॉग जमा हो जाएंगे और विस्फोट।

सैम्पलिंग

सैंपलिंग का अर्थ है संपूर्ण में से एक भाग निकालना। परिणामस्वरूप, कार्य संग्रहीत टेलीमेट्री डेटा की संख्या को कम करना है।

सैंपलिंग की जरूरत क्यों?

नमूनाकरण क्यों आवश्यक है?

NestJS   Opentelemetry (Sampling)

उपरोक्त चित्र में सभी वृत्तों (ट्रेस) को सहेजने की कोई आवश्यकता नहीं है। यह केवल महत्वपूर्ण निशानों (त्रुटियों, या बहुत लंबे निष्पादन समय) और संपूर्ण के कुछ नमूने (कुछ ठीक निशान) को संग्रहीत करने के लिए पर्याप्त है।

नमूने के प्रकार

सैंपलिंग को मोटे तौर पर हेड सैंपलिंग और टेल सैंपलिंग में विभाजित किया जा सकता है।

सिर का नमूना

शुरुआत में नमूनाकरण को संदर्भित करता है। एक विशिष्ट उदाहरण केवल संभाव्य नमूनाकरण है। कुल निशान का केवल 10% ही बचा है और बाकी का पता नहीं चल पाया है।
  • जावास्क्रिप्ट

TraceIdRatioBasedSampler डिफ़ॉल्ट रूप से प्रदान किया जाता है।


'@opentelemetry/sdk-trace-node' से { TraceIdRatioBasedSampler } आयात करें; स्थिरांक नमूना प्रतिशत = 0.1; स्थिरांक एसडीके = नया नोडएसडीके({ // अन्य एसडीके कॉन्फ़िगरेशन पैरामीटर यहां जाते हैं नमूना: नया 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-processor.ts फ़ाइल बनाएं

"@opentelemetry/api" से {संदर्भ } आयात करें; आयात { स्पैनप्रोसेसर, पठनीय विस्तार, अवधि, } "@opentelemetry/sdk-trace-node" से; /** * सैंपलिंग स्पैन प्रोसेसर (सभी त्रुटि स्पैन और अन्य स्पैन के अनुपात सहित) */ निर्यात वर्ग सैम्पलिंगस्पैनप्रोसेसर स्पैनप्रोसेसर को लागू करता है { कंस्ट्रक्टर( निजी _spanProcessor: SpanProcessor; निजी_अनुपात: संख्या ) {} /** * सभी तैयार स्पैन को निर्यात करने के लिए बाध्य करता है */ ForceFlush(): वादा { इसे वापस करें._spanProcessor.forceFlush(); } ऑनस्टार्ट (स्पैन: स्पैन, पेरेंट कॉन्टेक्स्ट: संदर्भ): शून्य { this._spanProcessor.onStart(span,parentContext); } चाहिएनमूना(traceId: स्ट्रिंग): बूलियन { मान लीजिए संचय = 0; के लिए (मान लीजिए idx = 0; idx { इसे वापस करें._spanProcessor.shutdown(); } }

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 {
    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();
  }
}
main.ts में स्पैनप्रोसेसर अपडेट करें।

स्पैनप्रोसेसर: [ न्यूसैंपलिंगस्पैनप्रोसेसर( नया बैचस्पैनप्रोसेसर(ट्रेसएक्सपोर्टर); नमूना प्रतिशत ), ],


विज्ञप्ति वक्तव्य यह लेख यहां पुन: प्रस्तुत किया गया है: https://dev.to/siisee11/nestjs-opentelemetry-sampling-2ome?1 यदि कोई उल्लंघन है, तो कृपया इसे हटाने के लिए स्टडी_गोलंग@163.com से संपर्क करें।
नवीनतम ट्यूटोरियल अधिक>

चीनी भाषा का अध्ययन करें

अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।

Copyright© 2022 湘ICP备2022001581号-3