java - कोडा मेट्रिक्स: सादे जावा में @ समयबद्ध मैट्रिक्स एनोटेशन का उपयोग करना




metrics codahale-metrics (6)

मैं कोडेह मेट्रिक्स का उपयोग करके एक सादे जावा अनुप्रयोग में मैट्रिक्स जोड़ने की कोशिश कर रहा हूं। मैं @ समयबद्ध एनोटेशन का उपयोग करना चाहूंगा, लेकिन यह मेरे लिए स्पष्ट नहीं है कि कौन सी मेट्रिकरीजिस्ट्री इसका उपयोग करती है, या यह कैसे बताएं कि कौन सी मेट्रिकरीज़िस्ट्री का उपयोग करना है। आवेदन एक सादा जावा 8 अनुप्रयोग है, जिसे मावेन 3, नो स्प्रिंग, नो हाइबरनेट के साथ बनाया गया है।

मैं कैसे ड्रॉफ़्वेयर डॉक्यूमेंटेशन में @Timed को लागू करने के बारे में कोई दस्तावेज नहीं पा सकता: https://dropwizard.github.io/metrics/3.1.0/manual/

मैंने ये निर्भरताएँ जोड़ी हैं:

<dependency>
  <groupId>io.dropwizard.metrics</groupId>
  <artifactId>metrics-core</artifactId>
  <version>3.1.0</version>
</dependency>
<dependency>
  <groupId>com.codahale.metrics</groupId>
  <artifactId>metrics-annotation</artifactId>
  <version>3.0.2</version>
</dependency>

जब मैं टाइमर के लिए एक प्रोग्राम कॉल का उपयोग करता हूं, तो मुझे रिपोर्ट मिल सकती है क्योंकि मुझे पता है कि मेट्रिक्स रीजेंसी का उपयोग किया जाता है:

static final MetricRegistry metrics = new MetricRegistry();
private void update() throws SQLException {
  Timer.Context time = metrics.timer("domainobject.update").time();
  try {
    [...]
  } finally {
    time.stop();
  }
}

लेकिन जब मैं बहुत अधिक सुरुचिपूर्ण @ समयबद्ध एनोटेशन का उपयोग करता हूं, तो मुझे पता नहीं है कि कौन सी रजिस्ट्री का उपयोग किया जाता है, और इसलिए मैं एक रिपोर्टर नहीं बना सकता, जिसका मतलब है कि मुझे मेट्रिक्स की रिपोर्ट नहीं मिल सकती है (मुझे यकीन नहीं है कि यह वास्तव में होता है कुछ भी):

@Timed(name = "domainobject.update")
private void update() throws SQLException {
    [...]
}

कृपया सलाह दें कि नियमित जावा एप्लिकेशन में @ टाइममेड और अन्य मेट्रिक्स एनोटेशन कैसे काम करें।

अतिरिक्त जानकारी: मुझे यह अजीब लग रहा है इसका कारण यह है कि मैंने लोम्बोक फ्रेमवर्क को जोड़ा है और @ Slf4j एनोटेशन काम करते हैं। मैंने लोवनोक को मावेन पोम.एक्सएमएल में एक निर्भरता के रूप में जोड़ा:

<dependency>
  <groupId>org.projectlombok</groupId>
  <artifactId>lombok</artifactId>
  <version>1.14.8</version>
</dependency>

और मैं सदस्य चर को अव्यवस्थित किए बिना वर्ग में एक लकड़हारा जोड़ने के लिए @ Sl4fj वर्ग एनोटेशन का उपयोग कर सकता हूं:

@Slf4j
public class App {
  public void logsome(){
    log.info("Hello there");
  }
}

तो अगर यह सिर्फ एक निर्भरता को जोड़कर संभव है, तो मुझे लगता है कि मैं सिर्फ एक निर्भरता या कॉन्फ़िगरेशन को याद कर रहा हूं, जैसा कि ऊपर वर्णित है, कोडाहेल @ टाइमडैम एनोटेशन काम पाने के लिए।

