@Override public synchronized <T extends MetricsSink> T register(final String name, final String description, final T sink) { LOG.debug(name +", "+ description); if (allSinks.containsKey(name)) { LOG.warn("Sink "+ name +" already exists!"); return sink; } allSinks.put(name, sink); if (config != null) { registerSink(name, description, sink); } // We want to re-register the sink to pick up new config // when the metrics system restarts. register(name, new AbstractCallback() { @Override public void postStart() { register(name, description, sink); } }); return sink; }
@Override public synchronized boolean shutdown() { LOG.debug("refCount="+ refCount); if (refCount <= 0) { LOG.debug("Redundant shutdown", new Throwable()); return true; // already shutdown } if (--refCount > 0) return false; if (monitoring) { try { stop(); } catch (Exception e) { LOG.warn("Error stopping the metrics system", e); } } allSources.clear(); allSinks.clear(); callbacks.clear(); namedCallbacks.clear(); if (mbeanName != null) { MBeans.unregister(mbeanName); mbeanName = null; } LOG.info(prefix +" metrics system shutdown complete."); return true; }
@Override public void run() { try { onTimerEvent(); } catch (Exception e) { LOG.warn("Error invoking metrics timer", e); } } }, millis, millis);
private synchronized void configure(String prefix) { config = MetricsConfig.create(prefix); configureSinks(); configureSources(); configureSystem(); }
return this; switch (initMode()) { case NORMAL: try { start(); } catch (MetricsConfigException e) { LOG.info(prefix +" metrics system started in standby mode"); initSystemMBean(); return this;
@Test public void testHangingSink() { new ConfigBuilder().add("*.period", 8) .add("test.sink.test.class", TestSink.class.getName()) .add("test.sink.hanging.retry.delay", "1") .add("test.sink.hanging.retry.backoff", "1.01") .add("test.sink.hanging.retry.count", "0") .save(TestMetricsConfig.getTestFilename("hadoop-metrics2-test")); MetricsSystemImpl ms = new MetricsSystemImpl("Test"); ms.start(); TestSource s = ms.register("s3", "s3 desc", new TestSource("s3rec")); s.c1.incr(); HangingSink hanging = new HangingSink(); ms.registerSink("hanging", "Hang the sink!", hanging); ms.publishMetricsNow(); assertEquals(1L, ms.droppedPubAll.value()); assertFalse(hanging.getInterrupted()); ms.stop(); ms.shutdown(); assertTrue(hanging.getInterrupted()); assertTrue("The sink didn't get called after its first hang " + "for subsequent records.", hanging.getGotCalledSecondTime()); }
/** * HADOOP-11932 */ @Test(timeout = 5000) public void testHangOnSinkRead() throws Exception { new ConfigBuilder().add("*.period", 8) .add("test.sink.test.class", TestSink.class.getName()) .save(TestMetricsConfig.getTestFilename("hadoop-metrics2-test")); MetricsSystemImpl ms = new MetricsSystemImpl("Test"); ms.start(); try { CountDownLatch collectingLatch = new CountDownLatch(1); MetricsSink sink = new TestClosableSink(collectingLatch); ms.registerSink("closeableSink", "The sink will be used to test closeability", sink); // trigger metric collection first time ms.onTimerEvent(); // Make sure that sink is collecting metrics assertTrue(collectingLatch.await(1, TimeUnit.SECONDS)); } finally { ms.stop(); } }
@Test public void testStartStopStart() { DefaultMetricsSystem.shutdown(); // Clear pre-existing source names. MetricsSystemImpl ms = new MetricsSystemImpl("test"); TestSource ts = new TestSource("ts"); ms.start(); ms.register("ts", "", ts); MetricsSourceAdapter sa = ms.getSourceAdapter("ts"); assertNotNull(sa); assertNotNull(sa.getMBeanName()); ms.stop(); ms.shutdown(); ms.start(); sa = ms.getSourceAdapter("ts"); assertNotNull(sa); assertNotNull(sa.getMBeanName()); ms.stop(); ms.shutdown(); }
.save(TestMetricsConfig.getTestFilename("hadoop-metrics2-test")); MetricsSystemImpl ms = new MetricsSystemImpl("Test"); ms.start(); TestSource s1 = ms.register("s1", "s1 desc", new TestSource("s1rec")); s1.c1.incr(); s1.xxx.incr(); ms.register("gsink30", "gsink30 desc", gsink30); ms.register("gsink31", "gsink31 desc", gsink31); ms.publishMetricsNow(); // publish the metrics ms.stop();
@Override public synchronized void stop() { if (!monitoring && !DefaultMetricsSystem.inMiniClusterMode()) { LOG.warn(prefix +" metrics system not yet started!", new MetricsException("Illegal stop")); return; } if (!monitoring) { // in mini cluster mode LOG.info(prefix +" metrics system stopped (again)"); return; } for (Callback cb : callbacks) cb.preStop(); for (Callback cb : namedCallbacks.values()) cb.preStop(); LOG.info("Stopping "+ prefix +" metrics system..."); stopTimer(); stopSources(); stopSinks(); clearConfigs(); monitoring = false; LOG.info(prefix +" metrics system stopped."); for (Callback cb : callbacks) cb.postStop(); for (Callback cb : namedCallbacks.values()) cb.postStop(); }
MetricsSystemImpl ms = new MetricsSystemImpl("test"); ms.start(); mm1.testMetric2.incr(2); ms.publishMetricsNow(); // publish the metrics ms.stop(); ms.shutdown();
@Override public synchronized <T> T register(String name, String desc, T source) { MetricsSourceBuilder sb = MetricsAnnotations.newSourceBuilder(source); final MetricsSource s = sb.build(); MetricsInfo si = sb.info(); String name2 = name == null ? si.name() : name; final String finalDesc = desc == null ? si.description() : desc; final String finalName = // be friendly to non-metrics tests DefaultMetricsSystem.sourceName(name2, !monitoring); allSources.put(finalName, s); LOG.debug(finalName +", "+ finalDesc); if (monitoring) { registerSource(finalName, finalDesc, s); } // We want to re-register the source to pick up new config when the // metrics system restarts. register(finalName, new AbstractCallback() { @Override public void postStart() { registerSource(finalName, finalDesc, s); } }); return source; }
@VisibleForTesting public MetricsSystem getMetricsSystem() { synchronized (metricsSystemLock) { if (metricsSystem == null) { metricsSystem = new MetricsSystemImpl(); metricsSystem.init(METRICS_SYSTEM_NAME); } } return metricsSystem; }
public static synchronized void fileSystemClosed() { if (numFileSystems == 1) { instance.publishMetricsNow(); instance.stop(); instance.shutdown(); instance = null; } numFileSystems--; }
@Override public synchronized void start() { checkNotNull(prefix, "prefix"); if (monitoring) { LOG.warn(prefix +" metrics system already started!", new MetricsException("Illegal start")); return; } for (Callback cb : callbacks) cb.preStart(); for (Callback cb : namedCallbacks.values()) cb.preStart(); configure(prefix); startTimer(); monitoring = true; LOG.info(prefix +" metrics system started"); for (Callback cb : callbacks) cb.postStart(); for (Callback cb : namedCallbacks.values()) cb.postStart(); }
@Override public void postStart() { register(name, description, sink); } });
@Test public void testRegisterSourceJmxCacheTTL() { MetricsSystem ms = new MetricsSystemImpl(); ms.init("TestMetricsSystem"); TestSource ts = new TestSource("ts"); ms.register(ts); MetricsSourceAdapter sa = ((MetricsSystemImpl) ms) .getSourceAdapter("TestSource"); assertEquals(MetricsConfig.PERIOD_DEFAULT * 1000 + 1, sa.getJmxCacheTTL()); ms.shutdown(); }
public static synchronized void fileSystemStarted() { if (numFileSystems == 0) { instance = new MetricsSystemImpl(); instance.init("azure-file-system"); } numFileSystems++; }
.add("test.sink.sink2.metric.filter.exclude", "Y*") .save(TestMetricsConfig.getTestFilename("hadoop-metrics2-test")); MetricsSystemImpl ms = new MetricsSystemImpl("Test"); ms.start(); ms.register("s0", "s0 desc", new TestSource("s0rec")); TestSource s1 = ms.register("s1", "s1 desc", new TestSource("s1rec")); s1.c1.incr(); s1.xxx.incr(); MetricsSink sink1 = mock(MetricsSink.class); MetricsSink sink2 = mock(MetricsSink.class); ms.registerSink("sink1", "sink1 desc", sink1); ms.registerSink("sink2", "sink2 desc", sink2); ms.publishMetricsNow(); // publish the metrics ms.stop(); ms.shutdown();
/** * HADOOP-11932 */ @Test(timeout = 5000) public void testHangOnSinkRead() throws Exception { new ConfigBuilder().add("*.period", 8) .add("test.sink.test.class", TestSink.class.getName()) .save(TestMetricsConfig.getTestFilename("hadoop-metrics2-test")); MetricsSystemImpl ms = new MetricsSystemImpl("Test"); ms.start(); try { CountDownLatch collectingLatch = new CountDownLatch(1); MetricsSink sink = new TestClosableSink(collectingLatch); ms.registerSink("closeableSink", "The sink will be used to test closeability", sink); // trigger metric collection first time ms.onTimerEvent(); // Make sure that sink is collecting metrics assertTrue(collectingLatch.await(1, TimeUnit.SECONDS)); } finally { ms.stop(); } }