From da967923b1f16dbd1047aa602daffc1e4d571593 Mon Sep 17 00:00:00 2001 From: Alexandre Montplaisir Date: Wed, 9 Sep 2015 15:07:24 -0400 Subject: [PATCH] Fix: Return the correct list of available Java events The "lttng list -j/-l" command should list the events that are currently offered by Java application and available to be enabled. Due to some confusion in the implementation of the corresponding agent command response, it was actually returning the list of events that were enabled in the tracing session. Rectify this by sending the list of loggers of the corresponding domain that have one or more LTTng log handlers attached. The interface method was also renamed from listEnabledEvents() to listAvailableEvents() to make it more representative. Fixes: #933 Signed-off-by: Alexandre Montplaisir --- .../org/lttng/ust/agent/AbstractLttngAgent.java | 17 ++------- .../ust/agent/client/ILttngTcpClientListener.java | 11 ++++-- .../agent/client/SessiondListLoggersCommand.java | 6 +-- .../org/lttng/ust/agent/jul/LttngJulAgent.java | 43 ++++++++++++++++++++++ .../org/lttng/ust/agent/log4j/LttngLog4jAgent.java | 40 ++++++++++++++++++++ 5 files changed, 97 insertions(+), 20 deletions(-) diff --git a/liblttng-ust-java-agent/java/lttng-ust-agent-common/org/lttng/ust/agent/AbstractLttngAgent.java b/liblttng-ust-java-agent/java/lttng-ust-agent-common/org/lttng/ust/agent/AbstractLttngAgent.java index 8531eae..080d57a 100644 --- a/liblttng-ust-java-agent/java/lttng-ust-agent-common/org/lttng/ust/agent/AbstractLttngAgent.java +++ b/liblttng-ust-java-agent/java/lttng-ust-agent-common/org/lttng/ust/agent/AbstractLttngAgent.java @@ -19,7 +19,6 @@ package org.lttng.ust.agent; import java.util.HashSet; -import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.NavigableMap; @@ -234,19 +233,11 @@ public abstract class AbstractLttngAgent return decrementEventCount(eventName, enabledEvents); } + /* + * Implementation of this method is domain-specific. + */ @Override - public Iterable listEnabledEvents() { - List events = new LinkedList(); - - if (enabledWildcards.get() > 0) { - events.add(WILDCARD); - } - for (String prefix : enabledEventPrefixes.keySet()) { - events.add(new String(prefix + WILDCARD)); - } - events.addAll(enabledEvents.keySet()); - return events; - } + public abstract List listAvailableEvents(); @Override public boolean isEventEnabled(String eventName) { diff --git a/liblttng-ust-java-agent/java/lttng-ust-agent-common/org/lttng/ust/agent/client/ILttngTcpClientListener.java b/liblttng-ust-java-agent/java/lttng-ust-agent-common/org/lttng/ust/agent/client/ILttngTcpClientListener.java index 031d4e0..d4ee46a 100644 --- a/liblttng-ust-java-agent/java/lttng-ust-agent-common/org/lttng/ust/agent/client/ILttngTcpClientListener.java +++ b/liblttng-ust-java-agent/java/lttng-ust-agent-common/org/lttng/ust/agent/client/ILttngTcpClientListener.java @@ -17,6 +17,8 @@ package org.lttng.ust.agent.client; +import java.util.List; + import org.lttng.ust.agent.session.EventRule; /** @@ -53,9 +55,12 @@ public interface ILttngTcpClientListener { boolean eventDisabled(String eventName); /** - * List the all events currently enabled in the current tracing sessions. + * List the events that are available in the agent's tracing domain. + * + * In Java terms, this means loggers that have at least one LTTng log + * handler of their corresponding domain attached. * - * @return The list of enabled events + * @return The list of available events */ - Iterable listEnabledEvents(); + List listAvailableEvents(); } diff --git a/liblttng-ust-java-agent/java/lttng-ust-agent-common/org/lttng/ust/agent/client/SessiondListLoggersCommand.java b/liblttng-ust-java-agent/java/lttng-ust-agent-common/org/lttng/ust/agent/client/SessiondListLoggersCommand.java index c06eaaa..014d435 100644 --- a/liblttng-ust-java-agent/java/lttng-ust-agent-common/org/lttng/ust/agent/client/SessiondListLoggersCommand.java +++ b/liblttng-ust-java-agent/java/lttng-ust-agent-common/org/lttng/ust/agent/client/SessiondListLoggersCommand.java @@ -20,7 +20,6 @@ package org.lttng.ust.agent.client; import java.nio.ByteBuffer; import java.nio.ByteOrder; -import java.util.ArrayList; import java.util.List; /** @@ -34,11 +33,10 @@ class SessiondListLoggersCommand implements ISessiondCommand { @Override public LttngAgentResponse execute(ILttngTcpClientListener agent) { - final List loggerList = new ArrayList(); + final List loggerList = agent.listAvailableEvents(); int dataSize = 0; - for (String event : agent.listEnabledEvents()) { - loggerList.add(event); + for (String event : agent.listAvailableEvents()) { dataSize += event.length() + 1; } diff --git a/liblttng-ust-java-agent/java/lttng-ust-agent-jul/org/lttng/ust/agent/jul/LttngJulAgent.java b/liblttng-ust-java-agent/java/lttng-ust-agent-jul/org/lttng/ust/agent/jul/LttngJulAgent.java index fa92f64..5bf382b 100644 --- a/liblttng-ust-java-agent/java/lttng-ust-agent-jul/org/lttng/ust/agent/jul/LttngJulAgent.java +++ b/liblttng-ust-java-agent/java/lttng-ust-agent-jul/org/lttng/ust/agent/jul/LttngJulAgent.java @@ -17,6 +17,13 @@ package org.lttng.ust.agent.jul; +import java.util.ArrayList; +import java.util.Enumeration; +import java.util.List; +import java.util.logging.Handler; +import java.util.logging.LogManager; +import java.util.logging.Logger; + import org.lttng.ust.agent.AbstractLttngAgent; /** @@ -39,4 +46,40 @@ class LttngJulAgent extends AbstractLttngAgent { return instance; } + @Override + public List listAvailableEvents() { + List ret = new ArrayList(); + + Enumeration loggers = LogManager.getLogManager().getLoggerNames(); + while (loggers.hasMoreElements()) { + String name = loggers.nextElement(); + /* + * Skip the root logger. An empty string is not a valid event name + * in LTTng. + */ + if (name.equals("")) { + continue; + } + + /* + * Check if that logger has at least one LTTng JUL handler attached. + */ + Logger logger = Logger.getLogger(name); + if (hasLttngHandlerAttached(logger)) { + ret.add(name); + } + } + + return ret; + } + + private static boolean hasLttngHandlerAttached(Logger logger) { + for (Handler handler : logger.getHandlers()) { + if (handler instanceof LttngLogHandler) { + return true; + } + } + return false; + } + } diff --git a/liblttng-ust-java-agent/java/lttng-ust-agent-log4j/org/lttng/ust/agent/log4j/LttngLog4jAgent.java b/liblttng-ust-java-agent/java/lttng-ust-agent-log4j/org/lttng/ust/agent/log4j/LttngLog4jAgent.java index 5dd8468..da8528c 100644 --- a/liblttng-ust-java-agent/java/lttng-ust-agent-log4j/org/lttng/ust/agent/log4j/LttngLog4jAgent.java +++ b/liblttng-ust-java-agent/java/lttng-ust-agent-log4j/org/lttng/ust/agent/log4j/LttngLog4jAgent.java @@ -17,6 +17,13 @@ package org.lttng.ust.agent.log4j; +import java.util.ArrayList; +import java.util.Enumeration; +import java.util.List; + +import org.apache.log4j.Appender; +import org.apache.log4j.LogManager; +import org.apache.log4j.Logger; import org.lttng.ust.agent.AbstractLttngAgent; /** @@ -40,4 +47,37 @@ class LttngLog4jAgent extends AbstractLttngAgent { return instance; } + @Override + public List listAvailableEvents() { + List ret = new ArrayList(); + + @SuppressWarnings("unchecked") + Enumeration loggers = LogManager.getCurrentLoggers(); + while (loggers.hasMoreElements()) { + Logger logger = loggers.nextElement(); + + /* + * Check if that logger has at least one LTTng log4j appender + * attached. + */ + if (hasLttngAppenderAttached(logger)) { + ret.add(logger.getName()); + } + } + + return ret; + } + + private static boolean hasLttngAppenderAttached(Logger logger) { + @SuppressWarnings("unchecked") + Enumeration appenders = logger.getAllAppenders(); + while (appenders.hasMoreElements()) { + Appender appender = appenders.nextElement(); + + if (appender instanceof LttngLogAppender) { + return true; + } + } + return false; + } } -- 2.1.4