private synchronized void configure(String prefix) { config = MetricsConfig.create(prefix); configureSinks(); configureSources(); configureSystem(); }
private synchronized void configureSinks() { sinkConfigs = config.getInstanceConfigs(SINK_KEY); long confPeriodMillis = 0; for (Entry<String, MetricsConfig> entry : sinkConfigs.entrySet()) { MetricsConfig conf = entry.getValue(); int sinkPeriod = conf.getInt(PERIOD_KEY, PERIOD_DEFAULT); // Support configuring periodMillis for testing. long sinkPeriodMillis = conf.getLong(PERIOD_MILLIS_KEY, sinkPeriod * 1000); confPeriodMillis = confPeriodMillis == 0 ? sinkPeriodMillis : ArithmeticUtils.gcd(confPeriodMillis, sinkPeriodMillis); String clsName = conf.getClassName(""); if (clsName == null) continue; // sink can be registered later on String sinkName = entry.getKey(); try { MetricsSinkAdapter sa = newSink(sinkName, conf.getString(DESC_KEY, sinkName), conf); sa.start(); sinks.put(sinkName, sa); } catch (Exception e) { LOG.warn("Error creating sink '"+ sinkName +"'", e); } } long periodSec = config.getInt(PERIOD_KEY, PERIOD_DEFAULT); period = confPeriodMillis > 0 ? confPeriodMillis : config.getLong(PERIOD_MILLIS_KEY, periodSec * 1000); }
MetricsFilter getFilter(String prefix) { // don't create filter instances without out options MetricsConfig conf = subset(prefix); if (conf.isEmpty()) { return null; } MetricsFilter filter = getPlugin(prefix); if (filter != null) { return filter; } // glob filter is assumed if pattern is specified but class is not. filter = new GlobFilter(); filter.init(conf); return filter; }
MetricsSourceAdapter(String prefix, String name, String description, MetricsSource source, Iterable<MetricsTag> injectedTags, long period, MetricsConfig conf) { this(prefix, name, description, source, injectedTags, conf.getFilter(RECORD_FILTER_KEY), conf.getFilter(METRIC_FILTER_KEY), period + 1, // hack to avoid most of the "innocuous" races. conf.getBoolean(START_MBEANS_KEY, true)); }
static MetricsSinkAdapter newSink(String name, String desc, MetricsSink sink, MetricsConfig conf) { return new MetricsSinkAdapter(name, desc, sink, conf.getString(CONTEXT_KEY), conf.getFilter(SOURCE_FILTER_KEY), conf.getFilter(RECORD_FILTER_KEY), conf.getFilter(METRIC_FILTER_KEY), conf.getInt(PERIOD_KEY, PERIOD_DEFAULT) * 1000, conf.getInt(QUEUE_CAPACITY_KEY, QUEUE_CAPACITY_DEFAULT), conf.getInt(RETRY_DELAY_KEY, RETRY_DELAY_DEFAULT), conf.getFloat(RETRY_BACKOFF_KEY, RETRY_BACKOFF_DEFAULT), conf.getInt(RETRY_COUNT_KEY, RETRY_COUNT_DEFAULT)); }
private void configureSources() { sourceFilter = config.getFilter(PREFIX_DEFAULT + SOURCE_FILTER_KEY); sourceConfigs = config.getInstanceConfigs(SOURCE_KEY); registerSystemSource(); }
<T extends MetricsPlugin> T getPlugin(String name) { String clsName = getClassName(name); if (clsName == null) { return null; } try { Class<?> cls = Class.forName(clsName, true, getPluginLoader()); @SuppressWarnings("unchecked") T plugin = (T) cls.newInstance(); plugin.init(name.isEmpty() ? this : subset(name)); return plugin; } catch (Exception e) { throw new MetricsConfigException("Error creating plugin: "+ clsName, e); } }
LOG.info("Loaded properties from {}", fname); if (LOG.isDebugEnabled()) { LOG.debug("Properties: {}", toString(cf)); MetricsConfig mc = new MetricsConfig(cf, prefix); LOG.debug("Metrics Config: {}", mc); return mc; Joiner.on(",").join(fileNames)); return new MetricsConfig(new PropertiesConfiguration(), prefix);
private void testInstances(MetricsConfig c) throws Exception { Map<String, MetricsConfig> map = c.getInstanceConfigs("t1"); Map<String, MetricsConfig> map2 = c.getInstanceConfigs("t2"); t1i1.getString("foo")); assertEquals("value of bar in t1 instance i1", "p1.t1 default bar", t1i1.getString("bar")); assertEquals("value of foo in t1 instance 42", "default foo", t1i42.getString("foo")); assertEquals("value of foo in t2 instance i1", "p1.t2.i1.foo", t2i1.getString("foo")); assertEquals("value of bar in t2 instance i1", "p1 default bar", t2i1.getString("bar"));
@Override public String toString() { return toString(this); }
String getClassName(String prefix) { String classKey = prefix.isEmpty() ? "class" : prefix.concat(".class"); String clsName = getString(classKey); LOG.debug("Class name for prefix {} is {}", prefix, clsName); if (clsName == null || clsName.isEmpty()) { return null; } return clsName; }
@Override public MetricsConfig subset(String prefix) { return new MetricsConfig(this, prefix); }
static MetricsSinkAdapter newSink(String name, String desc, MetricsSink sink, MetricsConfig conf) { return new MetricsSinkAdapter(name, desc, sink, conf.getString(CONTEXT_KEY), conf.getFilter(SOURCE_FILTER_KEY), conf.getFilter(RECORD_FILTER_KEY), conf.getFilter(METRIC_FILTER_KEY), conf.getInt(PERIOD_KEY, PERIOD_DEFAULT), conf.getInt(QUEUE_CAPACITY_KEY, QUEUE_CAPACITY_DEFAULT), conf.getInt(RETRY_DELAY_KEY, RETRY_DELAY_DEFAULT), conf.getFloat(RETRY_BACKOFF_KEY, RETRY_BACKOFF_DEFAULT), conf.getInt(RETRY_COUNT_KEY, RETRY_COUNT_DEFAULT)); }
<T extends MetricsPlugin> T getPlugin(String name) { String clsName = getClassName(name); if (clsName == null) return null; try { Class<?> cls = Class.forName(clsName, true, getPluginLoader()); @SuppressWarnings("unchecked") T plugin = (T) cls.newInstance(); plugin.init(name.isEmpty() ? this : subset(name)); return plugin; } catch (Exception e) { throw new MetricsConfigException("Error creating plugin: "+ clsName, e); } }
private void configureSources() { sourceFilter = config.getFilter(PREFIX_DEFAULT + SOURCE_FILTER_KEY); sourceConfigs = config.getInstanceConfigs(SOURCE_KEY); registerSystemSource(); }
/** * Load configuration from a list of files until the first successful load * @param conf the configuration object * @param files the list of filenames to try * @return the configuration object */ static MetricsConfig loadFirst(String prefix, String... fileNames) { for (String fname : fileNames) { try { Configuration cf = new PropertiesConfiguration(fname) .interpolatedConfiguration(); LOG.info("loaded properties from "+ fname); LOG.debug(toString(cf)); MetricsConfig mc = new MetricsConfig(cf, prefix); LOG.debug(mc); return mc; } catch (ConfigurationException e) { if (e.getMessage().startsWith("Cannot locate configuration")) { continue; } throw new MetricsConfigException(e); } } LOG.warn("Cannot locate configuration: tried "+ Joiner.on(",").join(fileNames)); // default to an empty configuration return new MetricsConfig(new PropertiesConfiguration(), prefix); }
MetricsSourceAdapter(String prefix, String name, String description, MetricsSource source, Iterable<MetricsTag> injectedTags, long period, MetricsConfig conf) { this(prefix, name, description, source, injectedTags, conf.getFilter(RECORD_FILTER_KEY), conf.getFilter(METRIC_FILTER_KEY), period + 1, // hack to avoid most of the "innocuous" races. conf.getBoolean(START_MBEANS_KEY, true)); }
private void testInstances(MetricsConfig c) throws Exception { Map<String, MetricsConfig> map = c.getInstanceConfigs("t1"); Map<String, MetricsConfig> map2 = c.getInstanceConfigs("t2"); t1i1.getString("foo")); assertEquals("value of bar in t1 instance i1", "p1.t1 default bar", t1i1.getString("bar")); assertEquals("value of foo in t1 instance 42", "default foo", t1i42.getString("foo")); assertEquals("value of foo in t2 instance i1", "p1.t2.i1.foo", t2i1.getString("foo")); assertEquals("value of bar in t2 instance i1", "p1 default bar", t2i1.getString("bar"));