@Override public List<ConfigurationOption<?>> getConfigurationOptions() { final List<ConfigurationOption<?>> configurationOptions = super.getConfigurationOptions(); if (!ClassUtils.isPresent("org.springframework.web.servlet.HandlerMapping")) { configurationOptions.remove(monitorOnlySpringMvcOption); } if (!ClassUtils.isPresent("org.jboss.resteasy.core.ResourceMethodRegistry")) { configurationOptions.remove(monitorOnlyResteasyOption); } return configurationOptions; }
public <T extends StagemonitorPlugin> T getPlugin(Class<T> pluginClass) { final T plugin = configuration.getConfig(pluginClass); if (!plugin.isInitialized()) { logger.warn("The plugin " + plugin.getClass().getSimpleName() + " has not been initialized yet. " + "You should define a dependency via StagemonitorPlugin#dependsOn to " + getClass().getSimpleName()); } return plugin; }
static void initializePluginsInOrder(Collection<String> disabledPlugins, Iterable<StagemonitorPlugin> plugins) { Set<Class<? extends StagemonitorPlugin>> alreadyInitialized = new HashSet<Class<? extends StagemonitorPlugin>>(); Set<StagemonitorPlugin> notYetInitialized = getPluginsToInit(disabledPlugins, plugins); while (!notYetInitialized.isEmpty()) { int countNotYetInitialized = notYetInitialized.size(); // try to init plugins which are for (Iterator<StagemonitorPlugin> iterator = notYetInitialized.iterator(); iterator.hasNext(); ) { StagemonitorPlugin stagemonitorPlugin = iterator.next(); { final List<Class<? extends StagemonitorPlugin>> dependencies = stagemonitorPlugin.dependsOn(); if (dependencies.isEmpty() || alreadyInitialized.containsAll(dependencies)) { initializePlugin(stagemonitorPlugin); iterator.remove(); alreadyInitialized.add(stagemonitorPlugin.getClass()); } } } if (countNotYetInitialized == notYetInitialized.size()) { // no plugins could be initialized in this try. this probably means there is a cyclic dependency throw new IllegalStateException("Cyclic dependencies detected: " + notYetInitialized); } } }
private static void initializePlugin(final StagemonitorPlugin stagemonitorPlugin) { final String pluginName = stagemonitorPlugin.getClass().getSimpleName(); try { stagemonitorPlugin.initializePlugin(new StagemonitorPlugin.InitArguments(metric2Registry, getConfiguration(), measurementSession, healthCheckRegistry)); stagemonitorPlugin.initialized = true; for (Runnable onInitCallback : stagemonitorPlugin.onInitCallbacks) { onInitCallback.run(); } stagemonitorPlugin.registerWidgetTabPlugins(new StagemonitorPlugin.WidgetTabPluginsRegistry(pathsOfWidgetTabPlugins)); stagemonitorPlugin.registerWidgetMetricTabPlugins(new StagemonitorPlugin.WidgetMetricTabPluginsRegistry(pathsOfWidgetMetricTabPlugins)); healthCheckRegistry.register(pluginName, ImmediateResult.of(HealthCheck.Result.healthy("version " + stagemonitorPlugin.getVersion()))); } catch (final Exception e) { healthCheckRegistry.register(pluginName, ImmediateResult.of(HealthCheck.Result.unhealthy(e))); logger.warn("Error while initializing plugin " + pluginName + " (this exception is ignored)", e); } }
/** * Should be called when the server is shutting down. * Calls the {@link StagemonitorPlugin#onShutDown()} method of all plugins */ public static synchronized void shutDown() { if (measurementSession.getEndTimestamp() != null) { // shutDown has already been called return; } logger.info("Shutting down stagemonitor"); measurementSession.setEndTimestamp(System.currentTimeMillis()); for (Runnable onShutdownAction : onShutdownActions) { try { onShutdownAction.run(); } catch (RuntimeException e) { logger.warn(e.getMessage(), e); } } for (StagemonitorPlugin plugin : plugins) { try { plugin.onShutDown(); } catch (Exception e) { logger.warn(e.getMessage(), e); } } configuration.close(); }
@Test public void testInitPlugins_MultipleDependencies() { final List<StagemonitorPlugin> plugins = Arrays.asList(new PluginMultipleDependencies(), new PluginSimpleDependency2(), new PluginNoDependency(), new PluginSimpleDependency()); Stagemonitor.initializePluginsInOrder(Collections.emptyList(), plugins); for (StagemonitorPlugin plugin : plugins) { assertThat(plugin.isInitialized()).describedAs("{} is not initialized", plugin.getClass().getSimpleName()).isTrue(); } }
@Override public List<ConfigurationOption<?>> getConfigurationOptions() { final List<ConfigurationOption<?>> configurationOptions = super.getConfigurationOptions(); if (!ClassUtils.isPresent("org.springframework.web.servlet.HandlerMapping")) { configurationOptions.remove(monitorOnlySpringMvcOption); } if (!ClassUtils.isPresent("org.jboss.resteasy.core.ResourceMethodRegistry")) { configurationOptions.remove(monitorOnlyResteasyOption); } return configurationOptions; }