java - DropWizard मेट्रिक्स मीटर बनाम टाइमर



timer metrics (1)

आप एक हिस्से में उलझे हुए हैं क्योंकि एक DW मेट्रिक्स टाइमर IS , अन्य बातों के अलावा, एक DW मेट्रिक्स मीटर है।

एक मीटर विशेष रूप से दरों से संबंधित है, जिसे हर्ट्ज (प्रति सेकंड की घटनाओं) में मापा जाता है। प्रत्येक मीटर का परिणाम 4 (?) में प्रकाशित किया जा रहा है:

  • मेट्रिक्स शुरू होने के बाद से औसत (औसत) दर
  • 1, 5 और 15 मिनट रोलिंग मतलब दर

आप अपने कोड में विभिन्न बिंदुओं पर मान दर्ज करके एक मीटर का उपयोग करते हैं - डीडब्ल्यू मेट्रिक्स स्वचालित रूप से आपके द्वारा दिए गए मूल्य के साथ प्रत्येक कॉल की दीवार के समय को नीचे गिराता है, और इनका उपयोग उस दर की गणना करने के लिए करता है जिस पर वह मूल्य बढ़ रहा है:

Meter getRequests = registry.meter("some-operation.operations")
getRequests.mark() //resets the value, e.g. sets it to 0
int numberOfOps = doSomeNumberOfOperations() //takes 10 seconds, returns 333
getRequests.mark(numberOfOps) //sets the value to number of ops.

हम उम्मीद करेंगे कि हमारी दरें 33.3 हर्ट्ज हो सकती हैं, क्योंकि 333 ऑपरेशन हुए थे और दोनों कॉल के बीच का समय मार्क () 10 सेकंड था।

एक टाइमर इन 4 मेट्रिक्स से ऊपर की गणना करता है (प्रत्येक टाइमर पर विचार कर रहा है। एक घटना होने के लिए कॉन्टेक्स्ट) और उन्हें अतिरिक्त मीट्रिक की एक संख्या में जोड़ता है:

  • घटनाओं की संख्या की एक गिनती
  • मेट्रिक्स की शुरुआत के बाद से देखा गया न्यूनतम, औसत और अधिकतम अवधि
  • मानक विचलन
  • एक "हिस्टोग्राम," 50 वें, 97 वें, 98 वें, 99 वें और 99.95 प्रतिशत पर वितरित अवधि की रिकॉर्डिंग

प्रत्येक टाइमर के लिए रिपोर्ट किए गए कुल 15 मैट्रिक्स जैसे कुछ हैं।

संक्षेप में : टाइमर मैट्रिक्स की बहुत सारी रिपोर्ट करते हैं, और वे समझने में मुश्किल हो सकते हैं, लेकिन एक बार जब आप ऐसा करते हैं तो स्पाइक के व्यवहार को समझने के लिए एक बहुत शक्तिशाली तरीका होता है।

तथ्य यह है कि, केवल दो बिंदुओं के बीच बिताए गए समय को एकत्रित करना बहुत उपयोगी मीट्रिक नहीं है। विचार करें: आपके पास इस तरह का कोड है:

Timer timer = registry.timer("costly-operation.service-time")
Timer.Context context = timer.time()
costlyOperation() //service time 10 ms
context.stop()

मान लेते हैं कि महंगी लागत () की एक निरंतर लागत, निरंतर भार है और एक ही धागे पर काम करता है। 1 मिनट की रिपोर्टिंग अवधि के अंदर, हमें 6000 बार इस ऑपरेशन के समय की उम्मीद करनी चाहिए। जाहिर है, हम वायर 6000x पर वास्तविक सेवा समय की रिपोर्टिंग नहीं करेंगे - इसके बजाय हमें अपनी वांछित रिपोर्टिंग विंडो को फिट करने के लिए उन सभी कार्यों को संक्षेप में प्रस्तुत करने की आवश्यकता है। डीडब्ल्यू मेट्रिक्स का टाइमर हमारे लिए, स्वचालित रूप से, एक बार एक मिनट (हमारी रिपोर्टिंग अवधि) के लिए ऐसा करता है। 5 मिनट के बाद, हमारी मैट्रिक्स रजिस्ट्री रिपोर्टिंग करेगी:

  • 100 की दर (प्रति सेकंड घटनाएं)
  • 1 मिनट का मतलब 100 की दर
  • 5 मिनट मतलब 100 की दर
  • 30000 की गिनती (कुल देखी गई घटनाएँ)
  • अधिकतम 10 (एमएस)
  • 10 की एक मिनट
  • 10 का मतलब
  • 50 वाँ प्रतिशतक (p50) 10 का मान
  • 10 के एक 99.9 वें प्रतिशत (p999) मूल्य

