paint-brush
डेटाडॉग के साथ मोनोलिथ की निगरानी: बाईस्टैंडर प्रभाव से कैसे बचेंद्वारा@feddena
386 रीडिंग
386 रीडिंग

डेटाडॉग के साथ मोनोलिथ की निगरानी: बाईस्टैंडर प्रभाव से कैसे बचें

द्वारा Fedor Denisov7m2024/07/08
Read on Terminal Reader

बहुत लंबा; पढ़ने के लिए

बड़े मोनोलिथिक अनुप्रयोगों में, स्पष्ट स्वामित्व की कमी के कारण त्रुटि ट्रैकिंग और निगरानी अक्सर अप्रभावी हो जाती है। यह मार्गदर्शिका मोनोलिथ-डोमेन-स्प्लिटर लाइब्रेरी में पेश किए गए डोमेन एनोटेशन के माध्यम से जवाबदेही सौंपने के लिए एक संरचित दृष्टिकोण का प्रस्ताव करके इस मुद्दे को संबोधित करती है
featured image - डेटाडॉग के साथ मोनोलिथ की निगरानी: बाईस्टैंडर प्रभाव से कैसे बचें
Fedor Denisov HackerNoon profile picture
0-item

बड़े मोनोलिथिक अनुप्रयोगों में, स्पष्ट स्वामित्व की कमी के कारण त्रुटि ट्रैकिंग और निगरानी अक्सर अप्रभावी हो जाती है। यह मार्गदर्शिका डोमेन एनोटेशन के माध्यम से जवाबदेही सौंपने के लिए एक संरचित दृष्टिकोण का प्रस्ताव करके इस मुद्दे को संबोधित करती है।


कई टीमों वाले बड़े मोनोलिथिक के लिए प्रभावी निगरानी स्थापित करना चुनौतीपूर्ण हो सकता है। स्पष्ट स्वामित्व के बिना, त्रुटि ट्रैकिंग सामान्य हो जाती है और अक्सर अनदेखा कर दी जाती है। एक समाधान यह है कि ऑन-कॉल इंजीनियरों को यह पहचानने के लिए कहा जाए कि किस टीम को निगरानी अलार्म का जवाब देना चाहिए। हालाँकि, अधिक कुशल दृष्टिकोण प्रत्येक लॉग और डेटाडॉग स्पैन में डोमेन और टीम की जानकारी शामिल करना है।


डोमेन एनोटेशन को समझना

हमारे एप्लिकेशन के विभिन्न भागों के लिए कौन सी टीम जिम्मेदार है, इसका ट्रैक रखने के लिए, हम डोमेन एनोटेशन नामक एक सिस्टम का उपयोग करते हैं। डोमेन एनोटेशन आपके एप्लिकेशन के कोड के हर हिस्से को लेबल करता है, जो स्पष्ट रूप से दर्शाता है कि कौन किसके लिए जिम्मेदार है। यह जिम्मेदारियों के प्रबंधन में स्पष्ट संगठन और जवाबदेही प्रदान करता है।

डोमेन एनोटेशन का उपयोग करने के लाभ

डोमेन एनोटेशन एक मोनोलिथिक एप्लिकेशन के भीतर टीम की जिम्मेदारियों को ट्रैक करने के लिए एक स्पष्ट और संगठित विधि प्रदान करते हैं। डोमेन एनोटेशन के साथ अपने कोड के कुछ हिस्सों को टैग करके, आप यह कर सकते हैं:

  • लॉग और ट्रेस प्रबंधन को सरल बनाएं : विशिष्ट मानदंडों, जैसे टीम की जिम्मेदारी, के आधार पर लॉग और ट्रेस को फ़िल्टर करें, जिससे समस्याओं की शीघ्र पहचान और समाधान संभव हो सके।
  • सटीक ट्रैकिंग बनाए रखें : टीम की जिम्मेदारियों में परिवर्तनों के साथ सहजता से अनुकूलन करें, क्योंकि एनोटेशन टीम के नाम के बजाय डोमेन से जुड़े होते हैं।
  • जवाबदेही बढ़ाएं : स्पष्ट रूप से परिभाषित करें कि कौन सी टीम प्रत्येक डोमेन के लिए जिम्मेदार है, जिससे संगठन और लक्षित निगरानी में सुधार होगा।
  • निगरानी दक्षता में सुधार : सटीक जवाबदेही प्रदान करके और समग्र दक्षता को बढ़ाकर बेहतर निगरानी प्रथाओं को सुविधाजनक बनाना।

