@Override public PluginFactory load(SpiExtension spiExtension) { return newPluginFactory(spiExtension); }
@Override public void styxStarting() { plugin.styxStarting(); }
@Override public void styxStopping() { plugin.styxStopping(); }
@Override public Eventual<LiveHttpResponse> intercept(LiveHttpRequest request, Chain originalChain) { StatusRecordingChain chain = new StatusRecordingChain(originalChain); try { return new Eventual<>(toPublisher( toObservable(plugin.intercept(request, chain)) .doOnNext(response -> recordStatusCode(chain, response)) .onErrorResumeNext(error -> error(recordAndWrapError(chain, error))))); } catch (Throwable e) { recordException(e); return Eventual.error(new PluginException(e, plugin.name())); } }
private NamedPlugin loadPlugin(Pair<String, SpiExtension> pair) { String pluginName = pair.key(); SpiExtension spiExtension = pair.value(); PluginFactory factory = pluginFactoryLoader.load(spiExtension); Plugin plugin = factory.create(new PluginEnvironment(pluginName, environment, spiExtension, DEFAULT_PLUGINS_METRICS_SCOPE)); return namedPlugin(pluginName, plugin); }
@Override public void stopping(Service.State from) { for (NamedPlugin plugin : plugins) { try { plugin.styxStopping(); } catch (Exception e) { LOG.error("Error stopping plugin '{}'", plugin.name(), e); } } } }
private Throwable recordAndWrapError(StatusRecordingChain chain, Throwable error) { if (chain.upstreamException) { return error; } recordException(error); return new PluginException(error, plugin.name()); }
public InstrumentedPlugin(NamedPlugin plugin, Environment environment) { this.plugin = requireNonNull(plugin); requireNonNull(environment); this.errorStatusMetrics = new SimpleCache<>(statusCode -> environment.metricRegistry().meter("plugins." + plugin.name() + ".response.status." + statusCode.code())); this.exceptionMetrics = new SimpleCache<>(type -> environment.metricRegistry().meter("plugins." + plugin.name() + ".exception." + formattedExceptionName(type))); this.errors = environment.metricRegistry().meter("plugins." + plugin.name() + ".errors"); LOGGER.info("Plugin {} instrumented", plugin.name()); }
private static String pluginPath(NamedPlugin namedPlugin) { return "/admin/plugins/" + namedPlugin.name(); }
@Override public Map<String, HttpHandler> adminInterfaceHandlers() { return plugin.adminInterfaceHandlers(); }
private PluginEnabledState currentState(NamedPlugin plugin) { return plugin.enabled() ? PluginEnabledState.ENABLED : PluginEnabledState.DISABLED; }
public static NamedPlugin namedPlugin(String name, Plugin plugin) { return new NamedPlugin(name, plugin); }
public PluginSuppliers(Environment environment) { this(environment, new FileSystemPluginFactoryLoader()); }
public Iterable<NamedPlugin> fromConfigurations() { return readPluginsConfig() .map(this::activePlugins) .orElse(emptyList()); }
private Iterable<NamedPlugin> activePlugins(PluginsMetadata pluginsMetadata) { return failureHandlingStrategy.process(pluginsMetadata.activePlugins(), this::loadPlugin); }
boolean apply() { if (isPluginAlreadyInDesiredState()) { return false; } plugin.setEnabled(newState.isEnabled()); return true; }
@JsonProperty("name") public String name() { return plugin.name(); }
private static List<PluginAdminEndpointRoute> pluginAdminEndpointRoutes(NamedPlugin namedPlugin) { Map<String, HttpHandler> adminInterfaceHandlers = namedPlugin.adminInterfaceHandlers(); return mapToList(adminInterfaceHandlers, (relativePath, handler) -> new PluginAdminEndpointRoute(namedPlugin, relativePath, handler)); }
public boolean matches(NamedPlugin plugin) { return plugin.enabled() == isEnabled(); }
String linkLabel() { String relativePath = path().substring(pluginPath(namedPlugin).length() + 1); return namedPlugin.name() + ": " + dropFirstForwardSlash(relativePath); }