अब, आइए विचार करें कि हम एक ऐसी अवधि दर्ज करते हैं जहाँ कभी-कभी हमारा परिचालन एक विस्तारित अवधि के लिए रेल और ब्लॉक से पूरी तरह से चला जाता है:

Timer timer = registry.timer("costly-operation.service-time")
Timer.Context context = timer.time()
costlyOperation() //takes 10 ms usually, but once every 1000 times spikes to 1000 ms
context.stop()

1 मिनट के संग्रह की अवधि में, हम अब 6000 से कम निष्पादन देखेंगे, क्योंकि हर 1000 वें निष्पादन में अधिक समय लगता है। लगभग 5505 पर काम करता है। इसके पहले मिनट (6 मिनट कुल सिस्टम टाइम) के बाद अब हम देखेंगे:

  • 98 की औसत दर (प्रति सेकंड घटनाएं)
  • 1 मिनट का मतलब 91.75 की दर
  • 5 मिनट की औसत दर 98.35
  • 35505 की गिनती (कुल देखी गई घटनाएँ)
  • अधिकतम 1000 की अवधि (एमएस)
  • 10 की न्यूनतम अवधि
  • 10.13 की औसत अवधि
  • 50 वाँ प्रतिशतक (p50) 10 का मान
  • 1000 का 99.9 वां प्रतिशत (p999) मूल्य

यदि आप इसे रेखांकन करते हैं, तो आप देखेंगे कि अधिकांश अनुरोध (p50, p75, p99 आदि) 10 ms में पूरा हो रहे थे, लेकिन 1000 में से एक अनुरोध (p99) 1s में पूरा हो रहा था। इसे औसत दर (लगभग 2%) में मामूली कमी और 1 मिनट में औसतन कमी (लगभग 9%) के रूप में भी देखा जाएगा।

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

मैं ड्रापड्रॉइड मेट्रिक्स लाइब्रेरी (पूर्व में कोडा हेल मेट्रिक्स) सीख रहा हूं और मुझे भ्रम है कि जब मैं मेटर्स बनाम Timers का उपयोग कर रहा हूं। डॉक्स के अनुसार:

मीटर: एक मीटर उस दर को मापता है जिस पर घटनाओं का एक सेट होता है

तथा:

टाइमर: एक टाइमर मूल रूप से एक प्रकार की घटना की अवधि का एक हिस्टोग्राम और इसकी घटना की दर का एक मीटर है

इन परिभाषाओं के आधार पर, मैं इनमें से अंतर नहीं बता सकता। जो मुझे भ्रमित कर रहा है वह यह है कि Timer का उपयोग उस तरह से नहीं किया गया है जैसा कि मैंने उम्मीद की थी कि इसका उपयोग किया जाएगा। मेरे लिए, Timer सिर्फ इतना है: एक टाइमर; यह एक start() और stop() बीच के समय को मापना चाहिए। लेकिन ऐसा प्रतीत होता है कि Timers भी उन घटनाओं पर कब्जा कर लेते हैं, जिन पर घटनाएं घटती हैं, जो ऐसा महसूस करती हैं कि वे Meters पैर की उंगलियों पर कदम रख रही हैं।

अगर मैं एक उदाहरण देख सकता हूं कि प्रत्येक घटक आउटपुट क्या है जो मुझे यह समझने में मदद कर सकता है कि इन दोनों में से कब / कहाँ उपयोग करना है।