/**********************************************************************
- * Copyright (c) 2012 Ericsson
+ * Copyright (c) 2012, 2013 Ericsson
*
* All rights reserved. This program and the accompanying materials are
* made available under the terms of the Eclipse Public License v1.0 which
*
* Contributors:
* Bernd Hufmann - Initial API and implementation
+ * Bernd Hufmann - Updated for support of LTTng Tools 2.1
+ * Simon Delisle - Updated for support of LTTng Tools 2.2
**********************************************************************/
package org.eclipse.linuxtools.internal.lttng2.ui.views.control.service;
import org.eclipse.linuxtools.internal.lttng2.core.control.model.IChannelInfo;
import org.eclipse.linuxtools.internal.lttng2.core.control.model.IDomainInfo;
import org.eclipse.linuxtools.internal.lttng2.core.control.model.IEventInfo;
+import org.eclipse.linuxtools.internal.lttng2.core.control.model.IFieldInfo;
import org.eclipse.linuxtools.internal.lttng2.core.control.model.IProbeEventInfo;
import org.eclipse.linuxtools.internal.lttng2.core.control.model.ISessionInfo;
+import org.eclipse.linuxtools.internal.lttng2.core.control.model.ISnapshotInfo;
import org.eclipse.linuxtools.internal.lttng2.core.control.model.IUstProviderInfo;
import org.eclipse.linuxtools.internal.lttng2.core.control.model.LogLevelType;
import org.eclipse.linuxtools.internal.lttng2.core.control.model.TraceEventType;
import org.eclipse.linuxtools.internal.lttng2.core.control.model.TraceLogLevel;
import org.eclipse.linuxtools.internal.lttng2.core.control.model.impl.BaseEventInfo;
+import org.eclipse.linuxtools.internal.lttng2.core.control.model.impl.BufferType;
import org.eclipse.linuxtools.internal.lttng2.core.control.model.impl.ChannelInfo;
import org.eclipse.linuxtools.internal.lttng2.core.control.model.impl.DomainInfo;
import org.eclipse.linuxtools.internal.lttng2.core.control.model.impl.EventInfo;
+import org.eclipse.linuxtools.internal.lttng2.core.control.model.impl.FieldInfo;
import org.eclipse.linuxtools.internal.lttng2.core.control.model.impl.ProbeEventInfo;
import org.eclipse.linuxtools.internal.lttng2.core.control.model.impl.SessionInfo;
+import org.eclipse.linuxtools.internal.lttng2.core.control.model.impl.SnapshotInfo;
import org.eclipse.linuxtools.internal.lttng2.core.control.model.impl.UstProviderInfo;
import org.eclipse.linuxtools.internal.lttng2.ui.views.control.logging.ControlCommandLogger;
import org.eclipse.linuxtools.internal.lttng2.ui.views.control.messages.Messages;
*/
public class LTTngControlService implements ILttngControlService {
-
// ------------------------------------------------------------------------
// Attributes
// ------------------------------------------------------------------------
/**
* The command shell implementation
*/
- protected ICommandShell fCommandShell = null;
+ private final ICommandShell fCommandShell;
/**
* The version string.
*/
- protected String fVersion = "Unknown"; //$NON-NLS-1$
+ private LttngVersion fVersion = null;
// ------------------------------------------------------------------------
// Constructors
// ------------------------------------------------------------------------
// Accessors
// ------------------------------------------------------------------------
- /*
- * (non-Javadoc)
- * @see org.eclipse.linuxtools.internal.lttng2.ui.views.control.service.ILttngControlService#getVersion()
- */
+
@Override
public String getVersion() {
- return fVersion;
+ if (fVersion == null) {
+ return "Unknown"; //$NON-NLS-1$
+ }
+ return fVersion.toString();
}
/**
* @param version - a version to set
*/
public void setVersion(String version) {
- fVersion = version;
+ fVersion = new LttngVersion(version);
+ }
+
+ @Override
+ public boolean isVersionSupported(String version) {
+ LttngVersion tmp = new LttngVersion(version);
+ return (fVersion != null && fVersion.compareTo(tmp) >= 0) ? true : false;
+ }
+
+ /**
+ * Returns the command shell implementation.
+ *
+ * @return the command shell implementation
+ */
+ protected ICommandShell getCommandShell() {
+ return fCommandShell;
}
+
// ------------------------------------------------------------------------
// Operations
// ------------------------------------------------------------------------
- /*
- * (non-Javadoc)
- *
- * @see
- * org.eclipse.linuxtools.internal.lttng2.ui.views.control.service.ILttngControlService
- * #getSessionNames(org.eclipse.core.runtime.IProgressMonitor)
- */
@Override
public String[] getSessionNames(IProgressMonitor monitor) throws ExecutionException {
StringBuffer command = createCommand(LTTngControlServiceConstants.COMMAND_LIST);
// Output:
// Available tracing sessions:
- // 1) mysession1 (/home/user/lttng-traces/mysession1-20120123-083928)
- // [inactive]
- // 2) mysession (/home/user/lttng-traces/mysession-20120123-083318)
- // [inactive]
+ // 1) mysession1 (/home/user/lttng-traces/mysession1-20120123-083928) [inactive]
+ // 2) mysession (/home/user/lttng-traces/mysession-20120123-083318) [inactive]
//
// Use lttng list <session_name> for more details
return retArray.toArray(new String[retArray.size()]);
}
- /*
- * (non-Javadoc)
- *
- * @see
- * org.eclipse.linuxtools.internal.lttng2.ui.views.control.service.ILttngControlService
- * #getSession(java.lang.String, org.eclipse.core.runtime.IProgressMonitor)
- */
@Override
public ISessionInfo getSession(String sessionName, IProgressMonitor monitor) throws ExecutionException {
StringBuffer command = createCommand(LTTngControlServiceConstants.COMMAND_LIST, sessionName);
continue;
}
- matcher = LTTngControlServiceConstants.TRACE_SESSION_PATH_PATTERN.matcher(line);
+ matcher = LTTngControlServiceConstants.TRACE_SNAPSHOT_SESSION_PATTERN.matcher(line);
if (matcher.matches()) {
- sessionInfo.setSessionPath(matcher.group(1).trim());
+ sessionInfo.setSessionState(matcher.group(2));
+ // real name will be set later
+ ISnapshotInfo snapshotInfo = new SnapshotInfo(""); //$NON-NLS-1$
+ sessionInfo.setSnapshotInfo(snapshotInfo);
index++;
continue;
}
+ if (!sessionInfo.isSnapshotSession()) {
+ matcher = LTTngControlServiceConstants.TRACE_NETWORK_PATH_PATTERN.matcher(line);
+ if (matcher.matches()) {
+ sessionInfo.setStreamedTrace(true);
+ }
+
+ matcher = LTTngControlServiceConstants.TRACE_SESSION_PATH_PATTERN.matcher(line);
+ if (matcher.matches()) {
+ sessionInfo.setSessionPath(matcher.group(1).trim());
+ index++;
+ continue;
+ }
+ }
+
matcher = LTTngControlServiceConstants.DOMAIN_KERNEL_PATTERN.matcher(line);
if (matcher.matches()) {
// Create Domain
IDomainInfo domainInfo = new DomainInfo(Messages.TraceControl_KernelDomainDisplayName);
- sessionInfo.addDomain(domainInfo);
+
+ // set kernel flag
+ domainInfo.setIsKernel(true);
// in domain kernel
ArrayList<IChannelInfo> channels = new ArrayList<IChannelInfo>();
- index = parseDomain(result.getOutput(), index, channels);
+ index = parseDomain(result.getOutput(), index, channels, domainInfo);
- // set channels
- domainInfo.setChannels(channels);
+ if (channels.size() > 0) {
+ // add domain
+ sessionInfo.addDomain(domainInfo);
- // set kernel flag
- domainInfo.setIsKernel(true);
+ // set channels
+ domainInfo.setChannels(channels);
+ }
continue;
}
matcher = LTTngControlServiceConstants.DOMAIN_UST_GLOBAL_PATTERN.matcher(line);
if (matcher.matches()) {
IDomainInfo domainInfo = new DomainInfo(Messages.TraceControl_UstGlobalDomainDisplayName);
- sessionInfo.addDomain(domainInfo);
+
+ // set kernel flag
+ domainInfo.setIsKernel(false);
// in domain UST
ArrayList<IChannelInfo> channels = new ArrayList<IChannelInfo>();
- index = parseDomain(result.getOutput(), index, channels);
+ index = parseDomain(result.getOutput(), index, channels, domainInfo);
- // set channels
- domainInfo.setChannels(channels);
+ if (channels.size() > 0) {
+ // add domain
+ sessionInfo.addDomain(domainInfo);
- // set kernel flag
- domainInfo.setIsKernel(false);
+ // set channels
+ domainInfo.setChannels(channels);
+ }
continue;
}
index++;
}
+
+ if (sessionInfo.isSnapshotSession()) {
+ ISnapshotInfo snapshot = getSnapshotInfo(sessionName, monitor);
+ sessionInfo.setSnapshotInfo(snapshot);
+ }
+
return sessionInfo;
}
- /*
- * (non-Javadoc)
- *
- * @see
- * org.eclipse.linuxtools.internal.lttng2.ui.views.control.service.ILttngControlService
- * #getKernelProvider(org.eclipse.core.runtime.IProgressMonitor)
- */
+ @Override
+ public ISnapshotInfo getSnapshotInfo(String sessionName, IProgressMonitor monitor) throws ExecutionException {
+ StringBuffer command = createCommand(LTTngControlServiceConstants.COMMAND_LIST_SNAPSHOT_OUTPUT, LTTngControlServiceConstants.OPTION_SESSION, sessionName);
+ ICommandResult result = executeCommand(command.toString(), monitor);
+
+ int index = 0;
+
+ // Output:
+ // [1] snapshot-1: /home/user/lttng-traces/my-20130909-114431
+ // or
+ // [3] snapshot-3: net4://172.0.0.1/
+ ISnapshotInfo snapshotInfo = new SnapshotInfo(""); //$NON-NLS-1$
+
+ while (index < result.getOutput().length) {
+ String line = result.getOutput()[index];
+ Matcher matcher = LTTngControlServiceConstants.LIST_SNAPSHOT_OUTPUT_PATTERN.matcher(line);
+ if (matcher.matches()) {
+ snapshotInfo.setId(Integer.valueOf(matcher.group(1)));
+ snapshotInfo.setName(matcher.group(2));
+ snapshotInfo.setSnapshotPath(matcher.group(3));
+
+ Matcher matcher2 = LTTngControlServiceConstants.SNAPSHOT_NETWORK_PATH_PATTERN.matcher(snapshotInfo.getSnapshotPath());
+ if (matcher2.matches()) {
+ snapshotInfo.setStreamedSnapshot(true);
+ }
+
+ index++;
+ break;
+ }
+ index++;
+ }
+
+ return snapshotInfo;
+ }
+
@Override
public List<IBaseEventInfo> getKernelProvider(IProgressMonitor monitor) throws ExecutionException {
StringBuffer command = createCommand(LTTngControlServiceConstants.COMMAND_LIST_KERNEL);
// or:
// Error: Unable to list kernel events
//
-
- if ((result.getOutput().length > 0) && (LTTngControlServiceConstants.LIST_KERNEL_NO_KERNEL_PROVIDER_PATTERN.matcher(result.getOutput()[0]).matches()) ||
- ((result.getOutput().length > 1) && (LTTngControlServiceConstants.LIST_KERNEL_NO_KERNEL_PROVIDER_PATTERN.matcher(result.getOutput()[1]).matches()))) {
- return events;
+ int index = 0;
+ while (index < result.getOutput().length) {
+ String line = result.getOutput()[index];
+ Matcher matcher = LTTngControlServiceConstants.LIST_KERNEL_NO_KERNEL_PROVIDER_PATTERN.matcher(line);
+ if (matcher.matches()) {
+ return events;
+ }
+ index++;
}
}
return events;
}
- /*
- * (non-Javadoc)
- *
- * @see
- * org.eclipse.linuxtools.internal.lttng2.ui.views.control.service.ILttngControlService
- * #getUstProvider()
- */
@Override
public List<IUstProviderInfo> getUstProvider() throws ExecutionException {
return getUstProvider(new NullProgressMonitor());
}
- /*
- * (non-Javadoc)
- *
- * @see
- * org.eclipse.linuxtools.internal.lttng2.ui.views.control.service.ILttngControlService
- * #getUstProvider(org.eclipse.core.runtime.IProgressMonitor)
- */
@Override
public List<IUstProviderInfo> getUstProvider(IProgressMonitor monitor) throws ExecutionException {
StringBuffer command = createCommand(LTTngControlServiceConstants.COMMAND_LIST_UST);
- ICommandResult result = executeCommand(command.toString(), monitor);
+ if (isVersionSupported("2.1.0")) { //$NON-NLS-1$
+ command.append(LTTngControlServiceConstants.OPTION_FIELDS);
+ }
+
+ ICommandResult result = executeCommand(command.toString(), monitor, false);
+ List<IUstProviderInfo> allProviders = new ArrayList<IUstProviderInfo>();
+ // Workaround for versions 2.0.x which causes a segmentation fault for this command
+ // if LTTng Tools is compiled without UST support.
+ if (!isVersionSupported("2.1.0") && (result.getResult() != 0)) { //$NON-NLS-1$
+ return allProviders;
+ }
+
+ if (result.getOutput() != null) {
+ // Ignore the following 2 cases:
+ // Spawning a session daemon
+ // Error: Unable to list UST events: Listing UST events failed
+ // or:
+ // Error: Unable to list UST events: Listing UST events failed
+ //
+ int index = 0;
+ while (index < result.getOutput().length) {
+ String line = result.getOutput()[index];
+ Matcher matcher = LTTngControlServiceConstants.LIST_UST_NO_UST_PROVIDER_PATTERN.matcher(line);
+ if (matcher.matches()) {
+ return allProviders;
+ }
+ index++;
+ }
+ }
+
+ if (isError(result)) {
+ throw new ExecutionException(Messages.TraceControl_CommandError + " " + command.toString() + "\n" + formatOutput(result)); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ // Note that field print-outs exists for version >= 2.1.0
+ //
// UST events:
// -------------
//
// ust_tests_hello:tptest_sighandler (loglevel: TRACE_EMERG0) (type:
// tracepoint)
// ust_tests_hello:tptest (loglevel: TRACE_EMERG0) (type: tracepoint)
+ // field: doublefield (float)
+ // field: floatfield (float)
+ // field: stringfield (string)
//
// PID: 6459 - Name:
// /home/user/git/lttng-ust/tests/hello.cxx/.libs/lt-hello
// ust_tests_hello:tptest_sighandler (loglevel: TRACE_EMERG0) (type:
// tracepoint)
// ust_tests_hello:tptest (loglevel: TRACE_EMERG0) (type: tracepoint)
+ // field: doublefield (float)
+ // field: floatfield (float)
+ // field: stringfield (string)
- List<IUstProviderInfo> allProviders = new ArrayList<IUstProviderInfo>();
IUstProviderInfo provider = null;
int index = 0;
String line = result.getOutput()[index];
Matcher matcher = LTTngControlServiceConstants.UST_PROVIDER_PATTERN.matcher(line);
if (matcher.matches()) {
-
provider = new UstProviderInfo(matcher.group(2).trim());
provider.setPid(Integer.valueOf(matcher.group(1).trim()));
List<IBaseEventInfo> events = new ArrayList<IBaseEventInfo>();
index = getProviderEventInfo(result.getOutput(), ++index, events);
provider.setEvents(events);
allProviders.add(provider);
-
} else {
index++;
}
-
}
return allProviders;
}
- /*
- * (non-Javadoc)
- * @see org.eclipse.linuxtools.internal.lttng2.ui.views.control.service.ILttngControlService#createSession(java.lang.String, java.lang.String, org.eclipse.core.runtime.IProgressMonitor)
- */
@Override
- public ISessionInfo createSession(String sessionName, String sessionPath, IProgressMonitor monitor) throws ExecutionException {
+ public ISessionInfo createSession(String sessionName, String sessionPath, boolean isSnapshot, IProgressMonitor monitor) throws ExecutionException {
String newName = formatParameter(sessionName);
String newPath = formatParameter(sessionPath);
command.append(newPath);
}
+ if (isSnapshot) {
+ command.append(LTTngControlServiceConstants.OPTION_SNAPSHOT);
+ }
+
ICommandResult result = executeCommand(command.toString(), monitor);
//Session myssession2 created.
//Traces will be written in /home/user/lttng-traces/myssession2-20120209-095418
String[] output = result.getOutput();
- // Get and verify session name
- Matcher matcher = LTTngControlServiceConstants.CREATE_SESSION_NAME_PATTERN.matcher(output[0]);
+ // Get and session name and path
String name = null;
+ String path = null;
- if (matcher.matches()) {
- name = String.valueOf(matcher.group(1).trim());
- } else {
- // Output format not expected
- throw new ExecutionException(Messages.TraceControl_CommandError + " " + command + "\n" + //$NON-NLS-1$ //$NON-NLS-2$
- Messages.TraceControl_UnexpectedCommandOutputFormat + ":\n" + //$NON-NLS-1$
- formatOutput(result));
+ int index = 0;
+ while (index < output.length) {
+ String line = output[index];
+ Matcher nameMatcher = LTTngControlServiceConstants.CREATE_SESSION_NAME_PATTERN.matcher(line);
+ Matcher pathMatcher = LTTngControlServiceConstants.CREATE_SESSION_PATH_PATTERN.matcher(line);
+ if (nameMatcher.matches()) {
+ name = String.valueOf(nameMatcher.group(1).trim());
+ } else if (pathMatcher.matches()) {
+ path = String.valueOf(pathMatcher.group(1).trim());
+ }
+ index++;
}
- if ((name == null) || (!name.equals(sessionName))) {
+ // Verify session name
+ if ((name == null) || (!"".equals(sessionName) && !name.equals(sessionName))) { //$NON-NLS-1$
// Unexpected name returned
throw new ExecutionException(Messages.TraceControl_CommandError + " " + command + "\n" + //$NON-NLS-1$ //$NON-NLS-2$
Messages.TraceControl_UnexpectedNameError + ": " + name); //$NON-NLS-1$
}
- // Get and verify session path
- matcher = LTTngControlServiceConstants.CREATE_SESSION_PATH_PATTERN.matcher(output[1]);
- String path = null;
+ SessionInfo sessionInfo = new SessionInfo(name);
- if (matcher.matches()) {
- path = String.valueOf(matcher.group(1).trim());
- } else {
- // Output format not expected
+ // Verify session path
+ if (!isSnapshot &&
+ ((path == null) || ((sessionPath != null) && (!path.contains(sessionPath))))) {
+ // Unexpected path
throw new ExecutionException(Messages.TraceControl_CommandError + " " + command + "\n" + //$NON-NLS-1$ //$NON-NLS-2$
- Messages.TraceControl_UnexpectedCommandOutputFormat + ":\n" + //$NON-NLS-1$
- formatOutput(result));
+ Messages.TraceControl_UnexpectedPathError + ": " + name); //$NON-NLS-1$
}
- if ((path == null) || ((sessionPath != null) && (!path.contains(sessionPath)))) {
- // Unexpected path
+ if (isSnapshot) {
+ // Make it a snapshot session - content of snapshot info need to
+ // set afterwards using getSession() or getSnapshotInfo()
+ sessionInfo.setSnapshotInfo(new SnapshotInfo("")); //$NON-NLS-1$
+ } else {
+ sessionInfo.setSessionPath(path);
+ }
+
+ return sessionInfo;
+
+ }
+
+ @Override
+ public ISessionInfo createSession(String sessionName, String networkUrl, String controlUrl, String dataUrl, boolean isSnapshot, IProgressMonitor monitor) throws ExecutionException {
+
+ String newName = formatParameter(sessionName);
+ StringBuffer command = createCommand(LTTngControlServiceConstants.COMMAND_CREATE_SESSION, newName);
+
+ if (isSnapshot) {
+ command.append(LTTngControlServiceConstants.OPTION_SNAPSHOT);
+ }
+
+ if (networkUrl != null) {
+ command.append(LTTngControlServiceConstants.OPTION_NETWORK_URL);
+ command.append(networkUrl);
+ } else {
+ command.append(LTTngControlServiceConstants.OPTION_CONTROL_URL);
+ command.append(controlUrl);
+
+ command.append(LTTngControlServiceConstants.OPTION_DATA_URL);
+ command.append(dataUrl);
+ }
+
+ ICommandResult result = executeCommand(command.toString(), monitor);
+
+ // Verify output
+ String[] output = result.getOutput();
+
+ // Get and session name and path
+ String name = null;
+ String path = null;
+
+ int index = 0;
+ while (index < output.length) {
+ String line = output[index];
+ Matcher nameMatcher = LTTngControlServiceConstants.CREATE_SESSION_NAME_PATTERN.matcher(line);
+ Matcher pathMatcher = LTTngControlServiceConstants.CREATE_SESSION_PATH_PATTERN.matcher(line);
+
+ if (nameMatcher.matches()) {
+ name = String.valueOf(nameMatcher.group(1).trim());
+ } else if (pathMatcher.matches() && (networkUrl != null)) {
+ path = String.valueOf(pathMatcher.group(1).trim());
+ }
+ index++;
+ }
+
+ // Verify session name
+ if ((name == null) || (!"".equals(sessionName) && !name.equals(sessionName))) { //$NON-NLS-1$
+ // Unexpected name returned
throw new ExecutionException(Messages.TraceControl_CommandError + " " + command + "\n" + //$NON-NLS-1$ //$NON-NLS-2$
- Messages.TraceControl_UnexpectedPathError + ": " + name); //$NON-NLS-1$
+ Messages.TraceControl_UnexpectedNameError + ": " + name); //$NON-NLS-1$
}
SessionInfo sessionInfo = new SessionInfo(name);
- sessionInfo.setSessionPath(path);
+
+ sessionInfo.setStreamedTrace(true);
+
+ // Verify session path
+ if (networkUrl != null) {
+ if (!isSnapshot && (path == null)) {
+ // Unexpected path
+ throw new ExecutionException(Messages.TraceControl_CommandError + " " + command + "\n" + //$NON-NLS-1$ //$NON-NLS-2$
+ Messages.TraceControl_UnexpectedPathError + ": " + name); //$NON-NLS-1$
+ }
+
+ if (isSnapshot) {
+ sessionInfo.setStreamedTrace(false);
+ } else {
+ sessionInfo.setSessionPath(path);
+ // Check file protocol
+ Matcher matcher = LTTngControlServiceConstants.TRACE_FILE_PROTOCOL_PATTERN.matcher(path);
+ if (matcher.matches()) {
+ sessionInfo.setStreamedTrace(false);
+ }
+ }
+ }
+
+ // When using controlUrl and dataUrl the full session path is not known yet
+ // and will be set later on when listing the session
return sessionInfo;
}
ICommandResult result = executeCommand(command.toString(), monitor, false);
String[] output = result.getOutput();
- if (isError(result) && ((output == null) || (!LTTngControlServiceConstants.SESSION_NOT_FOUND_ERROR_PATTERN.matcher(output[0]).matches()))) {
- throw new ExecutionException(Messages.TraceControl_CommandError + " " + command.toString() + "\n" + formatOutput(result)); //$NON-NLS-1$ //$NON-NLS-2$
- }
+ boolean isError = isError(result);
+ if (isError && (output != null)) {
+ int index = 0;
+ while (index < output.length) {
+ String line = output[index];
+ Matcher matcher = LTTngControlServiceConstants.SESSION_NOT_FOUND_ERROR_PATTERN.matcher(line);
+ if (matcher.matches()) {
+ // Don't treat this as an error
+ isError = false;
+ }
+ index++;
+ }
+ }
+
+ if (isError) {
+ throw new ExecutionException(Messages.TraceControl_CommandError + " " + command.toString() + "\n" + formatOutput(result)); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
//Session <sessionName> destroyed
}
- /*
- * (non-Javadoc)
- * @see org.eclipse.linuxtools.internal.lttng2.ui.views.control.service.ILttngControlService#startSession(java.lang.String, org.eclipse.core.runtime.IProgressMonitor)
- */
@Override
public void startSession(String sessionName, IProgressMonitor monitor) throws ExecutionException {
//Session <sessionName> started
}
- /*
- * (non-Javadoc)
- * @see org.eclipse.linuxtools.internal.lttng2.ui.views.control.service.ILttngControlService#stopSession(java.lang.String, org.eclipse.core.runtime.IProgressMonitor)
- */
@Override
public void stopSession(String sessionName, IProgressMonitor monitor) throws ExecutionException {
String newSessionName = formatParameter(sessionName);
}
- /*
- * (non-Javadoc)
- * @see org.eclipse.linuxtools.internal.lttng2.ui.views.control.service.ILttngControlService#enableChannel(java.lang.String, java.util.List, boolean, org.eclipse.linuxtools.internal.lttng2.ui.views.control.model.IChannelInfo, org.eclipse.core.runtime.IProgressMonitor)
- */
@Override
public void enableChannels(String sessionName, List<String> channelNames, boolean isKernel, IChannelInfo info, IProgressMonitor monitor) throws ExecutionException {
}
// --subbuf-size SIZE Subbuffer size in bytes
// (default: 4096, kernel default: 262144)
- command.append(LTTngControlServiceConstants.OPTION_SUB_BUFFER_SIZE);
- command.append(String.valueOf(info.getSubBufferSize()));
+ if (info.getSubBufferSize() != LTTngControlServiceConstants.UNUSED_VALUE) {
+ command.append(LTTngControlServiceConstants.OPTION_SUB_BUFFER_SIZE);
+ command.append(String.valueOf(info.getSubBufferSize()));
+ }
// --num-subbuf NUM Number of subbufers
-// (default: 8, kernel default: 4)
- command.append(LTTngControlServiceConstants.OPTION_NUM_SUB_BUFFERS);
- command.append(String.valueOf(info.getNumberOfSubBuffers()));
+ if (info.getNumberOfSubBuffers() != LTTngControlServiceConstants.UNUSED_VALUE) {
+ command.append(LTTngControlServiceConstants.OPTION_NUM_SUB_BUFFERS);
+ command.append(String.valueOf(info.getNumberOfSubBuffers()));
+ }
-// --switch-timer USEC Switch timer interval in usec (default: 0)
- command.append(LTTngControlServiceConstants.OPTION_SWITCH_TIMER);
- command.append(String.valueOf(info.getSwitchTimer()));
+// --switch-timer USEC Switch timer interval in usec
+ if (info.getSwitchTimer() != LTTngControlServiceConstants.UNUSED_VALUE) {
+ command.append(LTTngControlServiceConstants.OPTION_SWITCH_TIMER);
+ command.append(String.valueOf(info.getSwitchTimer()));
+ }
-// --read-timer USEC Read timer interval in usec (default: 200)
- command.append(LTTngControlServiceConstants.OPTION_READ_TIMER);
- command.append(String.valueOf(info.getReadTimer()));
+// --read-timer USEC Read timer interval in usec
+ if (info.getReadTimer() != LTTngControlServiceConstants.UNUSED_VALUE) {
+ command.append(LTTngControlServiceConstants.OPTION_READ_TIMER);
+ command.append(String.valueOf(info.getReadTimer()));
+ }
+
+ if (isVersionSupported("2.2.0")) { //$NON-NLS-1$
+// --buffers-uid Every application sharing the same UID use the same buffers
+// --buffers-pid Buffers are allocated per PID
+ if (!isKernel) {
+ if (info.getBufferType() == BufferType.BUFFER_PER_PID) {
+ command.append(LTTngControlServiceConstants.OPTION_PER_PID_BUFFERS);
+
+ } else if (info.getBufferType() == BufferType.BUFFER_PER_UID) {
+ command.append(LTTngControlServiceConstants.OPTION_PER_UID_BUFFERS);
+ }
+ }
+
+// -C SIZE Maximum size of trace files in bytes
+ if (info.getMaxSizeTraceFiles() != LTTngControlServiceConstants.UNUSED_VALUE) {
+ command.append(LTTngControlServiceConstants.OPTION_MAX_SIZE_TRACE_FILES);
+ command.append(String.valueOf(info.getMaxSizeTraceFiles()));
+ }
+
+// -W NUM Maximum number of trace files
+ if (info.getMaxNumberTraceFiles() != LTTngControlServiceConstants.UNUSED_VALUE) {
+ command.append(LTTngControlServiceConstants.OPTION_MAX_TRACE_FILES);
+ command.append(String.valueOf(info.getMaxNumberTraceFiles()));
+ }
+ }
}
executeCommand(command.toString(), monitor);
}
- /*
- * (non-Javadoc)
- * @see org.eclipse.linuxtools.internal.lttng2.ui.views.control.service.ILttngControlService#disableChannel(java.lang.String, java.util.List, org.eclipse.core.runtime.IProgressMonitor)
- */
@Override
public void disableChannels(String sessionName, List<String> channelNames, boolean isKernel, IProgressMonitor monitor) throws ExecutionException {
executeCommand(command.toString(), monitor);
}
- /*
- * (non-Javadoc)
- * @see org.eclipse.linuxtools.internal.lttng2.ui.views.control.service.ILttngControlService#enableEvent(java.lang.String, java.lang.String, java.util.List, boolean, org.eclipse.core.runtime.IProgressMonitor)
- */
@Override
- public void enableEvents(String sessionName, String channelName, List<String> eventNames, boolean isKernel, IProgressMonitor monitor) throws ExecutionException {
+ public void enableEvents(String sessionName, String channelName, List<String> eventNames, boolean isKernel, String filterExpression, IProgressMonitor monitor) throws ExecutionException {
StringBuffer command = createCommand(LTTngControlServiceConstants.COMMAND_ENABLE_EVENT);
command.append(LTTngControlServiceConstants.OPTION_TRACEPOINT);
+ if (filterExpression != null) {
+ command.append(LTTngControlServiceConstants.OPTION_FILTER);
+ command.append('\'');
+ command.append(filterExpression);
+ command.append('\'');
+ }
+
executeCommand(command.toString(), monitor);
}
- /*
- * (non-Javadoc)
- * @see org.eclipse.linuxtools.internal.lttng2.ui.views.control.service.ILttngControlService#enableSyscalls(java.lang.String, java.lang.String, org.eclipse.core.runtime.IProgressMonitor)
- */
@Override
public void enableSyscalls(String sessionName, String channelName, IProgressMonitor monitor) throws ExecutionException {
executeCommand(command.toString(), monitor);
}
- /*
- * (non-Javadoc)
- * @see org.eclipse.linuxtools.internal.lttng2.ui.views.control.service.ILttngControlService#enableProbe(java.lang.String, java.lang.String, java.lang.String, java.lang.String, org.eclipse.core.runtime.IProgressMonitor)
- */
@Override
public void enableProbe(String sessionName, String channelName, String eventName, boolean isFunction, String probe, IProgressMonitor monitor) throws ExecutionException {
StringBuffer command = createCommand(LTTngControlServiceConstants.COMMAND_ENABLE_EVENT);
executeCommand(command.toString(), monitor);
}
- /*
- * (non-Javadoc)
- * @see org.eclipse.linuxtools.internal.lttng2.ui.views.control.service.ILttngControlService#enableLogLevel(java.lang.String, java.lang.String, java.lang.String, org.eclipse.linuxtools.internal.lttng2.ui.views.control.model.LogLevelType, org.eclipse.linuxtools.internal.lttng2.ui.views.control.model.TraceLogLevel, org.eclipse.core.runtime.IProgressMonitor)
- */
@Override
- public void enableLogLevel(String sessionName, String channelName, String eventName, LogLevelType logLevelType, TraceLogLevel level, IProgressMonitor monitor) throws ExecutionException {
+ public void enableLogLevel(String sessionName, String channelName, String eventName, LogLevelType logLevelType, TraceLogLevel level, String filterExpression, IProgressMonitor monitor) throws ExecutionException {
StringBuffer command = createCommand(LTTngControlServiceConstants.COMMAND_ENABLE_EVENT);
command.append(eventName);
command.append(level.getInName());
executeCommand(command.toString(), monitor);
-
}
- /*
- * (non-Javadoc)
- * @see org.eclipse.linuxtools.internal.lttng2.ui.views.control.service.ILttngControlService#disableEvent(java.lang.String, java.lang.String, java.util.List, boolean, org.eclipse.core.runtime.IProgressMonitor)
- */
@Override
public void disableEvent(String sessionName, String channelName, List<String> eventNames, boolean isKernel, IProgressMonitor monitor) throws ExecutionException {
StringBuffer command = createCommand(LTTngControlServiceConstants.COMMAND_DISABLE_EVENT);
executeCommand(command.toString(), monitor);
}
- /*
- * (non-Javadoc)
- * @see org.eclipse.linuxtools.internal.lttng2.ui.views.control.service.ILttngControlService#getContexts(org.eclipse.core.runtime.IProgressMonitor)
- */
@Override
public List<String> getContextList(IProgressMonitor monitor) throws ExecutionException {
return contexts;
}
- /*
- * (non-Javadoc)
- * @see org.eclipse.linuxtools.internal.lttng2.ui.views.control.service.ILttngControlService#addContexts(java.lang.String, java.lang.String, java.lang.String, boolean, java.util.List, org.eclipse.core.runtime.IProgressMonitor)
- */
@Override
public void addContexts(String sessionName, String channelName, String eventName, boolean isKernel, List<String> contextNames, IProgressMonitor monitor) throws ExecutionException {
StringBuffer command = createCommand(LTTngControlServiceConstants.COMMAND_ADD_CONTEXT);
}
- /*
- * (non-Javadoc)
- * @see org.eclipse.linuxtools.internal.lttng2.ui.views.control.service.ILttngControlService#calibrate(boolean, org.eclipse.core.runtime.IProgressMonitor)
- */
@Override
public void calibrate(boolean isKernel, IProgressMonitor monitor) throws ExecutionException {
-// String newSessionName = formatParameter(sessionName);
StringBuffer command = createCommand(LTTngControlServiceConstants.COMMAND_CALIBRATE);
-//
-// command.append(OPTION_SESSION);
-// command.append(newSessionName);
if (isKernel) {
command.append(LTTngControlServiceConstants.OPTION_KERNEL);
executeCommand(command.toString(), monitor);
}
+ @Override
+ public void recordSnapshot(String sessionName, IProgressMonitor monitor)
+ throws ExecutionException {
+ StringBuffer command = createCommand(LTTngControlServiceConstants.COMMAND_RECORD_SNAPSHOT);
+
+ String newSessionName = formatParameter(sessionName);
+ command.append(LTTngControlServiceConstants.OPTION_SESSION);
+ command.append(newSessionName);
+
+ executeCommand(command.toString(), monitor);
+ }
+
// ------------------------------------------------------------------------
// Helper methods
// ------------------------------------------------------------------------
+
/**
* Checks if command result is an error result.
*
* @return true if error else false
*/
protected boolean isError(ICommandResult result) {
- if ((result.getResult()) != 0 || (result.getOutput().length < 1 || LTTngControlServiceConstants.ERROR_PATTERN.matcher(result.getOutput()[0]).matches())) {
+ // Check return code and length of returned strings
+ if ((result.getResult()) != 0 || (result.getOutput().length < 1)) {
return true;
}
+
+ // Look for error pattern
+ int index = 0;
+ while (index < result.getOutput().length) {
+ String line = result.getOutput()[index];
+ Matcher matcher = LTTngControlServiceConstants.ERROR_PATTERN.matcher(line);
+ if (matcher.matches()) {
+ return true;
+ }
+ index++;
+ }
+
return false;
}
ret.append(result.getResult());
ret.append("\n"); //$NON-NLS-1$
for (int i = 0; i < output.length; i++) {
- ret.append(output[i] + "\n"); //$NON-NLS-1$
+ ret.append(output[i]).append("\n"); //$NON-NLS-1$
}
return ret.toString();
}
* - current index in command output array
* @param channels
* - list for returning channel information
+ * @param domainInfo
+ * - The domain information
* @return the new current index in command output array
*/
- protected int parseDomain(String[] output, int currentIndex, List<IChannelInfo> channels) {
+ protected int parseDomain(String[] output, int currentIndex, List<IChannelInfo> channels, IDomainInfo domainInfo) {
int index = currentIndex;
+ // if kernel set the buffer type to shared
+ if (domainInfo.isKernel()) {
+ domainInfo.setBufferType(BufferType.BUFFER_SHARED);
+ }
+
// Channels:
// -------------
// - channnel1: [enabled]
while (index < output.length) {
String line = output[index];
+ if (isVersionSupported("2.2.0")) { //$NON-NLS-1$
+ Matcher bufferTypeMatcher = LTTngControlServiceConstants.BUFFER_TYPE_PATTERN.matcher(line);
+ if (bufferTypeMatcher.matches()) {
+ String bufferTypeString = getAttributeValue(line);
+ if (BufferType.BUFFER_PER_PID.getInName().equals(bufferTypeString)) {
+ domainInfo.setBufferType(BufferType.BUFFER_PER_PID);
+ } else if (BufferType.BUFFER_PER_UID.getInName().equals(bufferTypeString)) {
+ domainInfo.setBufferType(BufferType.BUFFER_PER_UID);
+ } else {
+ domainInfo.setBufferType(BufferType.BUFFER_TYPE_UNKNOWN);
+ }
+ }
+ } else {
+ domainInfo.setBufferType(BufferType.BUFFER_TYPE_UNKNOWN);
+ }
Matcher outerMatcher = LTTngControlServiceConstants.CHANNELS_SECTION_PATTERN.matcher(line);
+ Matcher noKernelChannelMatcher = LTTngControlServiceConstants.DOMAIN_NO_KERNEL_CHANNEL_PATTERN.matcher(line);
+ Matcher noUstChannelMatcher = LTTngControlServiceConstants.DOMAIN_NO_UST_CHANNEL_PATTERN.matcher(line);
if (outerMatcher.matches()) {
IChannelInfo channelInfo = null;
while (index < output.length) {
// get channel enablement
channelInfo.setState(innerMatcher.group(2));
+ // set BufferType
+ channelInfo.setBufferType(domainInfo.getBufferType());
+
// add channel
channels.add(channelInfo);
}
index++;
}
+ } else if (noKernelChannelMatcher.matches() || noUstChannelMatcher.matches()) {
+ // domain indicates that no channels were found -> return
+ index++;
+ return index;
}
index++;
}
eventInfo.setLogLevel(matcher.group(2).trim());
eventInfo.setEventType(matcher.group(3).trim());
eventInfo.setState(matcher.group(4));
+ String filter = matcher.group(5);
+ if (filter != null) {
+ filter = filter.substring(1, filter.length() - 1); // remove '[' and ']'
+ eventInfo.setFilterExpression(filter);
+ }
events.add(eventInfo);
index++;
} else if (matcher2.matches()) {
eventInfo.setLogLevel(TraceLogLevel.LEVEL_UNKNOWN);
eventInfo.setEventType(matcher2.group(2).trim());
eventInfo.setState(matcher2.group(3));
+ String filter = matcher2.group(4);
+ if (filter != null) {
+ filter = filter.substring(1, filter.length() - 1); // remove '[' and ']'
+ eventInfo.setFilterExpression(filter);
+ }
if (eventInfo.getEventType() == TraceEventType.PROBE) {
IProbeEventInfo probeEvent = new ProbeEventInfo(eventInfo.getName());
} else {
index++;
}
-// else if (line.matches(EVENT_NONE_PATTERN)) {
- // do nothing
-// } else
-
}
return index;
*/
protected int getProviderEventInfo(String[] output, int currentIndex, List<IBaseEventInfo> events) {
int index = currentIndex;
+ IBaseEventInfo eventInfo = null;
while (index < output.length) {
String line = output[index];
Matcher matcher = LTTngControlServiceConstants.PROVIDER_EVENT_PATTERN.matcher(line);
if (matcher.matches()) {
- // sched_kthread_stop (loglevel: TRACE_EMERG0) (type:
- // tracepoint)
- IBaseEventInfo eventInfo = new BaseEventInfo(matcher.group(1).trim());
+ // sched_kthread_stop (loglevel: TRACE_EMERG0) (type: tracepoint)
+ eventInfo = new BaseEventInfo(matcher.group(1).trim());
eventInfo.setLogLevel(matcher.group(2).trim());
eventInfo.setEventType(matcher.group(3).trim());
events.add(eventInfo);
+ index++;
+ } else if (LTTngControlServiceConstants.EVENT_FIELD_PATTERN.matcher(line).matches()) {
+ if (eventInfo != null) {
+ List<IFieldInfo> fields = new ArrayList<IFieldInfo>();
+ index = getFieldInfo(output, index, fields);
+ eventInfo.setFields(fields);
+ } else {
+ index++;
+ }
+ }
+ else if (LTTngControlServiceConstants.UST_PROVIDER_PATTERN.matcher(line).matches()) {
+ return index;
+ } else {
+ index++;
+ }
+ }
+ return index;
+ }
+
+
+ /**
+ * Parse a field's information.
+ *
+ * @param output
+ * A command output array
+ * @param currentIndex
+ * The current index in the command output array
+ * @param fields
+ * List for returning the field information
+ * @return The new current index in the command output array
+ */
+ protected int getFieldInfo(String[] output, int currentIndex, List<IFieldInfo> fields) {
+ int index = currentIndex;
+ IFieldInfo fieldInfo = null;
+ while (index < output.length) {
+ String line = output[index];
+ Matcher matcher = LTTngControlServiceConstants.EVENT_FIELD_PATTERN.matcher(line);
+ if (matcher.matches()) {
+ // field: content (string)
+ fieldInfo = new FieldInfo(matcher.group(2).trim());
+ fieldInfo.setFieldType(matcher.group(3).trim());
+ fields.add(fieldInfo);
+ } else if (LTTngControlServiceConstants.PROVIDER_EVENT_PATTERN.matcher(line).matches()) {
+ return index;
} else if (LTTngControlServiceConstants.UST_PROVIDER_PATTERN.matcher(line).matches()) {
return index;
}