/* * This software is licensed under the Apache License, Version 2.0 * (the "License") agreement; you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.moneta.config.dropwizard; import io.dropwizard.Application; import io.dropwizard.setup.Bootstrap; import io.dropwizard.setup.Environment; import net.admin4j.ui.servlets.MemoryMonitorStartupServlet; import org.apache.commons.lang.ArrayUtils; import org.eclipse.jetty.servlet.BaseHolder.Source; import org.eclipse.jetty.servlet.FilterHolder; import org.eclipse.jetty.servlet.Holder; import org.eclipse.jetty.servlet.ServletHolder; import org.force66.correlate.RequestCorrelationFilter; import org.moneta.MonetaPerformanceFilter; import org.moneta.MonetaServlet; import org.moneta.MonetaTopicListServlet; import org.moneta.config.MonetaConfiguration; import com.codahale.metrics.JmxReporter; /** * Dropwizard configuration for Moneta * @author D. Ashmore * */ public class MonetaDropwizardApplication extends Application<MonetaDropwizardConfiguration> { protected static boolean containsConfiguration(String[] args) { for (String arg : args) { if (arg.endsWith(".yaml") || arg.endsWith(".yml") || arg.endsWith(".json")) { return true; } } return false; } public static void main(String[] args) throws Exception { String[] localArgs = args; if (!containsConfiguration(args)) { // Add default config if nothing specified localArgs = (String[]) ArrayUtils.add(args, "/moneta-config.yaml"); } new MonetaDropwizardApplication().run(localArgs); } @Override public void initialize(Bootstrap<MonetaDropwizardConfiguration> bootstrap) { bootstrap.setConfigurationSourceProvider(new MonetaConfigurationSourceProvider()); super.initialize(bootstrap); } @Override public void run(MonetaDropwizardConfiguration configuration, Environment environment) throws Exception { /* * The ServletHolder allows you to specify init parameters and other * servlet configuration itmes in the web.xml. Setting the order means * that the servlet is initialized on startup; by default it is not. */ ServletHolder topicHolder = new ServletHolder(Source.EMBEDDED); topicHolder.setHeldClass(MonetaServlet.class); topicHolder.setInitOrder(0); topicHolder.setInitParameter( MonetaServlet.CONFIG_IGNORED_CONTEXT_PATH_NODES, "moneta,topic"); environment.getApplicationContext() .getServletHandler() .addServletWithMapping(topicHolder, "/moneta/topic/*"); // Will be initialized on first use by default. environment.getApplicationContext() .addServlet(MonetaTopicListServlet.class, "/moneta/topics/*"); /* * Install thread contention monitoring -- withdrawn after issue with * Jetty discovered. */ // ServletHolder threadContentionHolder = new // ServletHolder(Source.EMBEDDED); // threadContentionHolder.setHeldClass(ThreadMonitorStartupServlet.class); // threadContentionHolder.setInitOrder(0); // environment.getApplicationContext() // .getServletHandler() // .addServlet(threadContentionHolder); /* * Install memory alert monitoring */ ServletHolder memoryAlertHolder = new ServletHolder(Source.EMBEDDED); memoryAlertHolder.setHeldClass(MemoryMonitorStartupServlet.class); memoryAlertHolder.setInitOrder(0); environment.getApplicationContext() .getServletHandler() .addServlet(memoryAlertHolder); /* * Install the performance filter */ FilterHolder perfFilterHolder = new FilterHolder(Holder.Source.EMBEDDED); perfFilterHolder.setHeldClass(MonetaPerformanceFilter.class); perfFilterHolder.setInitParameter( MonetaPerformanceFilter.PARM_MAX_TRNASACTION_TIME_THRESHOLD_IN_MILLIS, "3000"); environment.getApplicationContext() .addFilter(perfFilterHolder, "/moneta/*", null); /* * Install RequestCorrelation filter so I can get a correlation id in * the logs */ FilterHolder correlationFilterHolder = new FilterHolder( Holder.Source.EMBEDDED); correlationFilterHolder.setHeldClass(RequestCorrelationFilter.class); // Install healthchecks MonetaConfiguration config = new MonetaConfiguration(); for (String checkName : config.getHealthChecks() .keySet()) { environment.healthChecks() .register(checkName, config.getHealthChecks() .get(checkName)); } final JmxReporter jmxReporter = JmxReporter.forRegistry( environment.metrics()) .build(); jmxReporter.start(); } }