2015-02-13 13 views
31

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

मैं कैसे dropwizard दस्तावेज में @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> 

जब मैं टाइमर के लिए एक programatic कॉल का उपयोग करें, मैं क्योंकि मैं जानता हूँ कि जो MetricsRegistry प्रयोग किया जाता है रिपोर्ट प्राप्त कर सकते हैं:

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

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

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

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

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

<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/)

+0

एक InstrumentedResourceMethodApplicationListener रजिस्टर करने के लिए आवश्यकता होती है। इस तरह की चीज केवल एओपी के साथ काम करती है, इसलिए आपको अपनी कक्षाओं में इसे प्रदान करने के लिए कुछ चाहिए। उदाहरण के लिए, स्प्रिंग एओपी इस – Alex

+0

को प्राप्त करने के लिए जेडीके प्रॉक्सी, सीजीआईएलबी या एस्पेक्टजे का उपयोग करता है तो AspectJ जाने का रास्ता होगा? मैं इसे कैसे करूं? – Rolf

+0

और भी दिलचस्प: उदाहरण के लिए @ Slf4j क्यों काम करता है, और @ Timed नहीं करता है? Slf4j काम करने के लिए मैं स्पष्ट रूप से AspectJ का उपयोग नहीं कर रहा हूं। – Rolf

उत्तर

12

लंबी कहानी संक्षेप में, आप @Timed AOP किसी तरह का बिना उपयोग नहीं कर सकते (यह हो स्प्रिंग AOP या AspectJ)।

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

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

विवाद का एक और मुद्दा यह दोनों कोड समर्थन आईडीई एकीकरण के कार्यान्वयन के साथ-साथ javac एनोटेशन प्रोसेसर है:

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

+0

ऐसा लगता है वास्तव में @ टिमड काम करने का तरीका, धन्यवाद, लेकिन अब लॉमोकोक और एस्पेक्टजे मेरे निर्माण चक्र में एक तर्क में आ गए हैं। AspectJ @ Slf4j एनोटेशन के बारे में शिकायत करता है। मुझे यह समझना होगा कि उन्हें कैसे अच्छा खेलना है। – Rolf

+0

लगता है कि लंबोक और AspectJ हमेशा अच्छा खेल नहीं रहे हैं: https://stackoverflow.com/questions/25903686/lombok-does-not-work-with-aspectj – Rolf

+0

कठिन निर्णयों के लिए समय। मैंने @Timed एनोटेशन के पक्ष में लंबोक को हटाने की कोशिश की, लेकिन AspectJ सामान मुझे इतना कठिन समय दे रहा है, और डीबग करने के लिए इतना कठिन और समझ में नहीं आता है, मैंने छोड़ दिया है। यह परियोजना के तरीके को और अधिक जटिल बनाता है, और इसे हल करने की तुलना में एक बड़ी समस्या पैदा करता है। मैंने आपके उत्तर को "उत्तर" के रूप में चिह्नित किया क्योंकि यह * उत्तर है, यह मेरी छोटी परियोजना (और मेरा छोटा दिमाग) के लिए परेशानी का बहुत बड़ा है। कोडाहेल टाइमर को कॉल को हाथ से कोड करना। धन्यवाद! – Rolf

3

जैसा कि दूसरे उत्तर में कहा गया है, आपको अपने तत्काल कक्षाओं को सुनने के लिए आवेदन में कुछ होना चाहिए और उन्हें @ टिमड एनोटेशन के लिए जांचें।

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

5

आपके आवेदन वर्ग के इनिशियलाइज़ विधि में बूटस्ट्रैप पैरामीटर से निर्मित MetricRegistry पहुँचा का प्रयोग करें।

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

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

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

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 परिणाम देखने के लिए अपने जावा आवेदन/सर्वर के खिलाफ JConsole चलाने):

enter image description here

0

तुम भी उस के लिए stagemonitor कोर इस्तेमाल कर सकते हैं। दस्तावेज here और here देखें। इसका फायदा यह है कि स्टेजमोनीटर (जो & ओपन सोर्स बीटीडब्ल्यू है) किसी भी कंटेनर-आधारित एओपी पर निर्भर नहीं है जैसे स्प्रिंग एओपी या ईजेबी इंटरसेप्टर। यह रनटाइम अटैचमेंट के माध्यम से बाइटकोड मैनिपुलेशन का उपयोग करता है जिसका अर्थ है कि आपको अपने एप्लिकेशन स्टार्टअप में -javaagent ध्वज जोड़ने की भी आवश्यकता नहीं है - एक सादा निर्भरता पर्याप्त है।

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

अस्वीकरण: मैं stagemonitor के डेवलपर्स से एक

8

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

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

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

0

नए ड्रॉपविज़ार्ड संस्करणों में (मैं 0.9.2 का उपयोग कर रहा हूं) में, आप सेटअप वातावरण io.dropwizard.setup.Environment के माध्यम से डिफ़ॉल्ट MetricRegistry तक पहुंच सकते हैं। यह डिफ़ॉल्ट MetricRegistry पहले से ही InstrumentedResourceMethodApplicationListener से जुड़ा हुआ है, जो आपके संसाधनों की सभी मीट्रिक को सुनता है।

आप नीचे के रूप में JerseyEnvironment साथ एक संसाधन पंजीकृत हैं, तो

environment.jersey().register(resource); 

आप की जरूरत ही संबंधित मैट्रिक्स रजिस्टर करने के लिए @Timed, @Metered या @ExceptionMetered के साथ अपने संसाधन विधि (या वर्ग) पर टिप्पणी करें।

@POST 
@Timed 
public String show() { 
    return "yay"; 
} 

आप प्रदान कर सकते हैं एक Reporter (एक Slf4jReporter की तरह या JmxReporter) डिफ़ॉल्ट MetricRegistry के रूप में के तहत

Slf4jReporter.forRegistry(environment.metrics()).build(); 

अगर आपके तालिका वास्तव में पंजीकृत किया गया है एक त्वरित परीक्षण को देखने के लिए, आप एक बना सकते हैं GET यूआरएल http://localhost:8081/metrics या अपने परीक्षण वातावरण में संबंधित व्यवस्थापक मेट्रिक्स यूआरएल को कॉल करें।

कुछ अन्य संस्करणों मुझे लगता है कि आप बाहर के भाग्य स्प्रिंग AOP के बिना या मैन्युअल रूप से अपनी कक्षाओं बुनाई करना AspectJ की स्थापना हो जाएगा आप स्पष्ट रूप से के रूप में दिखाया in this Doc

संबंधित मुद्दे