RFC - LTTng snapshot Author: David Goulet Version: - v0.1: 11/04/2013 * Initial proposal Motivation ---------- This proposal is for the snapshot feature in lttng-tools. The idea is to be able to snapshot a portion of the trace and write it to a specified output (disk or network). This could be particularly useful with in flight recorder mode where you detect a problem on your system for instance and then use this snapshot feature to save the latest buffers which should contain informations to help understand the issue. Requirements ----------------- In order to snapshot a session, it must be set in flight recorder mode meaning that there is *no* consumer extracting the trace and writing it to a destination. To do that, the --no-output option is added to "lttng create" command. $ lttng create --no-output Create a session with active tracing but no data being collected. For the API call lttng_create_session(), simply set the URL to NULL. Furthermore, by default, this command will set all subsequent channel in overwrite mode. You can force the discard value (overwrite=0) but it is a bit pointless since the snapshot does NOT remove the data from the buffers. Proposed Solution ----------------- First, the lttng command line UI new command is presented followed by the new API calls. Unlike the other lttng command, this one uses the git alike UI but in the form of the object first and action after where previous command only use action such as "enable-event". $ lttng snapshot [ACTION] [OPTIONS] ACTION: (detailed below) The user can specify an output destination either for the current session (being the default) or on the spot when the command is executed. To specify an output for the session, use the "add-output" action. $ lttng snapshot add-output [URL] [OPTIONS] OPTIONS: -s, --session NAME -C, --ctrl-url URL -D, --data-url URL -a, --alias ALIAS Name of the output in the session. Without the -s, the current session is used. The above command adds an output location to the session so when a snapshot is recorded later on, it's sent there. This action command takes either a valid lttng URL (see proposal 0004) or the -C/-D options from "lttng create" can be used to define relayd on different ports. The alias option can be used to give a name to the output so it's recognizable in the list command and can also be used with the del command. Following that, two new actions are available to control outputs. You can list and delete outputs. $ lttng snapshot list-output [1]: file://[...] [2]: net://1.1.1.1:8762:9123 [3] - ALIAS: file://[...] $ lttng snapshot del-output ID|ALIAS The output identified by the ID or alias is removed from the session. In this case the ID is the number returned by list-output (e.g.: 2). To specify an output destination on the spot when the snapshot is taken, use the record action. $ lttng snapshot record [URL] [OPTIONS] OPTIONS: -s, --session NAME Session name -n, --name NAME Name of the snapshot to recognize it afterwards. -m, --max-size SIZE Maximum bytes size of the snapshot. No URL means that the default output of the session is used. The max-size is the maximum size of the trace you want to snapshot. The name is used so you can recognize the snapshot once taken and written on disk. Finally, the -s let the user specify a session name. Finally, we allow the snapshot command to be used without an action which basically do "lttng snapshot record". $ lttng snapshot [OPTIONS] OPTIONS: -s, --session NAME -m, --max-size SIZE Maximum bytes size of the snapshot. $ lttng snapshot -s mysession -m 8192 Snapshot the session and puts it in the session define output directory. By default, the snapshot(s) are saved in the session directory in the snapshot/ directory. SESSION_DIR/snapshot/--