डोमेन एनोटेशन प्रोसेसिंग

कुशल निगरानी और पता लगाने की क्षमता सुनिश्चित करने के लिए, प्रत्येक वेब अनुरोध को उचित डोमेन जानकारी के साथ टैग किया जाता है। यह कई घटकों के सहयोग से प्राप्त किया जाता है: DomainProvider , DomainSpanService , DomainMdcProvider , और DomainHandlerInterceptor

निम्नलिखित चित्र में इस प्रक्रिया का उच्च-स्तरीय अवलोकन दर्शाया गया है:

डोमेन एनोटेशन प्रोसेसिंग का आरेख

प्रमुख घटकों का स्पष्टीकरण

  • डोमेन प्रदाता : विशिष्ट हैंडलर विधियों या बीन्स से जुड़े डोमेन की पहचान करता है। यह AOP (एस्पेक्ट-ओरिएंटेड प्रोग्रामिंग) और MVC (मॉडल-व्यू-कंट्रोलर) कॉल में डोमेन एनोटेशन खोजने में मदद करता है।
  • डोमेनस्पैनसर्विस : स्पैन में डोमेन टैग जोड़ता है, जो ट्रेसिंग सिस्टम में कार्य की इकाइयाँ हैं। यह सेवा सुनिश्चित करती है कि प्रत्येक स्पैन को उचित डोमेन जानकारी के साथ टैग किया गया है।
  • DomainMdcProvider : MDC (मैप्ड डायग्नोस्टिक कॉन्टेक्स्ट) के अंतर्गत डोमेन टैग्स का प्रबंधन करता है, जो लॉगिंग फ्रेमवर्क की एक विशेषता है जो लॉग प्रविष्टियों को प्रासंगिक जानकारी के साथ टैग करने की अनुमति देता है।
  • डोमेनहैंडलरइंटरसेप्टर : वेब अनुरोधों को इंटरसेप्ट करता है, यह सुनिश्चित करता है कि बेहतर निगरानी और पता लगाने की क्षमता के लिए प्रत्येक अनुरोध को उचित डोमेन जानकारी के साथ टैग किया गया है।

इन घटकों का विस्तृत कार्यान्वयन एक साझा लाइब्रेरी में समाहित किया जाएगा, जो बड़े मोनोलिथिक अनुप्रयोगों में वेब अनुरोधों को टैग करने और निगरानी करने के लिए एक पुन: प्रयोज्य समाधान प्रदान करेगा।

यह पता लगाना कि कौन सा कोड किसका है

डोमेन एनोटेशन के साथ क्लास स्तर पर स्वामित्व को परिभाषित करना सीधा है। मुख्य कक्षाओं में शीर्ष-स्तरीय एनोटेशन लागू करने से, स्वामित्व उन कक्षाओं के भीतर सभी विस्तृत संसाधनों तक फैल जाता है। प्रत्येक टीम उचित डोमेन एनोटेशन के साथ उन कक्षाओं को लेबल कर सकती है जो उनके स्वामित्व में हैं, जिससे हर एक विधि को चिह्नित करने की आवश्यकता के बिना स्पष्टता और जवाबदेही सुनिश्चित होती है।


ऐसे मामलों में जब एक क्लास में कई टीमें कोड रखती हैं और तत्काल रीफैक्टरिंग उचित नहीं है, तो आप अलग-अलग डोमेन एनोटेशन के साथ अलग-अलग विधियों को चिह्नित कर सकते हैं, जो क्लास-लेवल एनोटेशन पर प्राथमिकता लेते हैं। यह अलग-अलग टीमों को विशिष्ट विधियाँ असाइन करने की अनुमति देता है, जो समग्र संरचना को जटिल किए बिना लचीलापन प्रदान करता है।

