.addOptionProvider(servletPlugin) .addConfigSource(configurationSource) .build(); servletPlugin.initPasswordChecker(configuration);
private static void reloadPluginsAndConfiguration() { List<ConfigurationSource> configurationSources = new ArrayList<ConfigurationSource>(); for (StagemonitorConfigurationSourceInitializer initializer : ServiceLoader.load(StagemonitorConfigurationSourceInitializer.class, Stagemonitor.class.getClassLoader())) { initializer.modifyConfigurationSources(new StagemonitorConfigurationSourceInitializer.ModifyArguments(configurationSources)); } configurationSources.remove(null); plugins = ServiceLoader.load(StagemonitorPlugin.class, Stagemonitor.class.getClassLoader()); configuration = ConfigurationRegistry.builder() .optionProviders(plugins) .configSources(configurationSources) .build(); try { for (StagemonitorConfigurationSourceInitializer initializer : ServiceLoader.load(StagemonitorConfigurationSourceInitializer.class, Stagemonitor.class.getClassLoader())) { initializer.onConfigurationInitialized(new StagemonitorConfigurationSourceInitializer.ConfigInitializedArguments(configuration)); } } catch (Exception e) { logger.error(e.getMessage(), e); logger.error("Stagemonitor will be deactivated!"); disabled = true; } } }
private ConfigurationRegistry getDefaultConfigurationRegistry(List<ConfigurationSource> configSources) { try { final ConfigurationRegistry configurationRegistry = ConfigurationRegistry.builder() .configSources(configSources) .optionProviders(ServiceLoader.load(ConfigurationOptionProvider.class, ElasticApmTracer.class.getClassLoader())) .failOnMissingRequiredValues(true) .build(); configurationRegistry.scheduleReloadAtRate(30, TimeUnit.SECONDS); return configurationRegistry; } catch (IllegalStateException e) { logger.warn(e.getMessage()); return ConfigurationRegistry.builder() .addConfigSource(new SimpleSource("Noop Configuration") .add(CoreConfiguration.ACTIVE, "false") .add(CoreConfiguration.INSTRUMENT, "false") .add(CoreConfiguration.SERVICE_NAME, "none") .add(CoreConfiguration.SAMPLE_RATE, "0")) .optionProviders(ServiceLoader.load(ConfigurationOptionProvider.class, ElasticApmTracer.class.getClassLoader())) .build(); } }
/** * Creates a configuration registry where all {@link ConfigurationOptionProvider}s are wrapped with * {@link org.mockito.Mockito#spy(Object)} * <p> * That way, the default configuration values are returned but can be overridden by {@link org.mockito.Mockito#when(Object)} * * @return a syp configuration registry */ public static ConfigurationRegistry createSpyConfig() { ConfigurationRegistry.Builder builder = ConfigurationRegistry.builder(); for (ConfigurationOptionProvider options : ServiceLoader.load(ConfigurationOptionProvider.class)) { builder.addOptionProvider(spy(options)); } return builder .addConfigSource(new SimpleSource(CONFIG_SOURCE_NAME).add("service_name", "elastic-apm-test")) .addConfigSource(new PropertyFileConfigurationSource("elasticapm.properties")) .build(); }
@BeforeEach void setUp() { config = new TestConfig(); this.configurationRegistry = ConfigurationRegistry.builder() .addOptionProvider(config) .addOptionProvider(new CoreConfiguration()) .addOptionProvider(new StacktraceConfiguration()) .addConfigSource(new SimpleSource().add("duration", "1")) .build(); startupInfo = new StartupInfo(); logger = mock(Logger.class); }
@Test public void testCycleElasticsearchUrlsBasicAuth() throws Exception { CorePlugin corePlugin = ConfigurationRegistry.builder() .addOptionProvider(new CorePlugin()) .addConfigSource(new SimpleSource("test") .add("stagemonitor.reporting.elasticsearch.url", "http://bla:1/,http://other:p%21p@bla:2,https://bla:3,http://bla:4/search") .add("stagemonitor.reporting.elasticsearch.username", "user") .add("stagemonitor.reporting.elasticsearch.password", "p@ssword!")) .build() .getConfig(CorePlugin.class); URL cycle1 = corePlugin.getElasticsearchUrl(); String basicAuth = HttpClient.getBasicAuthFromUserInfo(cycle1); String testBasicAuth = "Basic " + DatatypeConverter.printBase64Binary("user:p@ssword!".getBytes()); assertThat(basicAuth).isEqualTo(testBasicAuth); assertThat(cycle1.toString()).isEqualTo("http://user:p%40ssword%21@bla:1"); URL cycle2 = corePlugin.getElasticsearchUrl(); String basicAuthCycle2 = HttpClient.getBasicAuthFromUserInfo(cycle2); String testBasicAuthCycle2 = "Basic " + DatatypeConverter.printBase64Binary("other:p!p".getBytes()); assertThat(basicAuth).isEqualTo(testBasicAuth); assertThat(cycle2.toString()).isEqualTo("http://other:p%21p@bla:2"); assertThat(corePlugin.getElasticsearchUrl().toString()).isEqualTo("https://user:p%40ssword%21@bla:3"); assertThat(corePlugin.getElasticsearchUrl().toString()).isEqualTo("http://user:p%40ssword%21@bla:4/search"); assertThat(corePlugin.getElasticsearchUrl().toString()).isEqualTo("http://user:p%40ssword%21@bla:1"); assertThat(corePlugin.getElasticsearchUrl().toString()).isEqualTo("http://other:p%21p@bla:2"); assertThat(corePlugin.getElasticsearchUrl().toString()).isEqualTo("https://user:p%40ssword%21@bla:3"); assertThat(corePlugin.getElasticsearchUrl().toString()).isEqualTo("http://user:p%40ssword%21@bla:4/search"); }
@Test public void testValidateConfigurationOption() throws Exception { final ConfigurationOption<Boolean> configurationOption = ConfigurationOption.booleanOption() .key("foo") .addValidator((value) -> { if (!value) { throw new IllegalArgumentException("Validation failed"); } }) .buildWithDefault(true); final ConfigurationOptionProvider optionProvider = TestConfigurationOptionProvider.of(configurationOption); final SimpleSource configurationSource = new SimpleSource("test"); final ConfigurationRegistry config = ConfigurationRegistry.builder() .addOptionProvider(optionProvider) .addConfigSource(configurationSource) .build(); try { config.save("foo", "false", "test"); fail(); } catch (IllegalArgumentException e) { assertEquals("Validation failed", e.getMessage()); } }
@Test public void testOnConfigurationChanged() throws Exception { AtomicBoolean changeListenerFired = new AtomicBoolean(false); final ConfigurationOption<String> configurationOption = ConfigurationOption.stringOption() .key("foo") .dynamic(true) .addChangeListener((opt, oldValue, newValue) -> { assertEquals("foo", opt.getKey()); assertEquals("old", oldValue); assertEquals("new", newValue); changeListenerFired.set(true); throw new RuntimeException("This is an expected test exception. " + "It is thrown to test whether Configuration can cope with change listeners that throw an exception."); }).buildWithDefault("old"); final ConfigurationOptionProvider optionProvider = TestConfigurationOptionProvider.of(configurationOption); final SimpleSource configurationSource = new SimpleSource("test"); final ConfigurationRegistry config = ConfigurationRegistry.builder() .addOptionProvider(optionProvider) .addConfigSource(configurationSource) .build(); config.save("foo", "new", "test"); assertTrue(changeListenerFired.get()); }
@Before public void setUp() throws Exception { GlobalTracerTestHelper.resetGlobalTracer(); tracingPlugin = spy(new TracingPlugin()); doReturn(true).when(tracingPlugin).isRoot(any()); configuration = ConfigurationRegistry.builder() .addOptionProvider(tracingPlugin) .addConfigSource(new SimpleSource()) .build(); final Tracer tracer = mock(Tracer.class); GlobalTracer.register(tracer); spanContext = mock(SpanContextInformation.class); when(spanContext.getSpanWrapper()).thenReturn(mock(SpanWrapper.class)); context = new PreExecutionInterceptorContext(spanContext); interceptor = new RateLimitingPreExecutionInterceptor(); interceptor.init(configuration); }
@Test public void testAliasKey() throws Exception { class Provider extends ConfigurationOptionProvider { private ConfigurationOption<String> aliasOption = ConfigurationOption.stringOption() .key("foo") .aliasKeys("foo.old") .buildRequired(); } final ConfigurationRegistry configurationRegistry = ConfigurationRegistry.builder() .addOptionProvider(new Provider()) .addConfigSource(new SimpleSource().add("foo.old", "bar")) .build(); configurationLogger.logConfiguration(configurationRegistry); verify(logger).warn(eq("Detected usage of an old configuration key: '{}'. " + "Please use '{}' instead."), eq("foo.old"), eq("foo")); }
@Test public void testLogUrlWithBasicAuth() throws Exception { class Provider extends ConfigurationOptionProvider { private ConfigurationOption<List<URL>> urlBasicAuthOption = ConfigurationOption.urlsOption() .key("foo") .buildRequired(); } final ConfigurationRegistry configurationRegistry = ConfigurationRegistry.builder() .addOptionProvider(new Provider()) .addConfigSource(new SimpleSource("source").add("foo", "http://user:pwd@example.com")) .build(); configurationLogger.logConfiguration(configurationRegistry); verify(logger).info(startsWith("# stagemonitor configuration")); verify(logger).info(eq("{}: {} (source: {})"), eq("foo"), eq("http://user:XXX@example.com"), eq("source")); } }
@Test public void testLogSensitive() throws Exception { class Provider extends ConfigurationOptionProvider { private ConfigurationOption<String> sensitiveOption = ConfigurationOption.stringOption() .key("foo") .sensitive() .buildRequired(); } final ConfigurationRegistry configurationRegistry = ConfigurationRegistry.builder() .addOptionProvider(new Provider()) .addConfigSource(new SimpleSource("source").add("foo", "secret")) .build(); configurationLogger.logConfiguration(configurationRegistry); verify(logger).info(startsWith("# stagemonitor configuration")); verify(logger).info(eq("{}: {} (source: {})"), eq("foo"), eq("XXXX"), eq("source")); }
@Before public void setUp() throws Exception { GlobalTracerTestHelper.resetGlobalTracer(); tracingPlugin = spy(new TracingPlugin()); doReturn(true).when(tracingPlugin).isRoot(any()); configuration = ConfigurationRegistry.builder() .addOptionProvider(tracingPlugin) .addConfigSource(new SimpleSource()) .build(); final Tracer tracer = mock(Tracer.class); GlobalTracer.register(tracer); spanContext = mock(SpanContextInformation.class); when(spanContext.getSpanWrapper()).thenReturn(mock(SpanWrapper.class)); context = new PreExecutionInterceptorContext(spanContext); interceptor = new ProbabilisticSamplingPreExecutionInterceptor(); interceptor.init(configuration); }
@Test public void testCycleElasticsearchUrls() throws Exception { CorePlugin corePlugin = ConfigurationRegistry.builder() .addOptionProvider(new CorePlugin()) .addConfigSource(new SimpleSource("test") .add("stagemonitor.reporting.elasticsearch.url", "http://bla:1/,http://bla:2,http://bla:3")) .build() .getConfig(CorePlugin.class); assertThat(corePlugin.getElasticsearchUrl().toString()).isEqualTo("http://bla:1"); assertThat(corePlugin.getElasticsearchUrl().toString()).isEqualTo("http://bla:2"); assertThat(corePlugin.getElasticsearchUrl().toString()).isEqualTo("http://bla:3"); assertThat(corePlugin.getElasticsearchUrl().toString()).isEqualTo("http://bla:1"); assertThat(corePlugin.getElasticsearchUrl().toString()).isEqualTo("http://bla:2"); assertThat(corePlugin.getElasticsearchUrl().toString()).isEqualTo("http://bla:3"); }
@Before public void setUp() throws Exception { configurationRegistry = ConfigurationRegistry.builder() // its also possible to automatically detect all ConfigurationOptionProvider // implementations at runtime via ServiceLoader.load .addOptionProvider(new ExampleConfiguration()) // Defines the hierarchy of configuration sources // The first one has the highest precedence // You can implement custom configuration sources // For example JdbcConfigurationSource to sore config values in your DB .addConfigSource(new SimpleSource()) .addConfigSource(new SystemPropertyConfigurationSource()) .addConfigSource(new PropertyFileConfigurationSource("application.properties")) .addConfigSource(new EnvironmentVariableConfigurationSource()) .build(); // reloads configuration options from all configuration sources each 30 seconds configurationRegistry.scheduleReloadAtRate(30, TimeUnit.SECONDS); exampleConfiguration = configurationRegistry.getConfig(ExampleConfiguration.class); }
@Test public void testDeprecatedOption() throws Exception { class Provider extends ConfigurationOptionProvider { private ConfigurationOption<String> deprecatedOption = ConfigurationOption.stringOption() .key("foo") .tags("deprecated") .buildRequired(); } final ConfigurationRegistry configurationRegistry = ConfigurationRegistry.builder() .addOptionProvider(new Provider()) .addConfigSource(new SimpleSource().add("foo", "bar")) .build(); configurationLogger.logConfiguration(configurationRegistry); verify(logger).warn(contains("Detected usage of deprecated configuration option '{}'"), eq("foo")); }
@Test public void testIsPasswordSetFalse() throws Exception { ConfigurationRegistry configuration = ConfigurationRegistry.builder().build(); assertFalse(new ConfigurationPasswordChecker(configuration, passwordKey).isPasswordSet()); }
@Test public void testAddConfigurationSource() { ConfigurationRegistry configuration = ConfigurationRegistry.builder().build(); configuration.addConfigurationSource(new SimpleSource()); assertEquals(Collections.singletonMap("Transient Configuration Source", true), configuration.getNamesOfConfigurationSources()); }
@Before public void before() throws Exception { ConfigurationRegistry configuration = ConfigurationRegistry.builder() .addOptionProvider(new ServletPlugin()) .build(); config = configuration.getConfig(ServletPlugin.class); }
@Test(expected = IllegalArgumentException.class) public void testDuplicateLabel() throws Exception { final ConfigurationOptionProvider optionProvider = TestConfigurationOptionProvider.of( ConfigurationOption.stringOption().key("foo").description("Foo").build(), ConfigurationOption.stringOption().key("foo").label("Bar").build()); ConfigurationRegistry.builder().addOptionProvider(optionProvider).build(); }