HADOOP-14617. Add ReflectionUtils.logThreadInfo that accept slf4j logger API. Contributed by Wenxin He.
Project: http://git-wip-us.apache.org/repos/asf/hadoop/repo Commit: http://git-wip-us.apache.org/repos/asf/hadoop/commit/b17e655b Tree: http://git-wip-us.apache.org/repos/asf/hadoop/tree/b17e655b Diff: http://git-wip-us.apache.org/repos/asf/hadoop/diff/b17e655b Branch: refs/heads/YARN-5734 Commit: b17e655b7069a6e9dab28d9f5fc34bc95a27e5d5 Parents: f2aba1d Author: Steve Loughran <[email protected]> Authored: Tue Jul 4 10:52:59 2017 +0100 Committer: Steve Loughran <[email protected]> Committed: Tue Jul 4 11:41:07 2017 +0100 ---------------------------------------------------------------------- .../org/apache/hadoop/util/ReflectionUtils.java | 30 ++++++++++++++++++++ .../apache/hadoop/util/TestReflectionUtils.java | 19 ++++++++++++- 2 files changed, 48 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hadoop/blob/b17e655b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/util/ReflectionUtils.java ---------------------------------------------------------------------- diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/util/ReflectionUtils.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/util/ReflectionUtils.java index da14979..f1294e7 100644 --- a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/util/ReflectionUtils.java +++ b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/util/ReflectionUtils.java @@ -46,6 +46,7 @@ import org.apache.hadoop.io.Writable; import org.apache.hadoop.io.serializer.Deserializer; import org.apache.hadoop.io.serializer.SerializationFactory; import org.apache.hadoop.io.serializer.Serializer; +import org.slf4j.Logger; /** * General reflection utils @@ -229,6 +230,35 @@ public class ReflectionUtils { } /** + * Log the current thread stacks at INFO level. + * @param log the logger that logs the stack trace + * @param title a descriptive title for the call stacks + * @param minInterval the minimum time from the last + */ + public static void logThreadInfo(Logger log, + String title, + long minInterval) { + boolean dumpStack = false; + if (log.isInfoEnabled()) { + synchronized (ReflectionUtils.class) { + long now = Time.now(); + if (now - previousLogTime >= minInterval * 1000) { + previousLogTime = now; + dumpStack = true; + } + } + if (dumpStack) { + try { + ByteArrayOutputStream buffer = new ByteArrayOutputStream(); + printThreadInfo(new PrintStream(buffer, false, "UTF-8"), title); + log.info(buffer.toString(Charset.defaultCharset().name())); + } catch (UnsupportedEncodingException ignored) { + } + } + } + } + + /** * Return the correctly-typed {@link Class} of the given object. * * @param o object whose correctly-typed <code>Class</code> is to be obtained http://git-wip-us.apache.org/repos/asf/hadoop/blob/b17e655b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/util/TestReflectionUtils.java ---------------------------------------------------------------------- diff --git a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/util/TestReflectionUtils.java b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/util/TestReflectionUtils.java index 56e86ef..62cd625 100644 --- a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/util/TestReflectionUtils.java +++ b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/util/TestReflectionUtils.java @@ -25,9 +25,14 @@ import java.net.URLClassLoader; import java.util.HashMap; import java.util.List; +import static org.hamcrest.CoreMatchers.containsString; import static org.junit.Assert.*; + +import org.apache.hadoop.test.GenericTestUtils.LogCapturer; import org.junit.Before; import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class TestReflectionUtils { @@ -150,7 +155,19 @@ public class TestReflectionUtils { assertTrue("Missing parent method", containsParentMethod); assertTrue("Missing child method", containsChildMethod); } - + + @Test + public void testLogThreadInfo() throws Exception { + Logger logger = LoggerFactory.getLogger(TestReflectionUtils.class); + LogCapturer logCapturer = LogCapturer.captureLogs(logger); + + final String title = "title"; + ReflectionUtils.logThreadInfo(logger, title, 0L); + + assertThat(logCapturer.getOutput(), + containsString("Process Thread Dump: " + title)); + } + // Used for testGetDeclaredFieldsIncludingInherited private class Parent { private int parentField; --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