एनोटेशन द्वारा समर्थित नहीं मामलों पर काबू पाना

जबकि डोमेन एनोटेशन अविश्वसनीय रूप से उपयोगी हैं, ऐसे दुर्लभ मामले हैं जहाँ उनका उपयोग नहीं किया जा सकता है। उदाहरण के लिए, हमें क्वार्ट्ज जॉब क्रिएशन के साथ समस्याओं का सामना करना पड़ा, जो क्वार्ट्ज के AOP लॉजिक और डोमेन एनोटेशन के लिए उपयोग किए जाने वाले AOP लॉजिक के बीच टकराव के कारण डोमेन एनोटेशन के साथ सहजता से काम नहीं करता था।

उन नौकरियों और प्रक्रियाओं के लिए जिन्हें सीधे एनोटेट नहीं किया जा सकता है, हमने नौकरी कार्यान्वयन में सीधे डोमेनटैग्स सेवा का उपयोग किया। इस दृष्टिकोण ने हमें नौकरी के निष्पादन तर्क के भीतर मैन्युअल रूप से डोमेन टैग जोड़ने की अनुमति दी।

यहाँ एक उदाहरण दिया गया है कि हमने DomainTagsService को क्वार्ट्ज़ जॉब में कैसे एकीकृत किया:

 final override fun execute(context: JobExecutionContext) { domainTagsService.invoke(domain) { withLoggedExecutionDetails(context, ::doExecute) } }

कृत्रिम सेवाओं के साथ निगरानी और दृश्यता में सुधार करें

जबकि प्रत्येक टीम के लिए अलग-अलग सेवाएँ होने से निगरानी और स्वामित्व में महत्वपूर्ण लाभ मिलते हैं, यह मोनोलिथ को विभाजित करने के लिए उच्च लागत और प्रयासों के साथ-साथ संभावित अतिरिक्त विकास व्यय के साथ आता है। जब मोनोलिथ को मॉड्यूल में विभाजित किया जाता है तो ग्रैडल के साथ बिल्ड समय में सुधार की संभावना को ध्यान में रखते हुए, कई मामलों में मोनोरेपो बनाए रखना सबसे कुशल समाधान हो सकता है।

कृत्रिम सेवाओं का परिचय

डेटाडॉग में प्रत्येक टीम की गतिविधियों की निगरानी को सरल बनाने के लिए, आप विभिन्न टीमों के लिए कृत्रिम सेवा नाम निर्दिष्ट कर सकते हैं। यह दृष्टिकोण सुनिश्चित करता है कि डेटाडॉग के निगरानी उपकरणों में प्रत्येक टीम का अपना समर्पित अनुभाग हो। यदि आपके पास प्रबंधित करने के लिए कई सेवाएँ हैं, तो कृत्रिम सेवा नामों का उपयोग करना भ्रामक हो सकता है, लेकिन सीमित संख्या में बैकएंड सेवाओं के साथ यह प्रबंधनीय हो जाता है। इन कृत्रिम सेवा नामों में उपसर्ग जोड़ने से आपके डेटाडॉग सेटअप में संगठन और स्पष्टता बनाए रखने में मदद मिलती है, जिससे विभिन्न टीमों और उनकी जिम्मेदारियों के बीच अंतर करना आसान हो जाता है।


स्क्रीनशॉट के बजाय आरेख का उपयोग करें?? कार्यकर्ता/वेबऐप का यहाँ कोई मतलब नहीं है

डेटाडॉग एपीएम में कृत्रिम सेवाएँ जो वास्तव में एक ऐप हैं

लॉग के लिए कृत्रिम सेवाओं का उपयोग क्यों न किया जाए?

लॉग के लिए कृत्रिम सेवा नामों का उपयोग करने से भ्रम की स्थिति पैदा हो सकती है, क्योंकि एक ही लॉग प्रविष्टि विभिन्न सेवाओं के अंतर्गत दिखाई दे सकती है।


