1 /**********************************************************************
2 * Copyright (c) 2012, 2016 Ericsson
4 * All rights reserved. This program and the accompanying materials are
5 * made available under the terms of the Eclipse Public License v1.0 which
6 * accompanies this distribution, and is available at
7 * http://www.eclipse.org/legal/epl-v10.html
10 * Bernd Hufmann - Initial API and implementation
11 * Bernd Hufmann - Updated for support of LTTng Tools 2.1
12 * Simon Delisle - Updated for support of LTTng Tools 2.2
13 * Marc-Andre Laperle - Support for creating a live session
14 * Markus Schorn - Bug 448058: Use org.eclipse.remote in favor of RSE
15 **********************************************************************/
16 package org
.eclipse
.tracecompass
.internal
.lttng2
.control
.ui
.views
.service
;
18 import static org
.eclipse
.tracecompass
.common
.core
.NonNullUtils
.checkNotNull
;
19 import static org
.eclipse
.tracecompass
.common
.core
.NonNullUtils
.nullToEmptyString
;
21 import java
.util
.ArrayList
;
22 import java
.util
.Arrays
;
23 import java
.util
.Iterator
;
24 import java
.util
.List
;
25 import java
.util
.regex
.Matcher
;
26 import java
.util
.regex
.Pattern
;
28 import org
.eclipse
.core
.commands
.ExecutionException
;
29 import org
.eclipse
.core
.runtime
.IProgressMonitor
;
30 import org
.eclipse
.core
.runtime
.NullProgressMonitor
;
31 import org
.eclipse
.jdt
.annotation
.NonNull
;
32 import org
.eclipse
.jdt
.annotation
.Nullable
;
33 import org
.eclipse
.tracecompass
.internal
.lttng2
.control
.core
.model
.IBaseEventInfo
;
34 import org
.eclipse
.tracecompass
.internal
.lttng2
.control
.core
.model
.IChannelInfo
;
35 import org
.eclipse
.tracecompass
.internal
.lttng2
.control
.core
.model
.IDomainInfo
;
36 import org
.eclipse
.tracecompass
.internal
.lttng2
.control
.core
.model
.IEventInfo
;
37 import org
.eclipse
.tracecompass
.internal
.lttng2
.control
.core
.model
.IFieldInfo
;
38 import org
.eclipse
.tracecompass
.internal
.lttng2
.control
.core
.model
.IProbeEventInfo
;
39 import org
.eclipse
.tracecompass
.internal
.lttng2
.control
.core
.model
.ISessionInfo
;
40 import org
.eclipse
.tracecompass
.internal
.lttng2
.control
.core
.model
.ISnapshotInfo
;
41 import org
.eclipse
.tracecompass
.internal
.lttng2
.control
.core
.model
.IUstProviderInfo
;
42 import org
.eclipse
.tracecompass
.internal
.lttng2
.control
.core
.model
.LogLevelType
;
43 import org
.eclipse
.tracecompass
.internal
.lttng2
.control
.core
.model
.TraceEventType
;
44 import org
.eclipse
.tracecompass
.internal
.lttng2
.control
.core
.model
.TraceLogLevel
;
45 import org
.eclipse
.tracecompass
.internal
.lttng2
.control
.core
.model
.impl
.BaseEventInfo
;
46 import org
.eclipse
.tracecompass
.internal
.lttng2
.control
.core
.model
.impl
.BufferType
;
47 import org
.eclipse
.tracecompass
.internal
.lttng2
.control
.core
.model
.impl
.ChannelInfo
;
48 import org
.eclipse
.tracecompass
.internal
.lttng2
.control
.core
.model
.impl
.DomainInfo
;
49 import org
.eclipse
.tracecompass
.internal
.lttng2
.control
.core
.model
.impl
.EventInfo
;
50 import org
.eclipse
.tracecompass
.internal
.lttng2
.control
.core
.model
.impl
.FieldInfo
;
51 import org
.eclipse
.tracecompass
.internal
.lttng2
.control
.core
.model
.impl
.ProbeEventInfo
;
52 import org
.eclipse
.tracecompass
.internal
.lttng2
.control
.core
.model
.impl
.SessionInfo
;
53 import org
.eclipse
.tracecompass
.internal
.lttng2
.control
.core
.model
.impl
.SnapshotInfo
;
54 import org
.eclipse
.tracecompass
.internal
.lttng2
.control
.core
.model
.impl
.UstProviderInfo
;
55 import org
.eclipse
.tracecompass
.internal
.lttng2
.control
.ui
.views
.logging
.ControlCommandLogger
;
56 import org
.eclipse
.tracecompass
.internal
.lttng2
.control
.ui
.views
.messages
.Messages
;
57 import org
.eclipse
.tracecompass
.internal
.lttng2
.control
.ui
.views
.preferences
.ControlPreferences
;
58 import org
.eclipse
.tracecompass
.tmf
.remote
.core
.shell
.ICommandInput
;
59 import org
.eclipse
.tracecompass
.tmf
.remote
.core
.shell
.ICommandResult
;
60 import org
.eclipse
.tracecompass
.tmf
.remote
.core
.shell
.ICommandShell
;
64 * Service for sending LTTng trace control commands to remote host.
67 * @author Bernd Hufmann
69 public class LTTngControlService
implements ILttngControlService
{
71 // ------------------------------------------------------------------------
73 // ------------------------------------------------------------------------
75 * The command shell implementation
77 private final @NonNull ICommandShell fCommandShell
;
82 private @NonNull LttngVersion fVersion
= LttngVersion
.NULL_VERSION
;
84 // ------------------------------------------------------------------------
86 // ------------------------------------------------------------------------
92 * - the command shell implementation to use
94 public LTTngControlService(@NonNull ICommandShell shell
) {
95 fCommandShell
= shell
;
98 // ------------------------------------------------------------------------
100 // ------------------------------------------------------------------------
103 public String
getVersionString() {
104 return nullToEmptyString(fVersion
.toString());
108 public LttngVersion
getVersion() {
113 * Sets the version of the LTTng 2.0 control service.
118 public void setVersion(@Nullable String version
) {
119 if (version
!= null) {
120 fVersion
= new LttngVersion(version
);
125 * Sets the version of the LTTng 2.x control service.
130 protected void setVersion(LttngVersion version
) {
131 if (version
!= null) {
137 public boolean isVersionSupported(String version
) {
138 LttngVersion tmp
= new LttngVersion(version
);
139 return (fVersion
.compareTo(tmp
) >= 0) ?
true : false;
143 * Returns the command shell implementation.
145 * @return the command shell implementation
147 protected ICommandShell
getCommandShell() {
148 return fCommandShell
;
151 // ------------------------------------------------------------------------
153 // ------------------------------------------------------------------------
156 public List
<String
> getSessionNames(IProgressMonitor monitor
) throws ExecutionException
{
157 ICommandInput command
= createCommand(LTTngControlServiceConstants
.COMMAND_LIST
);
159 ICommandResult result
= executeCommand(command
, monitor
);
162 // Available tracing sessions:
163 // 1) mysession1 (/home/user/lttng-traces/mysession1-20120123-083928)
165 // 2) mysession (/home/user/lttng-traces/mysession-20120123-083318)
168 // Use lttng list <session_name> for more details
170 ArrayList
<String
> retArray
= new ArrayList
<>();
171 for (String line
: result
.getOutput()) {
172 Matcher matcher
= LTTngControlServiceConstants
.SESSION_PATTERN
.matcher(line
);
173 if (matcher
.matches()) {
174 retArray
.add(matcher
.group(2).trim());
181 * Check if there is a pattern to be ignored into a sequence of string
184 * an input list of Strings
186 * the pattern to search for
187 * @return if the pattern exist in the array of string
189 protected boolean ignoredPattern(List
<String
> input
, Pattern pattern
) {
190 for (String line
: input
) {
191 Matcher matcher
= pattern
.matcher(line
);
192 if (matcher
.matches()) {
200 public ISessionInfo
getSession(String sessionName
, IProgressMonitor monitor
) throws ExecutionException
{
201 ICommandInput command
= createCommand(LTTngControlServiceConstants
.COMMAND_LIST
, sessionName
);
202 ICommandResult result
= executeCommand(command
, monitor
);
207 // Tracing session mysession2: [inactive]
208 // Trace path: /home/eedbhu/lttng-traces/mysession2-20120123-110330
209 ISessionInfo sessionInfo
= new SessionInfo(sessionName
);
211 while (index
< result
.getOutput().size()) {
212 // Tracing session mysession2: [inactive]
213 // Trace path: /home/eedbhu/lttng-traces/mysession2-20120123-110330
215 // === Domain: Kernel ===
217 String line
= result
.getOutput().get(index
);
218 Matcher matcher
= LTTngControlServiceConstants
.TRACE_SESSION_PATTERN
.matcher(line
);
219 if (matcher
.matches()) {
220 sessionInfo
.setSessionState(matcher
.group(2));
225 matcher
= LTTngControlServiceConstants
.TRACE_SNAPSHOT_SESSION_PATTERN
.matcher(line
);
226 if (matcher
.matches()) {
227 sessionInfo
.setSessionState(matcher
.group(2));
228 // real name will be set later
229 ISnapshotInfo snapshotInfo
= new SnapshotInfo(""); //$NON-NLS-1$
230 sessionInfo
.setSnapshotInfo(snapshotInfo
);
235 if (!sessionInfo
.isSnapshotSession()) {
236 matcher
= LTTngControlServiceConstants
.TRACE_NETWORK_PATH_PATTERN
.matcher(line
);
237 if (matcher
.matches()) {
238 sessionInfo
.setStreamedTrace(true);
241 matcher
= LTTngControlServiceConstants
.TRACE_SESSION_PATH_PATTERN
.matcher(line
);
242 if (matcher
.matches()) {
243 sessionInfo
.setSessionPath(matcher
.group(1).trim());
249 matcher
= LTTngControlServiceConstants
.DOMAIN_KERNEL_PATTERN
.matcher(line
);
250 if (matcher
.matches()) {
252 IDomainInfo domainInfo
= new DomainInfo(Messages
.TraceControl_KernelDomainDisplayName
);
255 domainInfo
.setIsKernel(true);
258 ArrayList
<IChannelInfo
> channels
= new ArrayList
<>();
259 index
= parseDomain(result
.getOutput(), index
, channels
, domainInfo
);
261 if (channels
.size() > 0) {
263 sessionInfo
.addDomain(domainInfo
);
266 domainInfo
.setChannels(channels
);
271 matcher
= LTTngControlServiceConstants
.DOMAIN_UST_GLOBAL_PATTERN
.matcher(line
);
272 if (matcher
.matches()) {
273 IDomainInfo domainInfo
= new DomainInfo(Messages
.TraceControl_UstGlobalDomainDisplayName
);
276 domainInfo
.setIsKernel(false);
279 ArrayList
<IChannelInfo
> channels
= new ArrayList
<>();
280 index
= parseDomain(result
.getOutput(), index
, channels
, domainInfo
);
282 if (channels
.size() > 0) {
284 sessionInfo
.addDomain(domainInfo
);
287 domainInfo
.setChannels(channels
);
291 matcher
= LTTngControlServiceConstants
.LIST_LIVE_TIMER_INTERVAL_PATTERN
.matcher(line
);
292 if (matcher
.matches()) {
293 long liveDelay
= Long
.parseLong(matcher
.group(1));
294 if ((liveDelay
> 0) && (liveDelay
<= LTTngControlServiceConstants
.MAX_LIVE_TIMER_INTERVAL
)) {
295 sessionInfo
.setLive(true);
296 sessionInfo
.setLiveUrl(SessionInfo
.DEFAULT_LIVE_NETWORK_URL
);
297 sessionInfo
.setLivePort(SessionInfo
.DEFAULT_LIVE_PORT
);
298 sessionInfo
.setLiveDelay(liveDelay
);
307 if (sessionInfo
.isSnapshotSession()) {
308 ISnapshotInfo snapshot
= getSnapshotInfo(sessionName
, monitor
);
309 sessionInfo
.setSnapshotInfo(snapshot
);
316 public ISnapshotInfo
getSnapshotInfo(String sessionName
, IProgressMonitor monitor
) throws ExecutionException
{
317 ICommandInput command
= createCommand(LTTngControlServiceConstants
.COMMAND_SNAPSHOT
, LTTngControlServiceConstants
.COMMAND_LIST_SNAPSHOT_OUTPUT
, LTTngControlServiceConstants
.OPTION_SESSION
, sessionName
);
318 ICommandResult result
= executeCommand(command
, monitor
);
323 // [1] snapshot-1: /home/user/lttng-traces/my-20130909-114431
325 // [3] snapshot-3: net4://172.0.0.1/
326 ISnapshotInfo snapshotInfo
= new SnapshotInfo(""); //$NON-NLS-1$
328 while (index
< result
.getOutput().size()) {
329 String line
= result
.getOutput().get(index
);
330 Matcher matcher
= LTTngControlServiceConstants
.LIST_SNAPSHOT_OUTPUT_PATTERN
.matcher(line
);
331 if (matcher
.matches()) {
332 snapshotInfo
.setId(Integer
.valueOf(matcher
.group(1)));
333 snapshotInfo
.setName(matcher
.group(2));
334 snapshotInfo
.setSnapshotPath(matcher
.group(3));
336 Matcher matcher2
= LTTngControlServiceConstants
.SNAPSHOT_NETWORK_PATH_PATTERN
.matcher(snapshotInfo
.getSnapshotPath());
337 if (matcher2
.matches()) {
338 snapshotInfo
.setStreamedSnapshot(true);
351 public List
<IBaseEventInfo
> getKernelProvider(IProgressMonitor monitor
) throws ExecutionException
{
352 ICommandInput command
= createCommand(LTTngControlServiceConstants
.COMMAND_LIST
, LTTngControlServiceConstants
.OPTION_KERNEL
);
353 ICommandResult result
= executeCommand(command
, monitor
, false);
355 List
<IBaseEventInfo
> events
= new ArrayList
<>();
357 // Ignore the following 2 cases:
358 // Spawning a session daemon
359 // Error: Unable to list kernel events
361 // Error: Unable to list kernel events
363 if (ignoredPattern(result
.getErrorOutput(), LTTngControlServiceConstants
.LIST_KERNEL_NO_KERNEL_PROVIDER_PATTERN
)) {
367 if (isError(result
)) {
368 throw new ExecutionException(Messages
.TraceControl_CommandError
+ " " + command
.toString() + "\n" + result
.toString()); //$NON-NLS-1$ //$NON-NLS-2$
373 // sched_kthread_stop (type: tracepoint)
374 getProviderEventInfo(result
.getOutput(), 0, events
);
379 public List
<IUstProviderInfo
> getUstProvider() throws ExecutionException
{
380 return getUstProvider(new NullProgressMonitor());
384 public List
<IUstProviderInfo
> getUstProvider(IProgressMonitor monitor
) throws ExecutionException
{
385 ICommandInput command
= createCommand(LTTngControlServiceConstants
.COMMAND_LIST
, LTTngControlServiceConstants
.OPTION_UST
);
387 if (isVersionSupported("2.1.0")) { //$NON-NLS-1$
388 command
.add(LTTngControlServiceConstants
.OPTION_FIELDS
);
391 ICommandResult result
= executeCommand(command
, monitor
, false);
392 List
<IUstProviderInfo
> allProviders
= new ArrayList
<>();
394 // Workaround for versions 2.0.x which causes a segmentation fault for
396 // if LTTng Tools is compiled without UST support.
397 if (!isVersionSupported("2.1.0") && (result
.getResult() != 0)) { //$NON-NLS-1$
401 // Ignore the following 2 cases:
402 // Spawning a session daemon
403 // Error: Unable to list UST events: Listing UST events failed
405 // Error: Unable to list UST events: Listing UST events failed
407 if (ignoredPattern(result
.getErrorOutput(), LTTngControlServiceConstants
.LIST_UST_NO_UST_PROVIDER_PATTERN
)) {
411 if (isError(result
)) {
412 throw new ExecutionException(Messages
.TraceControl_CommandError
+ " " + command
.toString() + "\n" + result
.toString()); //$NON-NLS-1$ //$NON-NLS-2$
415 // Note that field print-outs exists for version >= 2.1.0
421 // /home/user/git/lttng-ust/tests/hello.cxx/.libs/lt-hello
422 // ust_tests_hello:tptest_sighandler (loglevel: TRACE_EMERG0) (type:
424 // ust_tests_hello:tptest (loglevel: TRACE_EMERG0) (type: tracepoint)
425 // field: doublefield (float)
426 // field: floatfield (float)
427 // field: stringfield (string)
430 // /home/user/git/lttng-ust/tests/hello.cxx/.libs/lt-hello
431 // ust_tests_hello:tptest_sighandler (loglevel: TRACE_EMERG0) (type:
433 // ust_tests_hello:tptest (loglevel: TRACE_EMERG0) (type: tracepoint)
434 // field: doublefield (float)
435 // field: floatfield (float)
436 // field: stringfield (string)
438 IUstProviderInfo provider
= null;
441 while (index
< result
.getOutput().size()) {
442 String line
= result
.getOutput().get(index
);
443 Matcher matcher
= LTTngControlServiceConstants
.UST_PROVIDER_PATTERN
.matcher(line
);
444 if (matcher
.matches()) {
445 provider
= new UstProviderInfo(matcher
.group(2).trim());
446 provider
.setPid(Integer
.valueOf(matcher
.group(1).trim()));
447 List
<IBaseEventInfo
> events
= new ArrayList
<>();
448 index
= getProviderEventInfo(result
.getOutput(), ++index
, events
);
449 provider
.setEvents(events
);
450 allProviders
.add(provider
);
459 public ISessionInfo
createSession(ISessionInfo sessionInfo
, IProgressMonitor monitor
) throws ExecutionException
{
460 if (sessionInfo
.isStreamedTrace()) {
461 return createStreamedSession(sessionInfo
, monitor
);
464 ICommandInput command
= prepareSessionCreationCommand(sessionInfo
);
466 ICommandResult result
= executeCommand(command
, monitor
);
468 // Session myssession2 created.
469 // Traces will be written in
470 // /home/user/lttng-traces/myssession2-20120209-095418
471 List
<String
> output
= result
.getOutput();
473 // Get and session name and path
477 for (String line
: output
) {
478 Matcher nameMatcher
= LTTngControlServiceConstants
.CREATE_SESSION_NAME_PATTERN
.matcher(line
);
479 Matcher pathMatcher
= LTTngControlServiceConstants
.CREATE_SESSION_PATH_PATTERN
.matcher(line
);
480 if (nameMatcher
.matches()) {
481 name
= String
.valueOf(nameMatcher
.group(1).trim());
482 } else if (pathMatcher
.matches()) {
483 path
= String
.valueOf(pathMatcher
.group(1).trim());
487 // Verify session name
488 if ((name
== null) || (!"".equals(sessionInfo
.getName()) && !name
.equals(sessionInfo
.getName()))) { //$NON-NLS-1$
489 // Unexpected name returned
490 throw new ExecutionException(Messages
.TraceControl_CommandError
+ " " + command
.toString() + "\n" + //$NON-NLS-1$ //$NON-NLS-2$
491 Messages
.TraceControl_UnexpectedNameError
+ ": " + name
); //$NON-NLS-1$
494 sessionInfo
.setName(name
);
495 // Verify session path
496 if (!sessionInfo
.isSnapshotSession() &&
497 ((path
== null) || ((sessionInfo
.getSessionPath() != null) && (!path
.contains(sessionInfo
.getSessionPath()))))) {
499 throw new ExecutionException(Messages
.TraceControl_CommandError
+ " " + command
.toString() + "\n" + //$NON-NLS-1$ //$NON-NLS-2$
500 Messages
.TraceControl_UnexpectedPathError
+ ": " + name
); //$NON-NLS-1$
503 if (sessionInfo
.isSnapshotSession()) {
504 // Make it a snapshot session - content of snapshot info need to
505 // set afterwards using getSession() or getSnapshotInfo()
506 sessionInfo
.setSnapshotInfo(new SnapshotInfo("")); //$NON-NLS-1$
508 sessionInfo
.setSessionPath(path
);
516 * Basic generation of command for session creation
519 * the session to create
520 * @return the basic command for command creation
522 protected @NonNull ICommandInput
prepareSessionCreationCommand(ISessionInfo sessionInfo
) {
523 ICommandInput command
= createCommand(LTTngControlServiceConstants
.COMMAND_CREATE_SESSION
);
524 if (!sessionInfo
.getName().isEmpty()) {
525 command
.add(sessionInfo
.getName());
528 String newPath
= sessionInfo
.getSessionPath();
529 if (newPath
!= null && !"".equals(newPath
)) { //$NON-NLS-1$
530 command
.add(LTTngControlServiceConstants
.OPTION_OUTPUT_PATH
);
531 command
.add(newPath
);
534 if (sessionInfo
.isSnapshotSession()) {
535 command
.add(LTTngControlServiceConstants
.OPTION_SNAPSHOT
);
540 private @NonNull ISessionInfo
createStreamedSession(ISessionInfo sessionInfo
, IProgressMonitor monitor
) throws ExecutionException
{
542 ICommandInput command
= prepareStreamedSessionCreationCommand(sessionInfo
);
544 ICommandResult result
= executeCommand(command
, monitor
);
547 List
<String
> output
= result
.getOutput();
549 // Get and session name and path
553 for (String line
: output
) {
554 Matcher nameMatcher
= LTTngControlServiceConstants
.CREATE_SESSION_NAME_PATTERN
.matcher(line
);
555 Matcher pathMatcher
= LTTngControlServiceConstants
.CREATE_SESSION_PATH_PATTERN
.matcher(line
);
557 if (nameMatcher
.matches()) {
558 name
= String
.valueOf(nameMatcher
.group(1).trim());
559 } else if (pathMatcher
.matches() && (sessionInfo
.getNetworkUrl() != null)) {
560 path
= String
.valueOf(pathMatcher
.group(1).trim());
564 // Verify session name
565 if ((name
== null) || (!"".equals(sessionInfo
.getName()) && !name
.equals(sessionInfo
.getName()))) { //$NON-NLS-1$
566 // Unexpected name returned
567 throw new ExecutionException(Messages
.TraceControl_CommandError
+ " " + command
.toString() + "\n" + //$NON-NLS-1$ //$NON-NLS-2$
568 Messages
.TraceControl_UnexpectedNameError
+ ": " + name
); //$NON-NLS-1$
571 sessionInfo
.setName(name
);
573 sessionInfo
.setStreamedTrace(true);
575 // Verify session path
576 if (sessionInfo
.getNetworkUrl() != null) {
577 if (!sessionInfo
.isSnapshotSession() && (path
== null)) {
579 throw new ExecutionException(Messages
.TraceControl_CommandError
+ " " + command
.toString() + "\n" + //$NON-NLS-1$ //$NON-NLS-2$
580 Messages
.TraceControl_UnexpectedPathError
+ ": " + name
); //$NON-NLS-1$
583 if (sessionInfo
.isSnapshotSession()) {
584 sessionInfo
.setStreamedTrace(false);
586 sessionInfo
.setSessionPath(path
);
587 // Check file protocol
588 Matcher matcher
= LTTngControlServiceConstants
.TRACE_FILE_PROTOCOL_PATTERN
.matcher(path
);
589 if (matcher
.matches()) {
590 sessionInfo
.setStreamedTrace(false);
595 // When using controlUrl and dataUrl the full session path is not known
596 // yet and will be set later on when listing the session
602 * Basic generation of command for streamed session creation
605 * the session to create
606 * @return the basic command for command creation
608 protected @NonNull ICommandInput
prepareStreamedSessionCreationCommand(ISessionInfo sessionInfo
) {
609 ICommandInput command
= createCommand(LTTngControlServiceConstants
.COMMAND_CREATE_SESSION
);
610 if (!sessionInfo
.getName().isEmpty()) {
611 command
.add(sessionInfo
.getName());
614 if (sessionInfo
.isSnapshotSession()) {
615 command
.add(LTTngControlServiceConstants
.OPTION_SNAPSHOT
);
616 } else if (sessionInfo
.isLive()) {
617 command
.add(LTTngControlServiceConstants
.OPTION_LIVE
);
618 if (sessionInfo
.getLiveDelay() != LTTngControlServiceConstants
.UNUSED_VALUE
) {
619 command
.add(String
.valueOf(sessionInfo
.getLiveDelay()));
623 if (sessionInfo
.getNetworkUrl() != null) {
624 command
.add(LTTngControlServiceConstants
.OPTION_NETWORK_URL
);
625 command
.add(sessionInfo
.getNetworkUrl());
627 command
.add(LTTngControlServiceConstants
.OPTION_CONTROL_URL
);
628 command
.add(sessionInfo
.getControlUrl());
630 command
.add(LTTngControlServiceConstants
.OPTION_DATA_URL
);
631 command
.add(sessionInfo
.getDataUrl());
637 public void destroySession(String sessionName
, IProgressMonitor monitor
) throws ExecutionException
{
639 ICommandInput command
= createCommand(LTTngControlServiceConstants
.COMMAND_DESTROY_SESSION
, sessionName
);
641 ICommandResult result
= executeCommand(command
, monitor
, false);
642 boolean isError
= isError(result
);
643 if (isError
&& !ignoredPattern(result
.getErrorOutput(), LTTngControlServiceConstants
.SESSION_NOT_FOUND_ERROR_PATTERN
)) {
644 throw new ExecutionException(Messages
.TraceControl_CommandError
+ " " + command
.toString() + "\n" + result
.toString()); //$NON-NLS-1$ //$NON-NLS-2$
647 // Session <sessionName> destroyed
651 public void startSession(String sessionName
, IProgressMonitor monitor
) throws ExecutionException
{
653 ICommandInput command
= createCommand(LTTngControlServiceConstants
.COMMAND_START_SESSION
, sessionName
);
655 executeCommand(command
, monitor
);
657 // Session <sessionName> started
661 public void stopSession(String sessionName
, IProgressMonitor monitor
) throws ExecutionException
{
662 ICommandInput command
= createCommand(LTTngControlServiceConstants
.COMMAND_STOP_SESSION
, sessionName
);
664 executeCommand(command
, monitor
);
666 // Session <sessionName> stopped
671 public void enableChannels(String sessionName
, List
<String
> channelNames
, boolean isKernel
, IChannelInfo info
, IProgressMonitor monitor
) throws ExecutionException
{
673 // no channels to enable
674 if (channelNames
.isEmpty()) {
678 ICommandInput command
= createCommand(LTTngControlServiceConstants
.COMMAND_ENABLE_CHANNEL
);
680 command
.add(toCsv(channelNames
));
683 command
.add(LTTngControlServiceConstants
.OPTION_KERNEL
);
685 command
.add(LTTngControlServiceConstants
.OPTION_UST
);
688 command
.add(LTTngControlServiceConstants
.OPTION_SESSION
);
689 command
.add(sessionName
);
692 // --discard Discard event when buffers are full (default)
694 // --overwrite Flight recorder mode
695 if (info
.isOverwriteMode()) {
696 command
.add(LTTngControlServiceConstants
.OPTION_OVERWRITE
);
698 // --subbuf-size SIZE Subbuffer size in bytes
699 // (default: 4096, kernel default: 262144)
700 if (info
.getSubBufferSize() != LTTngControlServiceConstants
.UNUSED_VALUE
) {
701 command
.add(LTTngControlServiceConstants
.OPTION_SUB_BUFFER_SIZE
);
702 command
.add(String
.valueOf(info
.getSubBufferSize()));
705 // --num-subbuf NUM Number of subbufers
706 if (info
.getNumberOfSubBuffers() != LTTngControlServiceConstants
.UNUSED_VALUE
) {
707 command
.add(LTTngControlServiceConstants
.OPTION_NUM_SUB_BUFFERS
);
708 command
.add(String
.valueOf(info
.getNumberOfSubBuffers()));
711 // --switch-timer USEC Switch timer interval in usec
712 if (info
.getSwitchTimer() != LTTngControlServiceConstants
.UNUSED_VALUE
) {
713 command
.add(LTTngControlServiceConstants
.OPTION_SWITCH_TIMER
);
714 command
.add(String
.valueOf(info
.getSwitchTimer()));
717 // --read-timer USEC Read timer interval in usec
718 if (info
.getReadTimer() != LTTngControlServiceConstants
.UNUSED_VALUE
) {
719 command
.add(LTTngControlServiceConstants
.OPTION_READ_TIMER
);
720 command
.add(String
.valueOf(info
.getReadTimer()));
723 if (isVersionSupported("2.2.0")) { //$NON-NLS-1$
724 // --buffers-uid Every application sharing the same UID use the
725 // same buffers --buffers-pid Buffers are allocated per PID
727 if (info
.getBufferType() == BufferType
.BUFFER_PER_PID
) {
728 command
.add(LTTngControlServiceConstants
.OPTION_PER_PID_BUFFERS
);
730 } else if (info
.getBufferType() == BufferType
.BUFFER_PER_UID
) {
731 command
.add(LTTngControlServiceConstants
.OPTION_PER_UID_BUFFERS
);
735 // -C SIZE Maximum size of trace files in bytes
736 if (info
.getMaxSizeTraceFiles() != LTTngControlServiceConstants
.UNUSED_VALUE
) {
737 command
.add(LTTngControlServiceConstants
.OPTION_MAX_SIZE_TRACE_FILES
);
738 command
.add(String
.valueOf(info
.getMaxSizeTraceFiles()));
741 // -W NUM Maximum number of trace files
742 if (info
.getMaxNumberTraceFiles() != LTTngControlServiceConstants
.UNUSED_VALUE
) {
743 command
.add(LTTngControlServiceConstants
.OPTION_MAX_TRACE_FILES
);
744 command
.add(String
.valueOf(info
.getMaxNumberTraceFiles()));
749 executeCommand(command
, monitor
);
754 public void disableChannels(String sessionName
, List
<String
> channelNames
, boolean isKernel
, IProgressMonitor monitor
) throws ExecutionException
{
756 // no channels to enable
757 if (channelNames
.isEmpty()) {
761 ICommandInput command
= createCommand(LTTngControlServiceConstants
.COMMAND_DISABLE_CHANNEL
);
763 command
.add(toCsv(channelNames
));
766 command
.add(LTTngControlServiceConstants
.OPTION_KERNEL
);
768 command
.add(LTTngControlServiceConstants
.OPTION_UST
);
771 command
.add(LTTngControlServiceConstants
.OPTION_SESSION
);
772 command
.add(sessionName
);
774 executeCommand(command
, monitor
);
778 public void enableEvents(String sessionName
, String channelName
, List
<String
> eventNames
, boolean isKernel
, String filterExpression
, IProgressMonitor monitor
) throws ExecutionException
{
780 ICommandInput command
= createCommand(LTTngControlServiceConstants
.COMMAND_ENABLE_EVENT
);
781 boolean isAllEvents
= ALL_EVENTS
.equals(eventNames
);
783 if (isAllEvents
|| (eventNames
== null) || (eventNames
.isEmpty())) {
784 command
.add(LTTngControlServiceConstants
.OPTION_ALL
);
786 command
.add(toCsv(eventNames
));
790 command
.add(LTTngControlServiceConstants
.OPTION_KERNEL
);
792 command
.add(LTTngControlServiceConstants
.OPTION_UST
);
795 command
.add(LTTngControlServiceConstants
.OPTION_SESSION
);
796 command
.add(sessionName
);
798 if (channelName
!= null) {
799 command
.add(LTTngControlServiceConstants
.OPTION_CHANNEL
);
800 command
.add(channelName
);
804 command
.add(LTTngControlServiceConstants
.OPTION_TRACEPOINT
);
807 if (filterExpression
!= null) {
808 command
.add(LTTngControlServiceConstants
.OPTION_FILTER
);
809 command
.add(filterExpression
);
812 executeCommand(command
, monitor
);
817 public void enableSyscalls(String sessionName
, String channelName
, IProgressMonitor monitor
) throws ExecutionException
{
819 ICommandInput command
= createCommand(LTTngControlServiceConstants
.COMMAND_ENABLE_EVENT
);
821 command
.add(LTTngControlServiceConstants
.OPTION_ALL
);
822 command
.add(LTTngControlServiceConstants
.OPTION_KERNEL
);
825 command
.add(LTTngControlServiceConstants
.OPTION_SESSION
);
826 command
.add(sessionName
);
828 if (channelName
!= null) {
829 command
.add(LTTngControlServiceConstants
.OPTION_CHANNEL
);
830 command
.add(channelName
);
833 command
.add(LTTngControlServiceConstants
.OPTION_SYSCALL
);
835 executeCommand(command
, monitor
);
839 public void enableProbe(String sessionName
, String channelName
, String eventName
, boolean isFunction
, String probe
, IProgressMonitor monitor
) throws ExecutionException
{
840 ICommandInput command
= createCommand(LTTngControlServiceConstants
.COMMAND_ENABLE_EVENT
);
842 command
.add(eventName
);
843 command
.add(LTTngControlServiceConstants
.OPTION_KERNEL
);
845 command
.add(LTTngControlServiceConstants
.OPTION_SESSION
);
846 command
.add(sessionName
);
848 if (channelName
!= null) {
849 command
.add(LTTngControlServiceConstants
.OPTION_CHANNEL
);
850 command
.add(channelName
);
853 command
.add(LTTngControlServiceConstants
.OPTION_FUNCTION_PROBE
);
855 command
.add(LTTngControlServiceConstants
.OPTION_PROBE
);
860 executeCommand(command
, monitor
);
864 public void enableLogLevel(String sessionName
, String channelName
, String eventName
, LogLevelType logLevelType
, TraceLogLevel level
, String filterExpression
, IProgressMonitor monitor
) throws ExecutionException
{
865 ICommandInput command
= createCommand(LTTngControlServiceConstants
.COMMAND_ENABLE_EVENT
);
867 command
.add(eventName
);
868 command
.add(LTTngControlServiceConstants
.OPTION_UST
);
870 command
.add(LTTngControlServiceConstants
.OPTION_SESSION
);
871 command
.add(sessionName
);
873 if (channelName
!= null) {
874 command
.add(LTTngControlServiceConstants
.OPTION_CHANNEL
);
875 command
.add(channelName
);
878 if (logLevelType
== LogLevelType
.LOGLEVEL
) {
879 command
.add(LTTngControlServiceConstants
.OPTION_LOGLEVEL
);
880 } else if (logLevelType
== LogLevelType
.LOGLEVEL_ONLY
) {
881 command
.add(LTTngControlServiceConstants
.OPTION_LOGLEVEL_ONLY
);
886 command
.add(level
.getInName());
888 executeCommand(command
, monitor
);
892 public void disableEvent(String sessionName
, String channelName
, List
<String
> eventNames
, boolean isKernel
, IProgressMonitor monitor
) throws ExecutionException
{
893 ICommandInput command
= createCommand(LTTngControlServiceConstants
.COMMAND_DISABLE_EVENT
);
895 if (eventNames
== null) {
896 command
.add(LTTngControlServiceConstants
.OPTION_ALL
);
898 // no events to disable
899 if (eventNames
.isEmpty()) {
903 StringBuffer eventNameParameter
= new StringBuffer();
904 for (Iterator
<String
> iterator
= eventNames
.iterator(); iterator
.hasNext();) {
905 String event
= iterator
.next();
906 eventNameParameter
.append(event
);
907 if (iterator
.hasNext()) {
908 eventNameParameter
.append(',');
911 command
.add(eventNameParameter
.toString());
915 command
.add(LTTngControlServiceConstants
.OPTION_KERNEL
);
917 command
.add(LTTngControlServiceConstants
.OPTION_UST
);
920 command
.add(LTTngControlServiceConstants
.OPTION_SESSION
);
921 command
.add(sessionName
);
923 if (channelName
!= null) {
924 command
.add(LTTngControlServiceConstants
.OPTION_CHANNEL
);
925 command
.add(channelName
);
928 executeCommand(command
, monitor
);
932 public List
<String
> getContextList(IProgressMonitor monitor
) throws ExecutionException
{
934 ICommandInput command
= createCommand(LTTngControlServiceConstants
.COMMAND_ADD_CONTEXT
, LTTngControlServiceConstants
.OPTION_HELP
);
936 ICommandResult result
= executeCommand(command
, monitor
);
938 List
<String
> output
= result
.getOutput();
940 List
<String
> contexts
= new ArrayList
<>(0);
943 boolean inList
= false;
944 while (index
< output
.size()) {
945 String line
= output
.get(index
);
947 Matcher startMatcher
= LTTngControlServiceConstants
.ADD_CONTEXT_HELP_CONTEXTS_INTRO
.matcher(line
);
948 Matcher endMatcher
= LTTngControlServiceConstants
.ADD_CONTEXT_HELP_CONTEXTS_END_LINE
.matcher(line
);
950 if (startMatcher
.matches()) {
952 } else if (endMatcher
.matches()) {
955 String
[] tmp
= line
.split(","); //$NON-NLS-1$
956 for (int i
= 0; i
< tmp
.length
; i
++) {
957 contexts
.add(tmp
[i
].trim());
966 public void addContexts(String sessionName
, String channelName
, String eventName
, boolean isKernel
, List
<String
> contextNames
, IProgressMonitor monitor
) throws ExecutionException
{
967 ICommandInput command
= createCommand(LTTngControlServiceConstants
.COMMAND_ADD_CONTEXT
);
969 command
.add(LTTngControlServiceConstants
.OPTION_SESSION
);
970 command
.add(sessionName
);
972 if (channelName
!= null) {
973 command
.add(LTTngControlServiceConstants
.OPTION_CHANNEL
);
974 command
.add(channelName
);
977 if (eventName
!= null) {
978 command
.add(LTTngControlServiceConstants
.OPTION_EVENT
);
979 command
.add(eventName
);
983 command
.add(LTTngControlServiceConstants
.OPTION_KERNEL
);
985 command
.add(LTTngControlServiceConstants
.OPTION_UST
);
988 for (Iterator
<String
> iterator
= contextNames
.iterator(); iterator
.hasNext();) {
989 String context
= iterator
.next();
990 command
.add(LTTngControlServiceConstants
.OPTION_CONTEXT_TYPE
);
991 command
.add(context
);
994 executeCommand(command
, monitor
);
999 public void recordSnapshot(String sessionName
, IProgressMonitor monitor
)
1000 throws ExecutionException
{
1001 ICommandInput command
= createCommand(LTTngControlServiceConstants
.COMMAND_SNAPSHOT
, LTTngControlServiceConstants
.COMMAND_RECORD_SNAPSHOT
);
1003 String newSessionName
= sessionName
;
1004 command
.add(LTTngControlServiceConstants
.OPTION_SESSION
);
1005 command
.add(newSessionName
);
1007 executeCommand(command
, monitor
);
1011 public void loadSession(String inputPath
, boolean isForce
, IProgressMonitor monitor
)
1012 throws ExecutionException
{
1013 ICommandInput command
= createCommand(LTTngControlServiceConstants
.COMMAND_LOAD_SESSION
);
1015 if (inputPath
!= null) {
1016 command
.add(LTTngControlServiceConstants
.OPTION_INPUT_PATH
);
1017 command
.add(inputPath
);
1021 command
.add(LTTngControlServiceConstants
.OPTION_FORCE
);
1023 executeCommand(command
, monitor
);
1027 public void saveSession(String session
, String outputPath
, boolean isForce
, IProgressMonitor monitor
) throws ExecutionException
{
1028 ICommandInput command
= createCommand(LTTngControlServiceConstants
.COMMAND_SAVE_SESSION
);
1030 if (outputPath
!= null) {
1031 command
.add(LTTngControlServiceConstants
.OPTION_OUTPUT_PATH
);
1032 command
.add(outputPath
);
1036 command
.add(LTTngControlServiceConstants
.OPTION_FORCE
);
1039 if (session
!= null) {
1040 command
.add(session
);
1042 executeCommand(command
, monitor
);
1046 public void runCommands(IProgressMonitor monitor
, List
<String
> commandLines
) throws ExecutionException
{
1047 for (String commandLine
: commandLines
) {
1048 if (monitor
.isCanceled()) {
1052 if (commandLine
.isEmpty() || commandLine
.startsWith("#")) { //$NON-NLS-1$
1055 String
[] args
= commandLine
.split("\\s+"); //$NON-NLS-1$
1056 ICommandInput command
= fCommandShell
.createCommand();
1057 command
.addAll(Arrays
.asList(args
));
1058 ICommandResult result
= executeCommand(command
, monitor
);
1060 if (isError(result
)) {
1061 throw new ExecutionException(Messages
.TraceControl_CommandError
+ " " + command
.toString() + "\n" + result
.toString()); //$NON-NLS-1$ //$NON-NLS-2$
1066 // ------------------------------------------------------------------------
1068 // ------------------------------------------------------------------------
1071 * Checks if command result is an error result.
1074 * - the command result to check
1075 * @return true if error else false
1077 protected boolean isError(ICommandResult result
) {
1078 // Check return code and length of returned strings
1080 if ((result
.getResult()) != 0) {
1084 // Look for error pattern
1085 for (String line
: result
.getErrorOutput()) {
1086 Matcher matcher
= LTTngControlServiceConstants
.ERROR_PATTERN
.matcher(line
);
1087 if (matcher
.matches()) {
1096 * Creates a comma separated string from list of names
1098 * List of name to convert
1099 * @return comma separated string
1101 protected String
toCsv(List
<String
> names
) {
1102 StringBuilder csvString
= new StringBuilder();
1103 for (Iterator
<String
> iterator
= names
.iterator(); iterator
.hasNext();) {
1104 String name
= iterator
.next();
1105 csvString
.append(name
);
1106 if (iterator
.hasNext()) {
1107 csvString
.append(',');
1110 return csvString
.toString();
1114 * Parses the domain information.
1117 * a command output list
1118 * @param currentIndex
1119 * current index in command output list
1121 * list for returning channel information
1123 * The domain information
1124 * @return the new current index in command output list
1126 protected int parseDomain(List
<String
> output
, int currentIndex
, List
<IChannelInfo
> channels
, IDomainInfo domainInfo
) {
1127 int index
= currentIndex
;
1129 // if kernel set the buffer type to shared
1130 if (domainInfo
.isKernel()) {
1131 domainInfo
.setBufferType(BufferType
.BUFFER_SHARED
);
1136 // - channnel1: [enabled]
1139 // overwrite mode: 0
1140 // subbufers size: 262144
1141 // number of subbufers: 4
1142 // switch timer interval: 0
1143 // read timer interval: 200
1146 while (index
< output
.size()) {
1147 String line
= output
.get(index
);
1149 if (isVersionSupported("2.2.0")) { //$NON-NLS-1$
1150 Matcher bufferTypeMatcher
= LTTngControlServiceConstants
.BUFFER_TYPE_PATTERN
.matcher(line
);
1151 if (bufferTypeMatcher
.matches()) {
1152 String bufferTypeString
= getAttributeValue(line
);
1153 if (BufferType
.BUFFER_PER_PID
.getInName().equals(bufferTypeString
)) {
1154 domainInfo
.setBufferType(BufferType
.BUFFER_PER_PID
);
1155 } else if (BufferType
.BUFFER_PER_UID
.getInName().equals(bufferTypeString
)) {
1156 domainInfo
.setBufferType(BufferType
.BUFFER_PER_UID
);
1158 domainInfo
.setBufferType(BufferType
.BUFFER_TYPE_UNKNOWN
);
1162 domainInfo
.setBufferType(BufferType
.BUFFER_TYPE_UNKNOWN
);
1164 Matcher outerMatcher
= LTTngControlServiceConstants
.CHANNELS_SECTION_PATTERN
.matcher(line
);
1165 Matcher noKernelChannelMatcher
= LTTngControlServiceConstants
.DOMAIN_NO_KERNEL_CHANNEL_PATTERN
.matcher(line
);
1166 Matcher noUstChannelMatcher
= LTTngControlServiceConstants
.DOMAIN_NO_UST_CHANNEL_PATTERN
.matcher(line
);
1167 if (outerMatcher
.matches()) {
1168 IChannelInfo channelInfo
= null;
1169 while (index
< output
.size()) {
1170 String subLine
= output
.get(index
);
1172 Matcher innerMatcher
= LTTngControlServiceConstants
.CHANNEL_PATTERN
.matcher(subLine
);
1173 if (innerMatcher
.matches()) {
1174 channelInfo
= new ChannelInfo(""); //$NON-NLS-1$
1176 channelInfo
.setName(innerMatcher
.group(1));
1178 // get channel enablement
1179 channelInfo
.setState(innerMatcher
.group(2));
1182 channelInfo
.setBufferType(domainInfo
.getBufferType());
1185 channels
.add(channelInfo
);
1187 } else if (LTTngControlServiceConstants
.OVERWRITE_MODE_ATTRIBUTE
.matcher(subLine
).matches()) {
1188 String value
= getAttributeValue(subLine
);
1189 if (channelInfo
!= null) {
1190 channelInfo
.setOverwriteMode(!LTTngControlServiceConstants
.OVERWRITE_MODE_ATTRIBUTE_FALSE
.equals(value
));
1192 } else if (LTTngControlServiceConstants
.SUBBUFFER_SIZE_ATTRIBUTE
.matcher(subLine
).matches()) {
1193 if (channelInfo
!= null) {
1194 channelInfo
.setSubBufferSize(Long
.valueOf(getAttributeValue(subLine
)));
1197 } else if (LTTngControlServiceConstants
.NUM_SUBBUFFERS_ATTRIBUTE
.matcher(subLine
).matches()) {
1198 if (channelInfo
!= null) {
1199 channelInfo
.setNumberOfSubBuffers(Integer
.valueOf(getAttributeValue(subLine
)));
1202 } else if (LTTngControlServiceConstants
.SWITCH_TIMER_ATTRIBUTE
.matcher(subLine
).matches()) {
1203 if (channelInfo
!= null) {
1204 channelInfo
.setSwitchTimer(Long
.valueOf(getAttributeValue(subLine
)));
1207 } else if (LTTngControlServiceConstants
.READ_TIMER_ATTRIBUTE
.matcher(subLine
).matches()) {
1208 if (channelInfo
!= null) {
1209 channelInfo
.setReadTimer(Long
.valueOf(getAttributeValue(subLine
)));
1212 } else if (LTTngControlServiceConstants
.OUTPUT_ATTRIBUTE
.matcher(subLine
).matches()) {
1213 if (channelInfo
!= null) {
1214 channelInfo
.setOutputType(getAttributeValue(subLine
));
1217 } else if (LTTngControlServiceConstants
.TRACE_FILE_COUNT_ATTRIBUTE
.matcher(subLine
).matches()) {
1218 if (channelInfo
!= null) {
1219 channelInfo
.setMaxNumberTraceFiles(Integer
.valueOf(getAttributeValue(subLine
)));
1222 } else if (LTTngControlServiceConstants
.TRACE_FILE_SIZE_ATTRIBUTE
.matcher(subLine
).matches()) {
1223 if (channelInfo
!= null) {
1224 channelInfo
.setMaxSizeTraceFiles(Long
.valueOf(getAttributeValue(subLine
)));
1226 } else if (LTTngControlServiceConstants
.EVENT_SECTION_PATTERN
.matcher(subLine
).matches()) {
1227 List
<IEventInfo
> events
= new ArrayList
<>();
1228 index
= parseEvents(output
, index
, events
);
1229 if (channelInfo
!= null) {
1230 channelInfo
.setEvents(events
);
1232 // we want to stay at the current index to be able to
1235 } else if (LTTngControlServiceConstants
.DOMAIN_KERNEL_PATTERN
.matcher(subLine
).matches()) {
1238 } else if (LTTngControlServiceConstants
.DOMAIN_UST_GLOBAL_PATTERN
.matcher(subLine
).matches()) {
1243 } else if (noKernelChannelMatcher
.matches() || noUstChannelMatcher
.matches()) {
1244 // domain indicates that no channels were found -> return
1254 * Parses the event information within a domain.
1257 * a command output list
1258 * @param currentIndex
1259 * current index in command output list
1261 * list for returning event information
1262 * @return the new current index in command output list
1264 protected int parseEvents(List
<String
> output
, int currentIndex
, List
<IEventInfo
> events
) {
1265 int index
= currentIndex
;
1267 while (index
< output
.size()) {
1268 String line
= output
.get(index
);
1269 if (LTTngControlServiceConstants
.CHANNEL_PATTERN
.matcher(line
).matches()) {
1272 } else if (LTTngControlServiceConstants
.DOMAIN_KERNEL_PATTERN
.matcher(line
).matches()) {
1275 } else if (LTTngControlServiceConstants
.DOMAIN_UST_GLOBAL_PATTERN
.matcher(line
).matches()) {
1280 Matcher matcher
= LTTngControlServiceConstants
.EVENT_PATTERN
.matcher(line
);
1281 Matcher matcher2
= LTTngControlServiceConstants
.WILDCARD_EVENT_PATTERN
.matcher(line
);
1283 if (matcher
.matches()) {
1284 IEventInfo eventInfo
= new EventInfo(matcher
.group(1).trim());
1285 eventInfo
.setLogLevelType(matcher
.group(2).trim());
1286 eventInfo
.setLogLevel(matcher
.group(3).trim());
1287 eventInfo
.setEventType(matcher
.group(4).trim());
1288 eventInfo
.setState(matcher
.group(5));
1289 String filter
= matcher
.group(6);
1290 if (filter
!= null) {
1291 // remove '[' and ']'
1292 filter
= filter
.substring(1, filter
.length() - 1);
1293 eventInfo
.setFilterExpression(filter
);
1295 events
.add(eventInfo
);
1297 } else if (matcher2
.matches()) {
1298 IEventInfo eventInfo
= new EventInfo(matcher2
.group(1).trim());
1299 eventInfo
.setLogLevel(TraceLogLevel
.LEVEL_UNKNOWN
);
1300 eventInfo
.setEventType(matcher2
.group(2).trim());
1301 eventInfo
.setState(matcher2
.group(3));
1302 String filter
= matcher2
.group(4);
1303 if (filter
!= null) {
1304 // remove '[' and ']'
1305 filter
= filter
.substring(1, filter
.length() - 1);
1306 eventInfo
.setFilterExpression(filter
);
1309 if ((eventInfo
.getEventType() == TraceEventType
.PROBE
) ||
1310 (eventInfo
.getEventType() == TraceEventType
.FUNCTION
)) {
1311 IProbeEventInfo probeEvent
= new ProbeEventInfo(eventInfo
.getName());
1312 probeEvent
.setLogLevel(eventInfo
.getLogLevel());
1313 probeEvent
.setEventType(eventInfo
.getEventType());
1314 probeEvent
.setState(eventInfo
.getState());
1316 // Overwrite eventinfo
1317 eventInfo
= probeEvent
;
1319 // myevent2 (type: probe) [enabled]
1321 // myevent0 (type: function) [enabled]
1323 // symbol: init_post
1325 while (index
< output
.size()) {
1326 String probeLine
= output
.get(index
);
1328 Matcher addrMatcher
= LTTngControlServiceConstants
.PROBE_ADDRESS_PATTERN
.matcher(probeLine
);
1329 Matcher offsetMatcher
= LTTngControlServiceConstants
.PROBE_OFFSET_PATTERN
.matcher(probeLine
);
1330 Matcher symbolMatcher
= LTTngControlServiceConstants
.PROBE_SYMBOL_PATTERN
.matcher(probeLine
);
1331 if (addrMatcher
.matches()) {
1332 String addr
= addrMatcher
.group(2).trim();
1333 probeEvent
.setAddress(addr
);
1334 } else if (offsetMatcher
.matches()) {
1335 String offset
= offsetMatcher
.group(2).trim();
1336 probeEvent
.setOffset(offset
);
1337 } else if (symbolMatcher
.matches()) {
1338 String symbol
= symbolMatcher
.group(2).trim();
1339 probeEvent
.setSymbol(symbol
);
1340 } else if ((LTTngControlServiceConstants
.EVENT_PATTERN
.matcher(probeLine
).matches()) || (LTTngControlServiceConstants
.WILDCARD_EVENT_PATTERN
.matcher(probeLine
).matches())) {
1342 } else if (LTTngControlServiceConstants
.CHANNEL_PATTERN
.matcher(probeLine
).matches()) {
1344 } else if (LTTngControlServiceConstants
.DOMAIN_KERNEL_PATTERN
.matcher(probeLine
).matches()) {
1347 } else if (LTTngControlServiceConstants
.DOMAIN_UST_GLOBAL_PATTERN
.matcher(probeLine
).matches()) {
1353 events
.add(eventInfo
);
1355 events
.add(eventInfo
);
1368 * Parses a line with attributes: <attribute Name>: <attribute value>
1371 * - attribute line to parse
1372 * @return the attribute value as string
1374 protected String
getAttributeValue(String line
) {
1375 String
[] temp
= line
.split("\\: "); //$NON-NLS-1$
1380 * Parses the event information within a provider.
1383 * a command output list
1384 * @param currentIndex
1385 * current index in command output list
1387 * list for returning event information
1388 * @return the new current index in command output list
1390 protected int getProviderEventInfo(List
<String
> output
, int currentIndex
, List
<IBaseEventInfo
> events
) {
1391 int index
= currentIndex
;
1392 IBaseEventInfo eventInfo
= null;
1393 while (index
< output
.size()) {
1394 String line
= output
.get(index
);
1395 Matcher matcher
= LTTngControlServiceConstants
.PROVIDER_EVENT_PATTERN
.matcher(line
);
1396 if (matcher
.matches()) {
1397 // sched_kthread_stop (loglevel: TRACE_EMERG0) (type:
1399 eventInfo
= new BaseEventInfo(matcher
.group(1).trim());
1400 eventInfo
.setLogLevel(matcher
.group(2).trim());
1401 eventInfo
.setEventType(matcher
.group(3).trim());
1402 events
.add(eventInfo
);
1404 } else if (LTTngControlServiceConstants
.EVENT_FIELD_PATTERN
.matcher(line
).matches()) {
1405 if (eventInfo
!= null) {
1406 List
<IFieldInfo
> fields
= new ArrayList
<>();
1407 index
= getFieldInfo(output
, index
, fields
);
1408 eventInfo
.setFields(fields
);
1413 else if (LTTngControlServiceConstants
.UST_PROVIDER_PATTERN
.matcher(line
).matches()) {
1423 * Parse a field's information.
1426 * A command output list
1427 * @param currentIndex
1428 * The current index in the command output list
1430 * List for returning the field information
1431 * @return The new current index in the command output list
1433 protected int getFieldInfo(List
<String
> output
, int currentIndex
, List
<IFieldInfo
> fields
) {
1434 int index
= currentIndex
;
1435 IFieldInfo fieldInfo
= null;
1436 while (index
< output
.size()) {
1437 String line
= output
.get(index
);
1438 Matcher matcher
= LTTngControlServiceConstants
.EVENT_FIELD_PATTERN
.matcher(line
);
1439 if (matcher
.matches()) {
1440 // field: content (string)
1441 fieldInfo
= new FieldInfo(matcher
.group(2).trim());
1442 fieldInfo
.setFieldType(matcher
.group(3).trim());
1443 fields
.add(fieldInfo
);
1444 } else if (LTTngControlServiceConstants
.PROVIDER_EVENT_PATTERN
.matcher(line
).matches()) {
1446 } else if (LTTngControlServiceConstants
.UST_PROVIDER_PATTERN
.matcher(line
).matches()) {
1455 * Creates a command input instance
1458 * array of string that makes up a command line
1459 * @return {@link ICommandInput} instance
1461 protected @NonNull ICommandInput
createCommand(String
... segments
) {
1462 ICommandInput command
= fCommandShell
.createCommand();
1463 command
.add(LTTngControlServiceConstants
.CONTROL_COMMAND
);
1464 List
<@NonNull String
> groupOption
= getTracingGroupOption();
1465 if (!groupOption
.isEmpty()) {
1466 command
.addAll(groupOption
);
1468 String verboseOption
= getVerboseOption();
1469 if (!verboseOption
.isEmpty()) {
1470 command
.add(verboseOption
);
1472 for (String string
: segments
) {
1473 command
.add(checkNotNull(string
));
1479 * @return the tracing group option if configured in the preferences
1481 protected @NonNull List
<@NonNull String
> getTracingGroupOption() {
1482 List
<@NonNull String
> groupOption
= new ArrayList
<>();
1483 if (!ControlPreferences
.getInstance().isDefaultTracingGroup() && !ControlPreferences
.getInstance().getTracingGroup().equals("")) { //$NON-NLS-1$
1484 groupOption
.add(LTTngControlServiceConstants
.OPTION_TRACING_GROUP
);
1485 groupOption
.add(ControlPreferences
.getInstance().getTracingGroup());
1491 * @return the verbose option as configured in the preferences
1493 protected String
getVerboseOption() {
1494 if (ControlPreferences
.getInstance().isLoggingEnabled()) {
1495 String level
= ControlPreferences
.getInstance().getVerboseLevel();
1496 if (ControlPreferences
.TRACE_CONTROL_VERBOSE_LEVEL_VERBOSE
.equals(level
)) {
1497 return LTTngControlServiceConstants
.OPTION_VERBOSE
;
1499 if (ControlPreferences
.TRACE_CONTROL_VERBOSE_LEVEL_V_VERBOSE
.equals(level
)) {
1500 return LTTngControlServiceConstants
.OPTION_VERY_VERBOSE
;
1502 if (ControlPreferences
.TRACE_CONTROL_VERBOSE_LEVEL_V_V_VERBOSE
.equals(level
)) {
1503 return LTTngControlServiceConstants
.OPTION_VERY_VERY_VERBOSE
;
1506 return ""; //$NON-NLS-1$
1510 * Method that logs the command and command result if logging is enabled as
1511 * well as forwards the command execution to the shell.
1514 * - the command to execute
1516 * - a progress monitor
1517 * @return the command result
1518 * @throws ExecutionException
1519 * If the command fails
1521 protected ICommandResult
executeCommand(@NonNull ICommandInput command
,
1522 @Nullable IProgressMonitor monitor
) throws ExecutionException
{
1523 return executeCommand(command
, monitor
, true);
1527 * Method that logs the command and command result if logging is enabled as
1528 * well as forwards the command execution to the shell.
1531 * - the command to execute
1533 * - a progress monitor
1534 * @param checkForError
1535 * - true to verify command result, else false
1536 * @return the command result
1537 * @throws ExecutionException
1538 * in case of error result
1540 protected ICommandResult
executeCommand(@NonNull ICommandInput command
,
1541 @Nullable IProgressMonitor monitor
, boolean checkForError
)
1542 throws ExecutionException
{
1543 if (ControlPreferences
.getInstance().isLoggingEnabled()) {
1544 ControlCommandLogger
.log(command
.toString());
1547 ICommandResult result
= fCommandShell
.executeCommand(command
, monitor
);
1549 if (ControlPreferences
.getInstance().isLoggingEnabled()) {
1550 ControlCommandLogger
.log(result
.toString());
1553 if (checkForError
&& isError(result
)) {
1554 throw new ExecutionException(Messages
.TraceControl_CommandError
1555 + " " + command
.toString() + "\n" + result
.toString()); //$NON-NLS-1$ //$NON-NLS-2$