/ / Dropwizard - Healthcheck समापन बिंदु के लिए url को ओवरराइड करें - सर्वलेट्स, जेटी, ड्रॉपविज़्म

Dropwizard - हेल्थचेक एंडपॉइंट के लिए यूआरएल ओवरराइड करें - servlets, jetty, dropwizard

Dropwizard Codahale मेट्रिक्स HealthCheck सर्वलेट का उपयोग करता है। ड्रॉपवॉर्म के बाहर सर्वलेट का उपयोग करते समय आप init-param "healthcheck-url" सेट करके URI को ओवरराइड कर सकते हैं।

क्या ड्रापवॉयर में इसे ओवरराइड करने का कोई तरीका है?

ऐसा लगता है कि यह कुछ करने के लिए एक init-param NonblockingServletHolder पर सेटिंग के साथ करना होगा।

उत्तर:

जवाब के लिए 0 № 1

आप सही हैं कि एक NonblockingServletHolder हैनिर्माण किया जा रहा है। मुद्दा यह है कि Dropwizard DefaultServerFactory isn "t किसी अनुप्रयोग में सेट किए गए किसी भी Params को स्थानांतरित नहीं कर रहा है, जो कि या तो GroupCxt या AdminContext, जो दोनों Dropwizard पर्यावरण का एक हिस्सा हैं।

मेरा मानना ​​है कि आपके एकमात्र व्यवहार्य विकल्प का विस्तार करना हैAbstractServerFactory और आरंभिक से पहले AdminServlet के लिए विन्यास में init params सेट करें। DefaultServerFactory को आपके कॉन्फ़िगरेशन चाइल्ड क्लास द्वारा बढ़ाया और सेट किया जा सकता है।

class MyServerFactory extends DefaultServerFactory{
//Copied from AbstractServerFactory
protected Handler createAdminServlet(Server server,
MutableServletContextHandler handler,
MetricRegistry metrics,
HealthCheckRegistry healthChecks) {
//Copied from AbstractServerFactory.configureSessionsAndSecurity because its private and can"t be called here
if (handler.isSecurityEnabled()) {
handler.getSecurityHandler().setServer(server);
}
if (handler.isSessionsEnabled()) {
handler.getSessionHandler().setServer(server);
}
handler.setServer(server);
handler.getServletContext().setAttribute(MetricsServlet.METRICS_REGISTRY, metrics);
handler.getServletContext().setAttribute(HealthCheckServlet.HEALTH_CHECK_REGISTRY, healthChecks);
//HERE - set the init parameter and add the servlet
def holder = new NonblockingServletHolder(new AdminServlet())
holder.setInitParameter("healthcheck-uri", "/myurl")
handler.addServlet(holder, "/*");
//END

handler.addFilter(AllowedMethodsFilter.class, "/*", EnumSet.of(DispatcherType.REQUEST))
.setInitParameter(AllowedMethodsFilter.ALLOWED_METHODS_PARAM, Joiner.on(",").join(allowedMethods));
return handler;
}
}

विन्यास बाल वर्ग:

class MyConfiguration extends Configuration{

MyConfiguration(){
setServerFactory(new MyServerFactory())
}
}

हांलांकि इसकी कीमत के बारे निश्चित नहीं हूँ:

मैं कोड है कि initializes में कबूतरसर्वलेट्स और थोड़ी देर के बाद एहसास हुआ कि मैं सर्वरफैक्ट्री क्या कर रहा है, को ओवरराइड किए बिना कुछ भी नहीं कर सकता: ड्रॉपवॉयर एनवायरनमेंट में एक एडमिन कॉंटेक्स्ट, एप्लिकेशन कॉनटेक्स्ट और सर्वलेटइनवर्जन है, जो आपको इनिशियलाइज़ेशन पैरामीटर सेट करने की अनुमति देता है। AdminServlet वर्ग वह जगह है जहाँ "healthcheck-uri" का init param उपयोग किया जाता है, इसलिए मुझे उम्मीद थी कि AdminContext में इन मापदंडों को सेट करना, उन्हें AdminServlet से होकर गुजरेगा, लेकिन अफसोस, वे नहीं हैं क्योंकि Jetty ServletContextHandler जो अंततः है AdminServlet की स्थापना _servletHandler._servletContext._initParams में द इनट पारम की है।

इनमें से कोई भी आपके लिए कुछ नहीं करता है:

    environment.adminContext.setInitParameter("healthcheck-uri","/something")
environment.applicationContext.setInitParameter("healthcheck-uri","/something")
environment.servlets().setInitParameter("healthcheck-uri","/something")
environment.admin().setInitParameter("healthcheck-uri","/something")