उदाहरण के लिए, एक ही प्रमाणीकरण सेवा का उपयोग करने वाले दो एंडपॉइंट पर विचार करें। यदि इन एंडपॉइंट को अलग-अलग डोमेन के साथ एनोटेट किया जाता है, तो प्रमाणीकरण तर्क विभिन्न कृत्रिम सेवाओं के तहत लॉग का उत्पादन करेगा। जब कोई लॉग एक्सप्लोर कर रहा होता है, तो यह भ्रम पैदा कर सकता है, क्योंकि वे कई सेवा नामों के तहत दिखाई देते हैं। इस समस्या से बचने के लिए, कृत्रिम सेवा नामों को केवल उन स्पैन पर लागू करना बेहतर है जो ट्रेस में एक साथ एकत्रित होते हैं ताकि भ्रम कम हो


क्या इसका कोई मतलब है? मुझे नहीं लगता कि इसका कोई मतलब है।


इस समस्या का दृश्यात्मक प्रतिनिधित्व इस प्रकार है:

लॉग के लिए कृत्रिम सेवाओं का उपयोग न करने के पीछे तर्क

मॉनिटरिंग और डैशबोर्ड में कृत्रिम सेवाओं का उपयोग

कृत्रिम सेवाओं का उपयोग करने से आप न केवल एपीएम ट्रेस के साथ काम कर सकते हैं, बल्कि डेटाडॉग मेट्रिक्स में सेवा द्वारा फ़िल्टर भी कर सकते हैं, जो एक विस्तारित अवधि के लिए संग्रहीत होते हैं, जिससे लंबे समय तक परिवर्तनों को ट्रैक करना संभव हो जाता है।

मॉनिटर का उदाहरण

नीचे डेटाडॉग में एक मॉनिटर का स्क्रीनशॉट है जो क्वेरी में कृत्रिम सेवा नाम konsus-assets उपयोग करता है:

मॉनिटर जो क्वेरी में कृत्रिम सेवा 'konsus-assets' का उपयोग करता है

डैशबोर्ड का उदाहरण

नीचे डेटाडॉग में डैशबोर्ड का स्क्रीनशॉट दिया गया है जो फ़िल्टर में कृत्रिम सेवा नाम konsus-assets उपयोग करता है:

डैशबोर्ड जो फ़िल्टर में नकली सेवा 'konsus-assets' का उपयोग करता है

अपनी निगरानी रणनीति में नकली सेवाओं का उपयोग करके, आप एक अखंड अनुप्रयोग के भीतर प्रत्येक टीम की गतिविधियों की दृश्यता और जवाबदेही को बढ़ा सकते हैं। यह दृष्टिकोण टीम-विशिष्ट मॉनिटर और डैशबोर्ड बनाने और बनाए रखने की प्रक्रिया को सरल बनाता है, जिससे डेटाडॉग में अधिक प्रभावी और संगठित निगरानी होती है।


ऊपर लपेटकर

डोमेन एनोटेशन डेटाडॉग में मोनोलिथिक अनुप्रयोगों की निगरानी को सरल बनाने के लिए एक सीधा दृष्टिकोण प्रदान करते हैं। इस रणनीति को लागू करके, आप लॉग, स्पैन और मेट्रिक्स की प्रबंधन क्षमता को बढ़ा सकते हैं, अपने मॉनिटरिंग सेटअप को विशिष्ट टीमों के लिए तैयार किए गए टूल में बदल सकते हैं। यह जवाबदेही और संगठन को बेहतर बनाता है और आपके पूरे एप्लिकेशन में अधिक प्रभावी और कुशल समस्या निवारण और प्रदर्शन विश्लेषण की सुविधा देता है।

