synchronized void registerSource(String name, String desc, MetricsSource source) { checkNotNull(config, "config"); MetricsConfig conf = sourceConfigs.get(name); MetricsSourceAdapter sa = new MetricsSourceAdapter(prefix, name, desc, source, injectedTags, period, conf != null ? conf : config.subset(SOURCE_KEY)); sources.put(name, sa); sa.start(); LOG.debug("Registered source "+ name); }
lastRecs = getMetrics(new MetricsCollectorImpl(), true); updateAttrCache(lastRecs); updateInfoCache(lastRecs);
private void setAttrCacheMetric(AbstractMetric metric, int recNo) { String key = metricName(metric.name(), recNo); attrCache.put(key, new Attribute(key, metric.value())); }
private int updateAttrCache(Iterable<MetricsRecordImpl> lastRecs) { Preconditions.checkNotNull(lastRecs, "LastRecs should not be null"); LOG.debug("Updating attr cache..."); int recNo = 0; int numMetrics = 0; for (MetricsRecordImpl record : lastRecs) { for (MetricsTag t : record.tags()) { setAttrCacheTag(t, recNo); ++numMetrics; } for (AbstractMetric m : record.metrics()) { setAttrCacheMetric(m, recNo); ++numMetrics; } ++recNo; } LOG.debug("Done. # tags & metrics="+ numMetrics); return numMetrics; }
private void snapshotMetrics(MetricsSourceAdapter sa, MetricsBufferBuilder bufferBuilder) { long startTime = Time.monotonicNow(); bufferBuilder.add(sa.name(), sa.getMetrics(collector, true)); collector.clear(); snapshotStat.add(Time.monotonicNow() - startTime); LOG.debug("Snapshotted source "+ sa.name()); }
@Test public void testGetMetricsAndJmx() throws Exception { // create test source with a single metric counter of value 0 TestSource source = new TestSource("test"); MetricsSourceBuilder sb = MetricsAnnotations.newSourceBuilder(source); final MetricsSource s = sb.build(); List<MetricsTag> injectedTags = new ArrayList<MetricsTag>(); MetricsSourceAdapter sa = new MetricsSourceAdapter( "test", "test", "test desc", s, injectedTags, null, null, 1, false); // all metrics are initially assumed to have changed MetricsCollectorImpl builder = new MetricsCollectorImpl(); Iterable<MetricsRecordImpl> metricsRecords = sa.getMetrics(builder, true); // Validate getMetrics and JMX initial values MetricsRecordImpl metricsRecord = metricsRecords.iterator().next(); assertEquals(0L, metricsRecord.metrics().iterator().next().value().longValue()); Thread.sleep(100); // skip JMX cache TTL assertEquals(0L, (Number)sa.getAttribute("C1")); // change metric value source.incrementCnt(); // validate getMetrics and JMX builder = new MetricsCollectorImpl(); metricsRecords = sa.getMetrics(builder, true); metricsRecord = metricsRecords.iterator().next(); assertTrue(metricsRecord.metrics().iterator().hasNext()); Thread.sleep(100); // skip JMX cache TTL assertEquals(1L, (Number)sa.getAttribute("C1")); }
void start() { if (startMBeans) startMBeans(); }
@Test public void testPurgeOldMetrics() throws Exception { // create test source with a single metric counter of value 1 PurgableSource source = new PurgableSource(); MetricsSourceBuilder sb = MetricsAnnotations.newSourceBuilder(source); final MetricsSource s = sb.build(); List<MetricsTag> injectedTags = new ArrayList<MetricsTag>(); MetricsSourceAdapter sa = new MetricsSourceAdapter( "tst", "tst", "testdesc", s, injectedTags, null, null, 1, false); MBeanInfo info = sa.getMBeanInfo(); boolean sawIt = false; for (MBeanAttributeInfo mBeanAttributeInfo : info.getAttributes()) { sawIt |= mBeanAttributeInfo.getName().equals(source.lastKeyName); }; assertTrue("The last generated metric is not exported to jmx", sawIt); Thread.sleep(1000); // skip JMX cache TTL info = sa.getMBeanInfo(); sawIt = false; for (MBeanAttributeInfo mBeanAttributeInfo : info.getAttributes()) { sawIt |= mBeanAttributeInfo.getName().equals(source.lastKeyName); }; assertTrue("The last generated metric is not exported to jmx", sawIt); }
List<MetricsTag> injectedTags = new ArrayList<>(); MetricsSourceAdapter sourceAdapter = new MetricsSourceAdapter("test", "test", "test JMX cache update race condition", sourceBuilder.build(), injectedTags, null, null, JMX_CACHE_TTL, false); ScheduledFuture<?> updaterFuture = updaterExecutor.scheduleAtFixedRate(srcUpdater, sourceAdapter.getJmxCacheTTL(), sourceAdapter.getJmxCacheTTL(), TimeUnit.MILLISECONDS); srcUpdater.setFuture(updaterFuture); readerExecutor.scheduleAtFixedRate(srcReader, 0, // set JMX info cache at the beginning 2 * sourceAdapter.getJmxCacheTTL(), TimeUnit.MILLISECONDS); srcReader.setFuture(readerFuture);
@Override public synchronized void unregisterSource(String name) { if (sources.containsKey(name)) { sources.get(name).stop(); sources.remove(name); } if (allSources.containsKey(name)) { allSources.remove(name); } if (namedCallbacks.containsKey(name)) { namedCallbacks.remove(name); } DefaultMetricsSystem.removeSourceName(name); }
@Override public void run() { MetricsCollectorImpl builder = new MetricsCollectorImpl(); try { // This resets lastRecs. sa.getMetrics(builder, true); LOG.info("reset lastRecs"); } catch (Exception e) { // catch all errors hasError.set(true); LOG.error(e.getStackTrace()); } finally { if (hasError.get()) { LOG.error("Hit error, stopping now"); future.cancel(false); } } } }
private void snapshotMetrics(MetricsSourceAdapter sa, MetricsBufferBuilder bufferBuilder) { long startTime = Time.now(); bufferBuilder.add(sa.name(), sa.getMetrics(collector, true)); collector.clear(); snapshotStat.add(Time.now() - startTime); LOG.debug("Snapshotted source "+ sa.name()); }
@Test public void testGetMetricsAndJmx() throws Exception { // create test source with a single metric counter of value 0 TestSource source = new TestSource("test"); MetricsSourceBuilder sb = MetricsAnnotations.newSourceBuilder(source); final MetricsSource s = sb.build(); List<MetricsTag> injectedTags = new ArrayList<MetricsTag>(); MetricsSourceAdapter sa = new MetricsSourceAdapter( "test", "test", "test desc", s, injectedTags, null, null, 1, false); // all metrics are initially assumed to have changed MetricsCollectorImpl builder = new MetricsCollectorImpl(); Iterable<MetricsRecordImpl> metricsRecords = sa.getMetrics(builder, true); // Validate getMetrics and JMX initial values MetricsRecordImpl metricsRecord = metricsRecords.iterator().next(); assertEquals(0L, metricsRecord.metrics().iterator().next().value().longValue()); Thread.sleep(100); // skip JMX cache TTL assertEquals(0L, (Number)sa.getAttribute("C1")); // change metric value source.incrementCnt(); // validate getMetrics and JMX builder = new MetricsCollectorImpl(); metricsRecords = sa.getMetrics(builder, true); metricsRecord = metricsRecords.iterator().next(); assertTrue(metricsRecord.metrics().iterator().hasNext()); Thread.sleep(100); // skip JMX cache TTL assertEquals(1L, (Number)sa.getAttribute("C1")); }
private int updateAttrCache() { LOG.debug("Updating attr cache..."); int recNo = 0; int numMetrics = 0; for (MetricsRecordImpl record : lastRecs) { for (MetricsTag t : record.tags()) { setAttrCacheTag(t, recNo); ++numMetrics; } for (AbstractMetric m : record.metrics()) { setAttrCacheMetric(m, recNo); ++numMetrics; } ++recNo; } LOG.debug("Done. # tags & metrics="+ numMetrics); return numMetrics; }
@Override public synchronized void startMetricsMBeans() { for (MetricsSourceAdapter sa : sources.values()) { sa.startMBeans(); } }
@Test public void testPurgeOldMetrics() throws Exception { // create test source with a single metric counter of value 1 PurgableSource source = new PurgableSource(); MetricsSourceBuilder sb = MetricsAnnotations.newSourceBuilder(source); final MetricsSource s = sb.build(); List<MetricsTag> injectedTags = new ArrayList<MetricsTag>(); MetricsSourceAdapter sa = new MetricsSourceAdapter( "tst", "tst", "testdesc", s, injectedTags, null, null, 1, false); MBeanInfo info = sa.getMBeanInfo(); boolean sawIt = false; for (MBeanAttributeInfo mBeanAttributeInfo : info.getAttributes()) { sawIt |= mBeanAttributeInfo.getName().equals(source.lastKeyName); }; assertTrue("The last generated metric is not exported to jmx", sawIt); Thread.sleep(1000); // skip JMX cache TTL info = sa.getMBeanInfo(); sawIt = false; for (MBeanAttributeInfo mBeanAttributeInfo : info.getAttributes()) { sawIt |= mBeanAttributeInfo.getName().equals(source.lastKeyName); }; assertTrue("The last generated metric is not exported to jmx", sawIt); }
List<MetricsTag> injectedTags = new ArrayList<>(); MetricsSourceAdapter sourceAdapter = new MetricsSourceAdapter("test", "test", "test JMX cache update race condition", sourceBuilder.build(), injectedTags, null, null, JMX_CACHE_TTL, false); ScheduledFuture<?> updaterFuture = updaterExecutor.scheduleAtFixedRate(srcUpdater, sourceAdapter.getJmxCacheTTL(), sourceAdapter.getJmxCacheTTL(), TimeUnit.MILLISECONDS); srcUpdater.setFuture(updaterFuture); readerExecutor.scheduleAtFixedRate(srcReader, 0, // set JMX info cache at the beginning 2 * sourceAdapter.getJmxCacheTTL(), TimeUnit.MILLISECONDS); srcReader.setFuture(readerFuture);
@Override public synchronized void unregisterSource(String name) { if (sources.containsKey(name)) { sources.get(name).stop(); sources.remove(name); } if (allSources.containsKey(name)) { allSources.remove(name); } if (namedCallbacks.containsKey(name)) { namedCallbacks.remove(name); } }