Documentation of live usage and protocol
[lttng-tools.git] / doc / live-reading-protocol.txt
CommitLineData
24bc0841
JD
1LTTng Live trace reading protocol
2
3Julien Desfossez
4September 18th, 2013
5
6This document describes the protocol of live trace reading. It is mainly
7intended for trace-viewer developers.
8
9Live trace reading allows a viewer to read safely a LTTng trace while it is
10being recorded. The protocol ensures that the viewer is never in a position
11where it can read for which it does not have the metadata, and also allows to
12viewer to know about inactive streams and skip those up to a certain point in
13time.
14
15This feature is implemented starting at lttng-tools 2.4
16
17* General informations
18All the data structures required to implement this protocole are provided in
19the lttng-viewer.h header. All integer are encoded in big endian during the
20transfer.
21
22Just like the streaming protocol, this protocol works always in only one
23direction : from the viewer to the relay. After each command, the relay sends a
24reply to the viewer (or closes the connection on fatal error).
25
26When the viewer sends a command to the relay, it sends a struct
27lttng_viewer_cmd which contains the command (enum lttcomm_relayd_command) and
28the size of the actual command if the command requires a payload.
29For example, if the viewer wants to list the sessions, it sends a struct
30lttng_viewer_cmd with :
31cmd = htobe32(VIEWER_CONNECT);
32data_size = htobe64(sizeof(struct lttng_viewer_connect));
33
34The cmd_version is currently unused, but might get useful when we extend the
35protocol later.
36
37* Protocol sequence
38In this section, we describe the normal sequence of event during a live-reading
39session. The viewer is abbreviated V and the relay R for conciseness.
40
41Establishing a connection :
42- V connects to R on port TCP/5344
43- V establishes a session by sending a VIEWER_CONNECT command, payload in
44 struct lttng_viewer_connect. In this struct, it sets its major and minor
45 version of the protocol it implements, and the type of connection it wants,
46 for now only VIEWER_CLIENT_COMMAND is supported.
47- If the protocol implemented by V and R are compatible, R sends back the same
48 struct with its own version and the newly assigned viewer_session_id.
49 Protocols are compatible if they have the same major number. At this point,
50 if the communication continues and the minor are not the same, it is implied
51 that the two processes will use the min(minor) of the protocol during this
52 connection. Protocol versions follow lttng-tools version, so if R implements
53 the 2.5 protocol and V implements the 2.4 protocol, R will use the 2.4
54 protocol for this connection.
55
56List the sessions :
57Once V and R agree on a protocol, V can start interacting with R. The first
58thing to do is list the sessions currently active on R.
59- V sends the command VIEWER_LIST_SESSIONS with no payload (data_size ignored)
60- R sends back a struct lttng_viewer_list_sessions which contains the number of
61 sessions to receive, and then for each session (sessions_count), it sends a
62 struct lttng_viewer_session
63- V must first receive the struct lttng_viewer_list_sessions and then receive
64 all the lttng_viewer_session structs. The live_timer corresponds to the value
65 set by the user who created the tracing session, if it is 0, the session
66 cannot be read in live. This timer in microseconds is the minimum rate at
67 which R receives information about the running session. The "clients" field
68 contains the number of connected clients to this session, for now only one
69 client at a time can attach to session.
70
71Attach to a session :
72Now V can select a session and attach to it. In order to do so, it sends the
73command VIEWER_ATTACH_SESSION with the session_id it wants. The "seek"
74parameter allows the viewer to attach to a session from its beginning (it will
75receive all trace data still on the relayd) or from now (data will be available
76to read starting at the next packet received on the relay). Only one session
77can be established by connection. Lots of clock synchronisation issues can
78happen when connecting to multiple sessions from multiple hosts at the same
79time, we let the viewers have fun with it ;-)
80R replies with a struct lttng_viewer_attach_session_response with a status and
81the number of streams currently active in this session. Then, for each stream,
82it sends a struct lttng_viewer_stream. Just like with the session list, V must
83receive the first header and then all the stream structs. The ctf_trace_id
84parameter in the struct lttng_viewer_stream is particularly important since it
85allows the viewer to match all the streams belonging to the same CTF trace (so
86one metadata file and multiple stream files). If the stream is a metadata
87stream, metadata_flag will be set to 1.
88
89#### below needs to be well written, but the essential is here ###
90
91Get metadata :
92A CTF trace cannot be read without the complete metadata.
93Send the command VIEWER_GET_METADATA and the struct lttng_viewer_get_metadata.
94
95Once we have all the metadata, we can start processing the trace. In order to
96do that, we work with the indexes. Whenever we need to read a new packet from a
97stream, we first ask for the next index for this stream and then ask for a
98trace packet at a certain offset and length.
99
100Get the next index :
101Command VIEWER_GET_NEXT_INDEX
102struct lttng_viewer_get_next_index
103Receive back a struct lttng_viewer_index
104
105Get data packet :
106Command VIEWER_GET_PACKET
107struct lttng_viewer_get_packet
108Receive back a struct lttng_viewer_trace_packet
109
110For the VIEWER_GET_NEXT_INDEX and VIEWER_GET_PACKET, the viewer must check the
111"flags" element of the struct it receives, because it contains important
112information such as the information that new metadata must be received before
113being able to receive and read the next packet.
114When new metadata is added during a session, the GET_NEXT_INDEX will succeed
115but it will have the flag LTTNG_VIEWER_FLAG_NEW_METADATA, but the
116GET_DATA_PACKET will fail with the same flag as long as the metadata is not
117downloaded.
This page took 0.026097 seconds and 4 git commands to generate.