चाबी छीनना

  1. बेहतर स्वामित्व और जवाबदेही : अपने कोड के कुछ हिस्सों को डोमेन एनोटेशन के साथ एनोटेट करके, आप स्पष्ट रूप से परिभाषित कर सकते हैं कि प्रत्येक डोमेन के लिए कौन सी टीम जिम्मेदार है। इससे बेहतर संगठन और लक्षित निगरानी की सुविधा मिलती है।
  2. उन्नत लॉग और ट्रेस प्रबंधन : डोमेन एनोटेशन आपको विशिष्ट मानदंडों, जैसे टीम की जिम्मेदारी, के आधार पर लॉग और ट्रेस दोनों को फ़िल्टर करने की अनुमति देता है, जिससे समस्याओं की त्वरित पहचान और समाधान संभव होता है।
  3. कृत्रिम सेवाओं के साथ लचीलापन : स्पैन (लॉग नहीं) के लिए कृत्रिम सेवा नामों का उपयोग करने से यह सुनिश्चित होता है कि लॉग स्पष्ट रहें और उनके वास्तविक मूल तक पहुंचा जा सके, जिससे भ्रम की स्थिति से बचा जा सके।
  4. एकीकरण चुनौतियों पर काबू पाना : ऐसे मामलों में जहां एनोटेशन को सीधे लागू नहीं किया जा सकता है, जैसे कि क्वार्ट्ज जैसे कुछ जॉब निष्पादन फ्रेमवर्क के साथ, जॉब कार्यान्वयन में सीधे DomainTagsService जैसी सेवाओं का उपयोग करना सुनिश्चित करता है कि डोमेन-विशिष्ट निगरानी अभी भी बनाए रखी जा सकती है।

डोमेन एनोटेशन का उपयोग करने का चरण-दर-चरण तरीका:

  1. डोमेन और टीम परिभाषित करें

    यह lib के साथ बदल जाएगा!!!

    अपने एप्लिकेशन में विभिन्न डोमेन और टीमों का प्रतिनिधित्व करने वाले enums बनाएँ:

    • @Domain एक एनोटेशन है जिसे क्लासों या फंक्शनों पर लागू किया जा सकता है, तथा उन्हें एक विशिष्ट डोमेन मान के साथ चिह्नित किया जा सकता है।
    • DomainValue एक सूची है जो विभिन्न डोमेन का प्रतिनिधित्व करती है, प्रत्येक डोमेन एक टीम से संबद्ध होता है।
    • Team एक सूची है जो अनुप्रयोग पर काम करने वाली विभिन्न टीमों का प्रतिनिधित्व करती है।
     @Retention(AnnotationRetention.RUNTIME) @Target(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION) annotation class Domain(val value: DomainValue) enum class DomainValue(val team: Team) { USER_MANAGEMENT(Team.TEAM_A), PAYMENT_PROCESSING(Team.TEAM_B), NOTIFICATIONS(Team.TEAM_C) } enum class Team { TEAM_A, TEAM_B, TEAM_C }
  2. कक्षाओं (और यदि आवश्यक हो तो विधियों) पर टिप्पणी करें

     @Domain(DomainValue.USER_MANAGEMENT) class UserService { @Domain(DomainValue.PAYMENT_PROCESSING) fun processPayment() { ... } }
  3. असमर्थित मामलों को संभालें

    ऐसे मामलों के लिए जिन्हें सीधे एनोटेट नहीं किया जा सकता है, तर्क को लपेटने के लिए सीधे DomainTagsService उपयोग करें

     fun executeNotSupportedByAnnotationsLogic() { domainTagsService.invoke(domain) { executeLogic() } }
  4. डेटाडॉग से निगरानी करें

    मॉनिटर, डैशबोर्ड और APM ट्रेस फ़िल्टरिंग के लिए कृत्रिम सेवा फ़िल्टर का उपयोग करें


इन चरणों का पालन करके, आप अपने मोनोलिथिक एप्लिकेशन में डोमेन एनोटेशन को प्रभावी ढंग से लागू कर सकते हैं, जिससे बेहतर निगरानी, जवाबदेही और समग्र दक्षता सुनिश्चित हो सकेगी।


पोस्ट पढ़ने के लिए धन्यवाद!