(वैसे, लोम्बोक की जाँच करें, यह आपके जीवन को आसान बना देगा: http://projectlombok.org/ )


AOP ओवरकिल है और @timed के उपयोग के लिए उपयुक्त नहीं है, आम तौर पर बोल रहा हूँ।

डिफ़ॉल्ट मेट्रिक्स रजिस्ट्री @timed मीट्रिक को एक समवर्ती HashMap लिखती है और किसी भी सार्थक श्रोताओं को संलग्न नहीं करती है।

DropWizard बूटस्ट्रैप निर्माता:

/**
 * Creates a new {@link Bootstrap} for the given application.
 * @param application a Dropwizard {@link Application}
 */
public Bootstrap(Application<T> application) {
    this.application = application;
    this.objectMapper = Jackson.newObjectMapper();
    this.bundles = Lists.newArrayList();
    this.configuredBundles = Lists.newArrayList();
    this.commands = Lists.newArrayList();
    this.validatorFactory = Validators.newValidatorFactory();


    // returns new ConcurrentHashMap<String, Metric>(); 
    this.metricRegistry = new MetricRegistry(); 


    this.configurationSourceProvider = new FileConfigurationSourceProvider();
    this.classLoader = Thread.currentThread().getContextClassLoader();
    this.configurationFactoryFactory = new DefaultConfigurationFactoryFactory<T>();
}

इसलिए आपको परिणाम देखने के लिए उपयुक्त मीट्रिक रजिस्ट्री का निर्माण / प्रारंभ / पंजीकरण करना होगा।

यहाँ मैं JMX का उपयोग करता हूँ:

@Override
public void initialize(Bootstrap<PayloadStorageConfiguration> bootstrap) {
    JmxReporter.forRegistry(bootstrap.getMetricRegistry()).build().start();
}

बस आपको इतना ही करना है।

यहां आउटपुट का एक उदाहरण है (JMX परिणाम देखने के लिए अपने जावा एप्लिकेशन / सर्वर के खिलाफ जंक कंसोल चलाएं):


अपने एप्लिकेशन वर्ग की आरंभिक विधि में बूटस्ट्रैप पैरामीटर से एक्सेस की गई अंतर्निहित मीट्रिक का उपयोग करें।

@Override
public void initialize(final Bootstrap<Configuration> bootstrap) {
    final JmxReporter reporter = JmxReporter.forRegistry(bootstrap.getMetricRegistry()).build();
    reporter.start();
}

छोटी कहानी, आप किसी प्रकार के एओपी के बिना @Timed उपयोग नहीं कर सकते (यह स्प्रिंग एओपी या एस्पेक्टेज हो)।

एक या दो सप्ताह पहले, मैंने भी अपनी परियोजना में मैट्रिक्स जोड़ने का फैसला किया और इस कार्य के लिए एस्पेक्टज को चुना (ज्यादातर इसलिए कि मैंने इसे इसी उद्देश्य के लिए अतीत में इस्तेमाल किया था और क्योंकि यह संकलन-समय की बुनाई के लिए अनुमति देता है, जबकि वसंत केवल परदे के पीछे से रनटाइम की अनुमति देता है) ।

आपको यहां सभी आवश्यक जानकारी और निर्देश प्राप्त करने में सक्षम होना चाहिए: https://github.com/astefanutti/metrics-aspectj

लोम्बोक के रूप में, मुझे लगता है कि वे अंतर्निहित जेवैक एनोटेशन प्रोसेसर का उपयोग करते हैं:

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


जैसा कि अन्य उत्तर में कहा गया है, आपके पास अपनी तात्कालिक कक्षाओं के लिए सुनने के लिए आवेदन में कुछ होना चाहिए और @ समयबद्ध घोषणा के लिए उन्हें जांचना होगा।

यदि आप Guice का उपयोग कर रहे हैं, तो आप उपयोग कर सकते हैं: https://github.com/palominolabs/metrics-guice



@Timed का उपयोग करना वास्तव में AOP के उपयोग की आवश्यकता नहीं है, जैसा कि पहले से टॉप-रेटेड उत्तर में दावा किया गया था, यदि आप एक कंटेनर के अंदर हैं और ड्रॉपवॉर्म के इंस्ट्रूमेंटेशन लाइब्रेरी में से एक का उपयोग कर रहे हैं। उदाहरण के लिए जर्सी 2.x मॉड्यूल देखें, जिसे आप उपयोग कर सकते हैं (जैसा कि मैंने दूसरों को देखा था), यदि आप source पढ़ते हैं।

आप इन सभी मॉड्यूल को ड्रॉपवॉर्डर डॉक्स में संबंधित " इंस्ट्रूमेंटिंग ____ " बुलेट के तहत पढ़ सकते हैं।

मैं समझता हूं कि ओपी स्पष्ट रूप से इस तरह के कंटेनर के भीतर काम नहीं कर रहा था, लेकिन मैं इस जानकारी की पेशकश करना चाहता था, क्योंकि हम में से कई इस उत्तर की तलाश में एक आधुनिक वेब सेवा पर काम कर रहे हैं जो इस तरह के संसाधनों को अपने रनटाइम वातावरण में पंजीकृत कर सकती है।





codahale-metrics