1 The LTTng Documentation
2 =======================
3 Philippe Proulx <pproulx@efficios.com>
4 v2.13, 28 November 2023
7 include::../common/copyright.txt[]
10 include::../common/welcome.txt[]
13 include::../common/audience.txt[]
17 === What's in this documentation?
19 The LTTng Documentation is divided into the following sections:
21 * ``**<<nuts-and-bolts,Nuts and bolts>>**'' explains the
22 rudiments of software tracing and the rationale behind the
25 Skip this section if you’re familiar with software tracing and with the
28 * ``**<<installing-lttng,Installation>>**'' describes the steps to
29 install the LTTng packages on common Linux distributions and from
32 Skip this section if you already properly installed LTTng on your target
35 * ``**<<getting-started,Quick start>>**'' is a concise guide to
36 get started quickly with LTTng kernel and user space tracing.
38 We recommend this section if you're new to LTTng or to software tracing
41 Skip this section if you're not new to LTTng.
43 * ``**<<core-concepts,Core concepts>>**'' explains the concepts at
46 It's a good idea to become familiar with the core concepts
47 before attempting to use the toolkit.
49 * ``**<<plumbing,Components of LTTng>>**'' describes the various
50 components of the LTTng machinery, like the daemons, the libraries,
51 and the command-line interface.
53 * ``**<<instrumenting,Instrumentation>>**'' shows different ways to
54 instrument user applications and the Linux kernel for LTTng tracing.
56 Instrumenting source code is essential to provide a meaningful
59 Skip this section if you don't have a programming background.
61 * ``**<<controlling-tracing,Tracing control>>**'' is divided into topics
62 which demonstrate how to use the vast array of features that
63 LTTng{nbsp}{revision} offers.
65 * ``**<<reference,Reference>>**'' contains API reference tables.
67 * ``**<<glossary,Glossary>>**'' is a specialized dictionary of terms
68 related to LTTng or to the field of software tracing.
71 include::../common/convention.txt[]
74 include::../common/acknowledgements.txt[]
78 == What's new in LTTng{nbsp}{revision}?
80 LTTng{nbsp}{revision} bears the name _Nordicité_, the product of a
81 collaboration between https://champlibre.co/[Champ Libre] and
82 https://www.boreale.com/[Boréale]. This farmhouse IPA is brewed with
83 https://en.wikipedia.org/wiki/Kveik[Kveik] yeast and Québec-grown
84 barley, oats, and juniper branches. The result is a remarkable, fruity,
85 hazy golden IPA that offers a balanced touch of resinous and woodsy
88 New features and changes in LTTng{nbsp}{revision}:
92 * The LTTng trigger API of <<liblttng-ctl-lttng,`liblttng-ctl`>> now
93 offers the ``__event rule matches__'' condition (an <<event-rule,event
94 rule>> matches an event) as well as the following new actions:
97 * <<basic-tracing-session-control,Start or stop>> a recording session.
98 * <<session-rotation,Archive the current trace chunk>> of a
99 recording session (rotate).
100 * <<taking-a-snapshot,Take a snapshot>> of a recording session.
103 As a reminder, a <<trigger,trigger>> is a condition-actions pair. When
104 the condition of a trigger is satisfied, LTTng attempts to execute its
107 This feature is also available with the new man:lttng-add-trigger(1),
108 man:lttng-remove-trigger(1), and man:lttng-list-triggers(1)
109 <<lttng-cli,cmd:lttng>> commands.
111 Starting from LTTng{nbsp}{revision}, a trigger may have more than one
114 See “<<add-event-rule-matches-trigger,Add an ``event rule matches''
115 trigger to a session daemon>>” to learn more.
117 * The LTTng <<lttng-ust,user space>> and <<lttng-modules,kernel>>
118 tracers offer the new namespace context field `time_ns`, which is the
119 inode number, in the proc file system, of the current clock namespace.
121 See man:lttng-add-context(1), man:lttng-ust(3), and
122 man:time_namespaces(7).
124 * The link:/man[manual pages] of LTTng-tools now have a terminology and
125 style which match the LTTng Documentation, many fixes, more internal
126 and manual page links, clearer lists and procedures, superior
127 consistency, and usage examples.
129 The new man:lttng-event-rule(7) manual page explains the new, common
130 way to specify an event rule on the command line.
132 The new man:lttng-concepts(7) manual page explains the core concepts of
133 LTTng. Its contents is essentially the ``<<core-concepts,Core
134 concepts>>'' section of this documentation, but more adapted to the
141 The major version part of the `liblttng-ust`
142 https://en.wikipedia.org/wiki/Soname[soname] is bumped, which means you
143 **must recompile** your instrumented applications/libraries and
144 <<tracepoint-provider,tracepoint provider packages>> to use
145 LTTng-UST{nbsp}{revision}.
147 This change became a necessity to clean up the library and for
148 `liblttng-ust` to stop exporting private symbols.
150 Also, LTTng{nbsp}{revision} prepends the `lttng_ust_` and `LTTNG_UST_`
151 prefix to all public macro/definition/function names to offer a
152 consistent API namespace. The LTTng{nbsp}2.12 API is still available;
153 see the ``Compatibility with previous APIs'' section of
157 Other notable changes:
159 * The `liblttng-ust` C{nbsp}API offers the new man:lttng_ust_vtracef(3)
160 and man:lttng_ust_vtracelog(3) macros which are to
161 man:lttng_ust_tracef(3) and man:lttng_ust_tracelog(3) what
162 man:vprintf(3) is to man:printf(3).
164 * LTTng-UST now only depends on https://liburcu.org/[`liburcu`] at build
165 time, not at run time.
169 * The preferred display base of event record integer fields which
170 contain memory addresses is now hexadecimal instead of decimal.
172 * The `pid` field is removed from `lttng_statedump_file_descriptor`
173 event records and the `file_table_address` field is added.
175 This new field is the address of the `files_struct` structure which
176 contains the file descriptor.
179 ``https://github.com/lttng/lttng-modules/commit/e7a0ca7205fd4be7c829d171baa8823fe4784c90[statedump: introduce `file_table_address`]''
182 * The `flags` field of `syscall_entry_clone` event records is now a
183 structure containing two enumerations (exit signal and options).
185 This change makes the flag values more readable and meaningful.
188 ``https://github.com/lttng/lttng-modules/commit/d775625e2ba4825b73b5897e7701ad6e2bdba115[syscalls: Make `clone()`'s `flags` field a 2 enum struct]''
191 * The memory footprint of the kernel tracer is improved: the latter only
192 generates metadata for the specific system call recording event rules
193 that you <<enabling-disabling-events,create>>.
199 What is LTTng? As its name suggests, the _Linux Trace Toolkit: next
200 generation_ is a modern toolkit for tracing Linux systems and
201 applications. So your first question might be:
208 As the history of software engineering progressed and led to what
209 we now take for granted--complex, numerous and
210 interdependent software applications running in parallel on
211 sophisticated operating systems like Linux--the authors of such
212 components, software developers, began feeling a natural
213 urge to have tools that would ensure the robustness and good performance
214 of their masterpieces.
216 One major achievement in this field is, inarguably, the
217 https://www.gnu.org/software/gdb/[GNU debugger (GDB)],
218 an essential tool for developers to find and fix bugs. But even the best
219 debugger won't help make your software run faster, and nowadays, faster
220 software means either more work done by the same hardware, or cheaper
221 hardware for the same work.
223 A _profiler_ is often the tool of choice to identify performance
224 bottlenecks. Profiling is suitable to identify _where_ performance is
225 lost in a given piece of software. The profiler outputs a profile, a
226 statistical summary of observed events, which you may use to discover
227 which functions took the most time to execute. However, a profiler won't
228 report _why_ some identified functions are the bottleneck. Bottlenecks
229 might only occur when specific conditions are met, conditions that are
230 sometimes impossible to capture by a statistical profiler, or impossible
231 to reproduce with an application altered by the overhead of an
232 event-based profiler. For a thorough investigation of software
233 performance issues, a history of execution is essential, with the
234 recorded values of variables and context fields you choose, and with as
235 little influence as possible on the instrumented application. This is
236 where tracing comes in handy.
238 _Tracing_ is a technique used to understand what goes on in a running
239 software system. The piece of software used for tracing is called a
240 _tracer_, which is conceptually similar to a tape recorder. When
241 recording, specific instrumentation points placed in the software source
242 code generate events that are saved on a giant tape: a _trace_ file. You
243 can record user application and operating system events at the same
244 time, opening the possibility of resolving a wide range of problems that
245 would otherwise be extremely challenging.
247 Tracing is often compared to _logging_. However, tracers and loggers are
248 two different tools, serving two different purposes. Tracers are
249 designed to record much lower-level events that occur much more
250 frequently than log messages, often in the range of thousands per
251 second, with very little execution overhead. Logging is more appropriate
252 for a very high-level analysis of less frequent events: user accesses,
253 exceptional conditions (errors and warnings, for example), database
254 transactions, instant messaging communications, and such. Simply put,
255 logging is one of the many use cases that can be satisfied with tracing.
257 The list of recorded events inside a trace file can be read manually
258 like a log file for the maximum level of detail, but it's generally
259 much more interesting to perform application-specific analyses to
260 produce reduced statistics and graphs that are useful to resolve a
261 given problem. Trace viewers and analyzers are specialized tools
264 In the end, this is what LTTng is: a powerful, open source set of
265 tools to trace the Linux kernel and user applications at the same time.
266 LTTng is composed of several components actively maintained and
267 developed by its link:/community/#where[community].
270 [[lttng-alternatives]]
271 === Alternatives to noch:{LTTng}
273 Excluding proprietary solutions, a few competing software tracers
276 https://github.com/dtrace4linux/linux[dtrace4linux]::
277 A port of Sun Microsystems' DTrace to Linux.
279 The cmd:dtrace tool interprets user scripts and is responsible for
280 loading code into the Linux kernel for further execution and collecting
283 https://en.wikipedia.org/wiki/Berkeley_Packet_Filter[eBPF]::
284 A subsystem in the Linux kernel in which a virtual machine can
285 execute programs passed from the user space to the kernel.
287 You can attach such programs to tracepoints and kprobes thanks to a
288 system call, and they can output data to the user space when executed
289 thanks to different mechanisms (pipe, VM register values, and eBPF maps,
292 https://www.kernel.org/doc/Documentation/trace/ftrace.txt[ftrace]::
293 The de facto function tracer of the Linux kernel.
295 Its user interface is a set of special files in sysfs.
297 https://perf.wiki.kernel.org/[perf]::
298 A performance analysis tool for Linux which supports hardware
299 performance counters, tracepoints, as well as other counters and
302 The controlling utility of perf is the cmd:perf command line/text UI
305 https://linux.die.net/man/1/strace[strace]::
306 A command-line utility which records system calls made by a
307 user process, as well as signal deliveries and changes of process
310 strace makes use of https://en.wikipedia.org/wiki/Ptrace[ptrace] to
311 fulfill its function.
313 https://www.sysdig.org/[sysdig]::
314 Like SystemTap, uses scripts to analyze Linux kernel events.
316 You write scripts, or _chisels_ in the jargon of sysdig, in Lua and
317 sysdig executes them while it traces the system or afterwards. The
318 interface of sysdig is the cmd:sysdig command-line tool as well as the
319 text UI-based cmd:csysdig tool.
321 https://sourceware.org/systemtap/[SystemTap]::
322 A Linux kernel and user space tracer which uses custom user scripts
323 to produce plain text traces.
325 SystemTap converts the scripts to the C language, and then compiles them
326 as Linux kernel modules which are loaded to produce trace data. The
327 primary user interface of SystemTap is the cmd:stap command-line tool.
329 The main distinctive features of LTTng is that it produces correlated
330 kernel and user space traces, as well as doing so with the lowest
331 overhead amongst other solutions. It produces trace files in the
332 https://diamon.org/ctf[CTF] format, a file format optimized
333 for the production and analyses of multi-gigabyte data.
335 LTTng is the result of more than 10{nbsp}years of active open source
336 development by a community of passionate developers. LTTng is currently
337 available on major desktop and server Linux distributions.
339 The main interface for tracing control is a single command-line tool
340 named cmd:lttng. The latter can create several recording sessions, enable
341 and disable recording event rules on the fly, filter events efficiently
342 with custom user expressions, start and stop tracing, and much more.
343 LTTng can write the traces on the file system or send them over the
344 network, and keep them totally or partially. You can make LTTng execute
345 user-defined actions when LTTng emits an event. You can view the traces
346 once tracing becomes inactive or as LTTng records events.
348 <<installing-lttng,Install LTTng now>> and
349 <<getting-started,start tracing>>!
355 **LTTng** is a set of software <<plumbing,components>> which interact to
356 <<instrumenting,instrument>> the Linux kernel and user applications, and
357 to <<controlling-tracing,control tracing>> (start and stop
358 recording, create recording event rules, and the rest). Those
359 components are bundled into the following packages:
362 Libraries and command-line interface to control tracing.
365 Linux kernel modules to instrument and trace the kernel.
368 Libraries and Java/Python packages to instrument and trace user
371 Most distributions mark the LTTng-modules and LTTng-UST packages as
372 optional when installing LTTng-tools (which is always required). In the
373 following sections, we always provide the steps to install all three,
376 * You only need to install LTTng-modules if you intend to use
377 the Linux kernel LTTng tracer.
379 * You only need to install LTTng-UST if you intend to use the user
383 .Availability of LTTng{nbsp}{revision} for major Linux distributions as of 17{nbsp}October{nbsp}2023.
386 |Distribution |Available in releases
388 |https://www.ubuntu.com/[Ubuntu]
389 |xref:ubuntu[Ubuntu 22.04 LTS _Jammy Jellyfish_, Ubuntu 23.04 _Lunar Lobster_, and Ubuntu 23.10 _Mantic Minotaur_].
391 Ubuntu{nbsp}18.04 LTS _Bionic Beaver_ and Ubuntu{nbsp}20.04 LTS _Focal Fossa_:
392 <<ubuntu-ppa,use the LTTng Stable{nbsp}{revision} PPA>>.
394 |https://www.debian.org/[Debian]
395 |<<debian,Debian{nbsp}12 _bookworm_>>.
397 |https://getfedora.org/[Fedora]
398 |xref:fedora[Fedora{nbsp}37, Fedora{nbsp}38, and Fedora{nbsp}39].
400 |https://www.archlinux.org/[Arch Linux]
401 |<<arch-linux,_extra_ repository and AUR>>.
403 |https://alpinelinux.org/[Alpine Linux]
404 |xref:alpine-linux[Alpine Linux{nbsp}3.16, Alpine Linux{nbsp}3.17, and Alpine Linux{nbsp}3.18].
406 |https://buildroot.org/[Buildroot]
407 |xref:buildroot[Buildroot{nbsp}2022.02, Buildroot{nbsp}2022.05,
408 Buildroot{nbsp}2022.08, Buildroot{nbsp}2022.11, Buildroot{nbsp}2023.02,
409 Buildroot{nbsp}2023.05, and Buildroot{nbsp}2023.08].
411 |https://www.openembedded.org/wiki/Main_Page[OpenEmbedded] and
412 https://www.yoctoproject.org/[Yocto]
413 |xref:oe-yocto[Yocto Project{nbsp}3.3 _Honister_, Yocto Project{nbsp}4.0 _Kirkstone_,
414 Yocto Project{nbsp}4.1 _Langdale_, Yocto Project{nbsp}4.2 _Mickledore_, and
415 Yocto Project{nbsp}4.3 _Nanbield_].
421 For https://www.redhat.com/[RHEL] and https://www.suse.com/[SLES]
422 packages, see https://packages.efficios.com/[EfficiOS Enterprise
425 For other distributions, <<building-from-source,build LTTng from
430 === [[ubuntu-official-repository]]Ubuntu
432 LTTng{nbsp}{revision} is available on Ubuntu 22.04 LTS _Jammy Jellyfish_, Ubuntu 23.04 _Lunar Lobster_, and Ubuntu 23.10 _Mantic Minotaur_. For previous supported releases of Ubuntu, <<ubuntu-ppa,use the LTTng Stable{nbsp}{revision} PPA>>.
434 To install LTTng{nbsp}{revision} on Ubuntu{nbsp}22.04 LTS _Jammy Jellyfish_:
436 . Install the main LTTng{nbsp}{revision} packages:
441 # apt-get install lttng-tools
442 # apt-get install lttng-modules-dkms
443 # apt-get install liblttng-ust-dev
447 . **If you need to instrument and trace <<java-application,Java applications>>**,
448 install the LTTng-UST Java agent:
453 # apt-get install liblttng-ust-agent-java
457 . **If you need to instrument and trace <<python-application,Python{nbsp}3
458 applications>>**, install the LTTng-UST Python agent:
463 # apt-get install python3-lttngust
468 === Ubuntu: noch:{LTTng} Stable {revision} PPA
470 The https://launchpad.net/~lttng/+archive/ubuntu/stable-{revision}[LTTng
471 Stable{nbsp}{revision} PPA] offers the latest stable LTTng{nbsp}{revision}
472 packages for Ubuntu{nbsp}18.04 LTS _Bionic Beaver_, Ubuntu{nbsp}20.04 LTS _Focal Fossa_,
473 and Ubuntu{nbsp}22.04 LTS _Jammy Jellyfish_.
475 To install LTTng{nbsp}{revision} from the LTTng Stable{nbsp}{revision}
478 . Add the LTTng Stable{nbsp}{revision} PPA repository and update the
482 [role="term",subs="attributes"]
484 # apt-add-repository ppa:lttng/stable-{revision}
489 . Install the main LTTng{nbsp}{revision} packages:
494 # apt-get install lttng-tools
495 # apt-get install lttng-modules-dkms
496 # apt-get install liblttng-ust-dev
500 . **If you need to instrument and trace
501 <<java-application,Java applications>>**, install the LTTng-UST
507 # apt-get install liblttng-ust-agent-java
511 . **If you need to instrument and trace
512 <<python-application,Python{nbsp}3 applications>>**, install the
513 LTTng-UST Python agent:
518 # apt-get install python3-lttngust
525 To install LTTng{nbsp}{revision} on Debian{nbsp}12 _bookworm_:
527 . Install the main LTTng{nbsp}{revision} packages:
532 # apt install lttng-modules-dkms
533 # apt install liblttng-ust-dev
534 # apt install lttng-tools
538 . **If you need to instrument and trace <<java-application,Java
539 applications>>**, install the LTTng-UST Java agent:
544 # apt install liblttng-ust-agent-java
548 . **If you need to instrument and trace <<python-application,Python
549 applications>>**, install the LTTng-UST Python agent:
554 # apt install python3-lttngust
561 To install LTTng{nbsp}{revision} on Fedora{nbsp}37, Fedora{nbsp}38, or
564 . Install the LTTng-tools{nbsp}{revision} and LTTng-UST{nbsp}{revision}
570 # yum install lttng-tools
571 # yum install lttng-ust
575 . Download, build, and install the latest LTTng-modules{nbsp}{revision}:
578 [role="term",subs="attributes,specialcharacters"]
581 wget http://lttng.org/files/lttng-modules/lttng-modules-latest-{revision}.tar.bz2 &&
582 tar -xf lttng-modules-latest-{revision}.tar.bz2 &&
583 cd lttng-modules-{revision}.* &&
585 sudo make modules_install &&
591 .Java and Python application instrumentation and tracing
593 If you need to instrument and trace <<java-application,Java
594 applications>> on Fedora, you need to build and install
595 LTTng-UST{nbsp}{revision} <<building-from-source,from source>> and pass
596 the `--enable-java-agent-jul`, `--enable-java-agent-log4j`, or
597 `--enable-java-agent-all` options to the `configure` script, depending
598 on which Java logging framework you use.
600 If you need to instrument and trace <<python-application,Python
601 applications>> on Fedora, you need to build and install
602 LTTng-UST{nbsp}{revision} from source and pass the
603 `--enable-python-agent` option to the `configure` script.
610 LTTng-UST{nbsp}{revision} is available in the _extra_
611 repository of Arch Linux, while LTTng-tools{nbsp}{revision} and
612 LTTng-modules{nbsp}{revision} are available in the
613 https://aur.archlinux.org/[AUR].
615 To install LTTng{nbsp}{revision} on Arch Linux, using
616 https://github.com/Jguer/yay[yay] for the AUR packages:
618 . Install the main LTTng{nbsp}{revision} packages:
623 # pacman -Sy lttng-ust
624 $ yay -Sy lttng-tools
625 $ yay -Sy lttng-modules
629 . **If you need to instrument and trace <<python-application,Python
630 applications>>**, install the LTTng-UST Python agent:
635 # pacman -Sy python-lttngust
643 To install LTTng-tools{nbsp}{revision} and LTTng-UST{nbsp}{revision} on
644 Alpine Linux{nbsp}3.16, Alpine Linux{nbsp}3.17, or Alpine Linux{nbsp}3.18:
646 . Add the LTTng packages:
651 # apk add lttng-tools
652 # apk add lttng-ust-dev
656 . Download, build, and install the latest LTTng-modules{nbsp}{revision}:
659 [role="term",subs="attributes,specialcharacters"]
662 wget http://lttng.org/files/lttng-modules/lttng-modules-latest-{revision}.tar.bz2 &&
663 tar -xf lttng-modules-latest-{revision}.tar.bz2 &&
664 cd lttng-modules-{revision}.* &&
666 sudo make modules_install &&
675 To install LTTng{nbsp}{revision} on Buildroot{nbsp}2022.02, Buildroot{nbsp}2022.05,
676 Buildroot{nbsp}2022.08, Buildroot{nbsp}2022.11, Buildroot{nbsp}2023.02,
677 Buildroot{nbsp}2023.05, or Buildroot{nbsp}2023.08:
679 . Launch the Buildroot configuration tool:
688 . In **Kernel**, check **Linux kernel**.
689 . In **Toolchain**, check **Enable WCHAR support**.
690 . In **Target packages**{nbsp}→ **Debugging, profiling and benchmark**,
691 check **lttng-modules** and **lttng-tools**.
692 . In **Target packages**{nbsp}→ **Libraries**{nbsp}→
693 **Other**, check **lttng-libust**.
697 === OpenEmbedded and Yocto
699 LTTng{nbsp}{revision} recipes are available in the
700 https://layers.openembedded.org/layerindex/branch/master/layer/openembedded-core/[`openembedded-core`]
701 layer for Yocto Project{nbsp}3.3 _Honister_, Yocto Project{nbsp}4.0 _Kirkstone_,
702 Yocto Project{nbsp}4.1 _Langdale_, Yocto Project{nbsp}4.2 _Mickledore_, and
703 Yocto Project{nbsp}4.3 _Nanbield_ under the following names:
709 With BitBake, the simplest way to include LTTng recipes in your target
710 image is to add them to `IMAGE_INSTALL_append` in path:{conf/local.conf}:
713 IMAGE_INSTALL_append = " lttng-tools lttng-modules lttng-ust"
718 . Select a machine and an image recipe.
719 . Click **Edit image recipe**.
720 . Under the **All recipes** tab, search for **lttng**.
721 . Check the desired LTTng recipes.
724 [[building-from-source]]
725 === Build from source
727 To build and install LTTng{nbsp}{revision} from source:
729 . Using the package manager of your distribution, or from source,
730 install the following dependencies of LTTng-tools and LTTng-UST:
733 * https://sourceforge.net/projects/libuuid/[libuuid]
734 * https://directory.fsf.org/wiki/Popt[popt]
735 * https://liburcu.org/[Userspace RCU]
736 * http://www.xmlsoft.org/[libxml2]
737 * **Optional**: https://github.com/numactl/numactl[numactl]
740 . Download, build, and install the latest LTTng-modules{nbsp}{revision}:
746 wget https://lttng.org/files/lttng-modules/lttng-modules-latest-2.13.tar.bz2 &&
747 tar -xf lttng-modules-latest-2.13.tar.bz2 &&
748 cd lttng-modules-2.13.* &&
750 sudo make modules_install &&
755 . Download, build, and install the latest LTTng-UST{nbsp}{revision}:
761 wget https://lttng.org/files/lttng-ust/lttng-ust-latest-2.13.tar.bz2 &&
762 tar -xf lttng-ust-latest-2.13.tar.bz2 &&
763 cd lttng-ust-2.13.* &&
771 Add `--disable-numa` to `./configure` if you don't have
772 https://github.com/numactl/numactl[numactl].
776 .Java and Python application tracing
778 If you need to instrument and have LTTng trace <<java-application,Java
779 applications>>, pass the `--enable-java-agent-jul`,
780 `--enable-java-agent-log4j`, or `--enable-java-agent-all` options to the
781 `configure` script, depending on which Java logging framework you use.
783 If you need to instrument and have LTTng trace
784 <<python-application,Python applications>>, pass the
785 `--enable-python-agent` option to the `configure` script. You can set
786 the env:PYTHON environment variable to the path to the Python interpreter
787 for which to install the LTTng-UST Python agent package.
794 By default, LTTng-UST libraries are installed to
795 dir:{/usr/local/lib}, which is the de facto directory in which to
796 keep self-compiled and third-party libraries.
798 When <<building-tracepoint-providers-and-user-application,linking an
799 instrumented user application with `liblttng-ust`>>:
801 * Append `/usr/local/lib` to the env:LD_LIBRARY_PATH environment
804 * Pass the `-L/usr/local/lib` and `-Wl,-rpath,/usr/local/lib` options to
805 man:gcc(1), man:g++(1), or man:clang(1).
809 . Download, build, and install the latest LTTng-tools{nbsp}{revision}:
815 wget https://lttng.org/files/lttng-tools/lttng-tools-latest-2.13.tar.bz2 &&
816 tar -xf lttng-tools-latest-2.13.tar.bz2 &&
817 cd lttng-tools-2.13.* &&
825 TIP: The https://github.com/eepp/vlttng[vlttng tool] can do all the
826 previous steps automatically for a given version of LTTng and confine
827 the installed files to a specific directory. This can be useful to try
828 LTTng without installing it on your system.
831 === Linux kernel module signature
833 Linux kernel modules require trusted signatures in order to be loaded
834 when any of the following is true:
836 * The system boots with
837 https://uefi.org/specs/UEFI/2.10/32_Secure_Boot_and_Driver_Signing.html#secure-boot-and-driver-signing[Secure Boot]
840 * The Linux kernel which boots is configured with
841 `CONFIG_MODULE_SIG_FORCE`.
843 * The Linux kernel boots with a command line containing
844 `module.sig_enforce=1`.
846 .`root` user running <<lttng-sessiond,`lttng-sessiond`>> which fails to load a required <<lttng-modules,kernel module>> due to the signature enforcement policies.
851 Warning: No tracing group detected
852 modprobe: ERROR: could not insert 'lttng_ring_buffer_client_discard': Key was rejected by service
853 Error: Unable to load required module lttng-ring-buffer-client-discard
854 Warning: No kernel tracer available
858 There are several methods to enroll trusted keys for signing modules
859 that are built from source. The precise details vary from one Linux
860 version to another, and distributions may have their own mechanisms. For
861 example, https://github.com/dell/dkms[DKMS] may autogenerate a key and
862 sign modules, but the key isn't automatically enrolled.
865 https://www.kernel.org/doc/html/latest/admin-guide/module-signing.html[Kernel
866 module signing facility] and the documentation of your distribution
867 to learn more about signing Linux kernel modules.
872 This is a short guide to get started quickly with LTTng kernel and user
875 Before you follow this guide, make sure to <<installing-lttng,install>>
878 This tutorial walks you through the steps to:
880 . <<tracing-the-linux-kernel,Record Linux kernel events>>.
882 . <<tracing-your-own-user-application,Record the events of a user
883 application>> written in C.
885 . <<viewing-and-analyzing-your-traces,View and analyze the
889 [[tracing-the-linux-kernel]]
890 === Record Linux kernel events
892 NOTE: The following command lines start with the `#` prompt because you
893 need root privileges to control the Linux kernel LTTng tracer. You can
894 also control the kernel tracer as a regular user if your Unix user is a
895 member of the <<tracing-group,tracing group>>.
897 . Create a <<tracing-session,recording session>> to write LTTng traces
898 to dir:{/tmp/my-kernel-trace}:
903 # lttng create my-kernel-session --output=/tmp/my-kernel-trace
907 . List the available kernel tracepoints and system calls:
912 # lttng list --kernel
913 # lttng list --kernel --syscall
917 . Create <<event,recording event rules>> which match events having
918 the desired names, for example the `sched_switch` and
919 `sched_process_fork` tracepoints, and the man:open(2) and man:close(2)
925 # lttng enable-event --kernel sched_switch,sched_process_fork
926 # lttng enable-event --kernel --syscall open,close
930 Create a recording event rule which matches _all_ the Linux kernel
931 tracepoint events with the opt:lttng-enable-event(1):--all option
932 (recording with such a recording event rule generates a lot of data):
937 # lttng enable-event --kernel --all
941 . <<basic-tracing-session-control,Start recording>>:
950 . Do some operation on your system for a few seconds. For example,
951 load a website, or list the files of a directory.
953 . <<creating-destroying-tracing-sessions,Destroy>> the current
963 The man:lttng-destroy(1) command doesn't destroy the trace data; it
964 only destroys the state of the recording session.
966 The man:lttng-destroy(1) command also runs the man:lttng-stop(1) command
967 implicitly (see ``<<basic-tracing-session-control,Start and stop a
968 recording session>>''). You need to stop recording to make LTTng flush
969 the remaining trace data and make the trace readable.
971 . For the sake of this example, make the recorded trace accessible to
977 # chown -R $(whoami) /tmp/my-kernel-trace
981 See ``<<viewing-and-analyzing-your-traces,View and analyze the
982 recorded events>>'' to view the recorded events.
985 [[tracing-your-own-user-application]]
986 === Record user application events
988 This section walks you through a simple example to record the events of
989 a _Hello world_ program written in{nbsp}C.
991 To create the traceable user application:
993 . Create the tracepoint provider header file, which defines the
994 tracepoints and the events they can generate:
1000 #undef LTTNG_UST_TRACEPOINT_PROVIDER
1001 #define LTTNG_UST_TRACEPOINT_PROVIDER hello_world
1003 #undef LTTNG_UST_TRACEPOINT_INCLUDE
1004 #define LTTNG_UST_TRACEPOINT_INCLUDE "./hello-tp.h"
1006 #if !defined(_HELLO_TP_H) || defined(LTTNG_UST_TRACEPOINT_HEADER_MULTI_READ)
1009 #include <lttng/tracepoint.h>
1011 LTTNG_UST_TRACEPOINT_EVENT(
1013 my_first_tracepoint,
1015 int, my_integer_arg,
1016 char *, my_string_arg
1018 LTTNG_UST_TP_FIELDS(
1019 lttng_ust_field_string(my_string_field, my_string_arg)
1020 lttng_ust_field_integer(int, my_integer_field, my_integer_arg)
1024 #endif /* _HELLO_TP_H */
1026 #include <lttng/tracepoint-event.h>
1030 . Create the tracepoint provider package source file:
1036 #define LTTNG_UST_TRACEPOINT_CREATE_PROBES
1037 #define LTTNG_UST_TRACEPOINT_DEFINE
1039 #include "hello-tp.h"
1043 . Build the tracepoint provider package:
1048 $ gcc -c -I. hello-tp.c
1052 . Create the _Hello World_ application source file:
1059 #include "hello-tp.h"
1061 int main(int argc, char *argv[])
1065 puts("Hello, World!\nPress Enter to continue...");
1068 * The following getchar() call only exists for the purpose of this
1069 * demonstration, to pause the application in order for you to have
1070 * time to list its tracepoints. You don't need it otherwise.
1075 * An lttng_ust_tracepoint() call.
1077 * Arguments, as defined in `hello-tp.h`:
1079 * 1. Tracepoint provider name (required)
1080 * 2. Tracepoint name (required)
1081 * 3. `my_integer_arg` (first user-defined argument)
1082 * 4. `my_string_arg` (second user-defined argument)
1084 * Notice the tracepoint provider and tracepoint names are
1085 * C identifiers, NOT strings: they're in fact parts of variables
1086 * that the macros in `hello-tp.h` create.
1088 lttng_ust_tracepoint(hello_world, my_first_tracepoint, 23,
1091 for (i = 0; i < argc; i++) {
1092 lttng_ust_tracepoint(hello_world, my_first_tracepoint,
1096 puts("Quitting now!");
1097 lttng_ust_tracepoint(hello_world, my_first_tracepoint,
1104 . Build the application:
1113 . Link the application with the tracepoint provider package,
1114 `liblttng-ust` and `libdl`:
1119 $ gcc -o hello hello.o hello-tp.o -llttng-ust -ldl
1123 Here's the whole build process:
1126 .Build steps of the user space tracing tutorial.
1127 image::ust-flow.png[]
1129 To record the events of the user application:
1131 . Run the application with a few arguments:
1136 $ ./hello world and beyond
1145 Press Enter to continue...
1149 . Start an LTTng <<lttng-sessiond,session daemon>>:
1154 $ lttng-sessiond --daemonize
1158 NOTE: A session daemon might already be running, for example as a
1159 service that the service manager of your distribution started.
1161 . List the available user space tracepoints:
1166 $ lttng list --userspace
1170 You see the `hello_world:my_first_tracepoint` tracepoint listed
1171 under the `./hello` process.
1173 . Create a <<tracing-session,recording session>>:
1178 $ lttng create my-user-space-session
1182 . Create a <<event,recording event rule>> which matches user space
1183 tracepoint events named `hello_world:my_first_tracepoint`:
1188 $ lttng enable-event --userspace hello_world:my_first_tracepoint
1192 . <<basic-tracing-session-control,Start recording>>:
1201 . Go back to the running `hello` application and press **Enter**.
1203 The program executes all `lttng_ust_tracepoint()` instrumentation
1204 points, emitting events as the event rule you created in step{nbsp}5
1208 . <<creating-destroying-tracing-sessions,Destroy>> the current
1218 The man:lttng-destroy(1) command doesn't destroy the trace data; it
1219 only destroys the state of the recording session.
1221 The man:lttng-destroy(1) command also runs the man:lttng-stop(1) command
1222 implicitly (see ``<<basic-tracing-session-control,Start and stop a
1223 recording session>>''). You need to stop recording to make LTTng flush
1224 the remaining trace data and make the trace readable.
1226 By default, LTTng saves the traces to the
1227 +$LTTNG_HOME/lttng-traces/__NAME__-__DATE__-__TIME__+ directory, where
1228 +__NAME__+ is the recording session name. The env:LTTNG_HOME environment
1229 variable defaults to `$HOME` if not set.
1232 [[viewing-and-analyzing-your-traces]]
1233 === View and analyze the recorded events
1235 Once you have completed the <<tracing-the-linux-kernel,Record Linux
1236 kernel events>> and <<tracing-your-own-user-application,Record user
1237 application events>> tutorials, you can inspect the recorded events.
1239 There are many tools you can use to read LTTng traces:
1241 https://babeltrace.org/[Babeltrace{nbsp}2]::
1242 A rich, flexible trace manipulation toolkit which includes
1243 a versatile command-line interface
1244 (man:babeltrace2(1)),
1245 a https://babeltrace.org/docs/v2.0/libbabeltrace2/[C{nbsp}library],
1246 and https://babeltrace.org/docs/v2.0/python/bt2/[Python{nbsp}3 bindings]
1247 so that you can easily process or convert an LTTng trace with
1250 The Babeltrace{nbsp}2 project ships with a plugin
1251 (man:babeltrace2-plugin-ctf(7)) which supports the format of the traces
1252 which LTTng produces, https://diamon.org/ctf/[CTF].
1254 http://tracecompass.org/[Trace Compass]::
1255 A graphical user interface for viewing and analyzing any type of
1256 logs or traces, including those of LTTng.
1258 https://github.com/lttng/lttng-analyses[LTTng analyses]::
1259 An experimental project which includes many high-level analyses of
1260 LTTng kernel traces, like scheduling statistics, interrupt
1261 frequency distribution, top CPU usage, and more.
1263 NOTE: This section assumes that LTTng wrote the traces it recorded
1264 during the previous tutorials to their default location, in the
1265 dir:{$LTTNG_HOME/lttng-traces} directory. The env:LTTNG_HOME
1266 environment variable defaults to `$HOME` if not set.
1269 [[viewing-and-analyzing-your-traces-bt]]
1270 ==== Use the cmd:babeltrace2 command-line tool
1272 The simplest way to list all the recorded events of an LTTng trace is to
1273 pass its path to man:babeltrace2(1), without options:
1277 $ babeltrace2 ~/lttng-traces/my-user-space-session*
1280 The cmd:babeltrace2 command finds all traces recursively within the
1281 given path and prints all their events, sorting them chronologically.
1283 Pipe the output of cmd:babeltrace2 into a tool like man:grep(1) for
1288 $ babeltrace2 /tmp/my-kernel-trace | grep _switch
1291 Pipe the output of cmd:babeltrace2 into a tool like man:wc(1) to count
1292 the recorded events:
1296 $ babeltrace2 /tmp/my-kernel-trace | grep _open | wc --lines
1300 [[viewing-and-analyzing-your-traces-bt-python]]
1301 ==== Use the Babeltrace{nbsp}2 Python bindings
1303 The <<viewing-and-analyzing-your-traces-bt,text output of
1304 cmd:babeltrace2>> is useful to isolate event records by simple matching
1305 using man:grep(1) and similar utilities. However, more elaborate
1306 filters, such as keeping only event records with a field value falling
1307 within a specific range, are not trivial to write using a shell.
1308 Moreover, reductions and even the most basic computations involving
1309 multiple event records are virtually impossible to implement.
1311 Fortunately, Babeltrace{nbsp}2 ships with
1312 https://babeltrace.org/docs/v2.0/python/bt2/[Python{nbsp}3 bindings]
1313 which make it easy to read the event records of an LTTng trace
1314 sequentially and compute the desired information.
1316 The following script accepts an LTTng Linux kernel trace path as its
1317 first argument and prints the short names of the top five running
1318 processes on CPU{nbsp}0 during the whole trace:
1329 # Get the trace path from the first command-line argument
1330 it = bt2.TraceCollectionMessageIterator(sys.argv[1])
1332 # This counter dictionary will hold execution times:
1334 # Task command name -> Total execution time (ns)
1335 exec_times = collections.Counter()
1337 # This holds the last `sched_switch` timestamp
1341 # We only care about event messages
1342 if type(msg) is not bt2._EventMessageConst:
1345 # Event of the event message
1348 # Keep only `sched_switch` events
1349 if event.cls.name != 'sched_switch':
1352 # Keep only records of events which LTTng emitted from CPU 0
1353 if event.packet.context_field['cpu_id'] != 0:
1356 # Event timestamp (ns)
1357 cur_ts = msg.default_clock_snapshot.ns_from_origin
1363 # (Short) name of the previous task command
1364 prev_comm = str(event.payload_field['prev_comm'])
1366 # Initialize an entry in our dictionary if not done yet
1367 if prev_comm not in exec_times:
1368 exec_times[prev_comm] = 0
1370 # Compute previous command execution time
1371 diff = cur_ts - last_ts
1373 # Update execution time of this command
1374 exec_times[prev_comm] += diff
1376 # Update last timestamp
1380 for name, ns in exec_times.most_common(5):
1381 print('{:20}{} s'.format(name, ns / 1e9))
1384 if __name__ == '__main__':
1392 $ python3 top5proc.py /tmp/my-kernel-trace/kernel
1398 swapper/0 48.607245889 s
1399 chromium 7.192738188 s
1400 pavucontrol 0.709894415 s
1401 Compositor 0.660867933 s
1402 Xorg.bin 0.616753786 s
1405 Note that `swapper/0` is the ``idle'' process of CPU{nbsp}0 on Linux;
1406 since we weren't using the CPU that much when recording, its first
1407 position in the list makes sense.
1411 == [[understanding-lttng]]Core concepts
1413 From a user's perspective, the LTTng system is built on a few concepts,
1414 or objects, on which the <<lttng-cli,cmd:lttng command-line tool>>
1415 operates by sending commands to the <<lttng-sessiond,session daemon>>
1416 (through <<liblttng-ctl-lttng,`liblttng-ctl`>>).
1418 Understanding how those objects relate to each other is key to master
1421 The core concepts of LTTng are:
1423 * <<"event-rule","Instrumentation point, event rule, and event">>
1424 * <<trigger,Trigger>>
1425 * <<tracing-session,Recording session>>
1426 * <<domain,Tracing domain>>
1427 * <<channel,Channel and ring buffer>>
1428 * <<event,Recording event rule and event record>>
1430 NOTE: The man:lttng-concepts(7) manual page also documents the core
1431 concepts of LTTng, with more links to other LTTng-tools manual pages.
1435 === Instrumentation point, event rule, and event
1437 An _instrumentation point_ is a point, within a piece of software,
1438 which, when executed, creates an LTTng _event_.
1440 LTTng offers various <<instrumentation-point-types,types of
1443 An _event rule_ is a set of conditions to match a set of events.
1445 When LTTng creates an event{nbsp}__E__, an event rule{nbsp}__ER__ is
1446 said to __match__{nbsp}__E__ when{nbsp}__E__ satisfies _all_ the
1447 conditions of{nbsp}__ER__. This concept is similar to a
1448 https://en.wikipedia.org/wiki/Regular_expression[regular expression]
1449 which matches a set of strings.
1451 When an event rule matches an event, LTTng _emits_ the event, therefore
1452 attempting to execute one or more actions.
1456 [[event-creation-emission-opti]]The event creation and emission
1457 processes are documentation concepts to help understand the journey from
1458 an instrumentation point to the execution of actions.
1460 The actual creation of an event can be costly because LTTng needs to
1461 evaluate the arguments of the instrumentation point.
1463 In practice, LTTng implements various optimizations for the Linux kernel
1464 and user space <<domain,tracing domains>> to avoid actually creating an
1465 event when the tracer knows, thanks to properties which are independent
1466 from the event payload and current context, that it would never emit
1467 such an event. Those properties are:
1469 * The <<instrumentation-point-types,instrumentation point type>>.
1471 * The instrumentation point name.
1473 * The instrumentation point log level.
1475 * For a <<event,recording event rule>>:
1476 ** The status of the rule itself.
1477 ** The status of the <<channel,channel>>.
1478 ** The activity of the <<tracing-session,recording session>>.
1479 ** Whether or not the process for which LTTng would create the event is
1480 <<pid-tracking,allowed to record events>>.
1482 In other words: if, for a given instrumentation point{nbsp}__IP__, the
1483 LTTng tracer knows that it would never emit an event,
1484 executing{nbsp}__IP__ represents a simple boolean variable check and,
1485 for a Linux kernel recording event rule, a few process attribute checks.
1488 As of LTTng{nbsp}{revision}, there are two places where you can find an
1491 <<event,Recording event rule>>::
1492 A specific type of event rule of which the action is to record the
1493 matched event as an event record.
1495 See ``<<enabling-disabling-events,Create and enable a recording event
1496 rule>>'' to learn more.
1498 ``Event rule matches'' <<trigger,trigger>> condition (since LTTng{nbsp}2.13)::
1499 When the event rule of the trigger condition matches an event, LTTng
1500 can execute user-defined actions such as sending an LTTng
1502 <<basic-tracing-session-control,starting a recording session>>,
1505 See “<<add-event-rule-matches-trigger,Add an ``event rule matches''
1506 trigger to a session daemon>>” to learn more.
1508 For LTTng to emit an event{nbsp}__E__,{nbsp}__E__ must satisfy _all_ the
1509 basic conditions of an event rule{nbsp}__ER__, that is:
1511 * The instrumentation point from which LTTng
1512 creates{nbsp}__E__ has a specific
1513 <<instrumentation-point-types,type>>.
1515 * A pattern matches the name of{nbsp}__E__ while another pattern
1518 * The log level of the instrumentation point from which LTTng
1519 creates{nbsp}__E__ is at least as severe as some value, or is exactly
1522 * The fields of the payload of{nbsp}__E__ and the current context fields
1523 satisfy a filter expression.
1525 A <<event,recording event rule>> has additional, implicit conditions to
1529 [[instrumentation-point-types]]
1530 ==== Instrumentation point types
1532 As of LTTng{nbsp}{revision}, the available instrumentation point
1533 types are, depending on the <<domain,tracing domain>>:
1537 A statically defined point in the source code of the kernel
1538 image or of a kernel module using the
1539 <<lttng-modules,LTTng-modules>> macros.
1541 Linux kernel system call:::
1542 Entry, exit, or both of a Linux kernel system call.
1544 Linux https://www.kernel.org/doc/html/latest/trace/kprobes.html[kprobe]:::
1545 A single probe dynamically placed in the compiled kernel code.
1547 When you create such an instrumentation point, you set its memory
1548 address or symbol name.
1550 Linux user space probe:::
1551 A single probe dynamically placed at the entry of a compiled
1552 user space application/library function through the kernel.
1554 When you create such an instrumentation point, you set:
1557 With the ELF method::
1558 Its application/library path and its symbol name.
1560 With the USDT method::
1561 Its application/library path, its provider name, and its probe name.
1563 ``USDT'' stands for _SystemTap User-level Statically Defined Tracing_,
1564 a http://dtrace.org/blogs/about/[DTrace]-style marker.
1567 As of LTTng{nbsp}{revision}, LTTng only supports USDT probes which
1568 are _not_ reference-counted.
1570 Linux https://www.kernel.org/doc/html/latest/trace/kprobes.html[kretprobe]:::
1571 Entry, exit, or both of a Linux kernel function.
1573 When you create such an instrumentation point, you set the memory
1574 address or symbol name of its function.
1578 A statically defined point in the source code of a C/$$C++$$
1579 application/library using the
1580 <<lttng-ust,LTTng-UST>> macros.
1582 `java.util.logging`, Apache log4j, and Python::
1583 Java or Python logging statement:::
1584 A method call on a Java or Python logger attached to an
1587 See ``<<list-instrumentation-points,List the available instrumentation
1588 points>>'' to learn how to list available Linux kernel, user space, and
1589 logging instrumentation points.
1595 A _trigger_ associates a condition to one or more actions.
1597 When the condition of a trigger is satisfied, LTTng attempts to execute
1600 As of LTTng{nbsp}{revision}, the available trigger conditions and
1605 * The consumed buffer size of a given <<tracing-session,recording
1606 session>> becomes greater than some value.
1608 * The buffer usage of a given <<channel,channel>> becomes greater than
1611 * The buffer usage of a given channel becomes less than some value.
1613 * There's an ongoing <<session-rotation,recording session rotation>>.
1615 * A recording session rotation becomes completed.
1617 * An <<add-event-rule-matches-trigger,event rule matches>> an event.
1621 * <<trigger-event-notif,Send a notification>> to a user application.
1622 * <<basic-tracing-session-control,Start>> a given recording session.
1623 * <<basic-tracing-session-control,Stop>> a given recording session.
1624 * <<session-rotation,Archive the current trace chunk>> of a given
1625 recording session (rotate).
1626 * <<taking-a-snapshot,Take a snapshot>> of a given recording session.
1628 A trigger belongs to a <<lttng-sessiond,session daemon>>, not to a
1629 specific recording session. For a given session daemon, each Unix user has
1630 its own, private triggers. Note, however, that the `root` Unix user may,
1631 for the root session daemon:
1633 * Add a trigger as another Unix user.
1635 * List all the triggers, regardless of their owner.
1637 * Remove a trigger which belongs to another Unix user.
1639 For a given session daemon and Unix user, a trigger has a unique name.
1643 === Recording session
1645 A _recording session_ (named ``tracing session'' prior to
1646 LTTng{nbsp}2.13) is a stateful dialogue between you and a
1647 <<lttng-sessiond,session daemon>> for everything related to
1648 <<event,event recording>>.
1650 Everything that you do when you control LTTng tracers to record events
1651 happens within a recording session. In particular, a recording session:
1653 * Has its own name, unique for a given session daemon.
1655 * Has its own set of trace files, if any.
1657 * Has its own state of activity (started or stopped).
1659 An active recording session is an implicit <<event,recording event rule>>
1662 * Has its own <<tracing-session-mode,mode>> (local, network streaming,
1665 * Has its own <<channel,channels>> to which are attached their own
1666 recording event rules.
1668 * Has its own <<pid-tracking,process attribute inclusion sets>>.
1671 .A _recording session_ contains <<channel,channels>> that are members of <<domain,tracing domains>> and contain <<event,recording event rules>>.
1672 image::concepts.png[]
1674 Those attributes and objects are completely isolated between different
1677 A recording session is like an
1678 https://en.wikipedia.org/wiki/Automated_teller_machine[ATM] session: the
1679 operations you do on the banking system through the ATM don't alter the
1680 data of other users of the same system. In the case of the ATM, a
1681 session lasts as long as your bank card is inside. In the case of LTTng,
1682 a recording session lasts from the man:lttng-create(1) command to the
1683 man:lttng-destroy(1) command.
1686 .Each Unix user has its own set of recording sessions.
1687 image::many-sessions.png[]
1689 A recording session belongs to a <<lttng-sessiond,session daemon>>. For a
1690 given session daemon, each Unix user has its own, private recording
1691 sessions. Note, however, that the `root` Unix user may operate on or
1692 destroy another user's recording session.
1695 [[tracing-session-mode]]
1696 ==== Recording session mode
1698 LTTng offers four recording session modes:
1700 [[local-mode]]Local mode::
1701 Write the trace data to the local file system.
1703 [[net-streaming-mode]]Network streaming mode::
1704 Send the trace data over the network to a listening
1705 <<lttng-relayd,relay daemon>>.
1707 [[snapshot-mode]]Snapshot mode::
1708 Only write the trace data to the local file system or send it to a
1709 listening relay daemon when LTTng <<taking-a-snapshot,takes a
1712 LTTng forces all the <<channel,channels>>
1713 to be created to be configured to be snapshot-ready.
1715 LTTng takes a snapshot of such a recording session when:
1718 * You run the man:lttng-snapshot(1) command.
1720 * LTTng executes a `snapshot-session` <<trigger,trigger>> action.
1723 [[live-mode]]Live mode::
1724 Send the trace data over the network to a listening relay daemon
1725 for <<lttng-live,live reading>>.
1727 An LTTng live reader (for example, man:babeltrace2(1)) can connect to
1728 the same relay daemon to receive trace data while the recording session is
1735 A _tracing domain_ identifies a type of LTTng tracer.
1737 A tracing domain has its own properties and features.
1739 There are currently five available tracing domains:
1743 * `java.util.logging` (JUL)
1747 You must specify a tracing domain to target a type of LTTng tracer when
1748 using some <<lttng-cli,cmd:lttng>> commands to avoid ambiguity. For
1749 example, because the Linux kernel and user space tracing domains support
1750 named tracepoints as <<event-rule,instrumentation points>>, you need to
1751 specify a tracing domain when you <<enabling-disabling-events,create
1752 an event rule>> because both tracing domains could have tracepoints
1753 sharing the same name.
1755 You can create <<channel,channels>> in the Linux kernel and user space
1756 tracing domains. The other tracing domains have a single, default
1761 === Channel and ring buffer
1763 A _channel_ is an object which is responsible for a set of
1766 Each ring buffer is divided into multiple _sub-buffers_. When a
1767 <<event,recording event rule>>
1768 matches an event, LTTng can record it to one or more sub-buffers of one
1771 When you <<enabling-disabling-channels,create a channel>>, you set its
1772 final attributes, that is:
1774 * Its <<channel-buffering-schemes,buffering scheme>>.
1776 * What to do <<channel-overwrite-mode-vs-discard-mode,when there's no
1777 space left>> for a new event record because all sub-buffers are full.
1779 * The <<channel-subbuf-size-vs-subbuf-count,size of each ring buffer and
1780 how many sub-buffers>> a ring buffer has.
1782 * The <<tracefile-rotation,size of each trace file LTTng writes for this
1783 channel and the maximum count>> of trace files.
1785 * The periods of its <<channel-read-timer,read>>,
1786 <<channel-switch-timer,switch>>, and <<channel-monitor-timer,monitor>>
1789 * For a Linux kernel channel: its output type.
1791 See the opt:lttng-enable-channel(1):--output option of the
1792 man:lttng-enable-channel(1) command.
1794 * For a user space channel: the value of its
1795 <<blocking-timeout-example,blocking timeout>>.
1797 A channel is always associated to a <<domain,tracing domain>>. The
1798 `java.util.logging` (JUL), log4j, and Python tracing domains each have a
1799 default channel which you can't configure.
1801 A channel owns <<event,recording event rules>>.
1804 [[channel-buffering-schemes]]
1805 ==== Buffering scheme
1807 A channel has at least one ring buffer _per CPU_. LTTng always records
1808 an event to the ring buffer dedicated to the CPU which emits it.
1810 The buffering scheme of a user space channel determines what has its own
1811 set of per-CPU ring buffers:
1813 Per-user buffering::
1814 Allocate one set of ring buffers--one per CPU--shared by all the
1815 instrumented processes of:
1816 If your Unix user is `root`:::
1821 .Per-user buffering scheme (recording session belongs to the `root` Unix user).
1822 image::per-user-buffering-root.png[]
1830 .Per-user buffering scheme (recording session belongs to the `Bob` Unix user).
1831 image::per-user-buffering.png[]
1834 Per-process buffering::
1835 Allocate one set of ring buffers--one per CPU--for each
1836 instrumented process of:
1837 If your Unix user is `root`:::
1842 .Per-process buffering scheme (recording session belongs to the `root` Unix user).
1843 image::per-process-buffering-root.png[]
1851 .Per-process buffering scheme (recording session belongs to the `Bob` Unix user).
1852 image::per-process-buffering.png[]
1855 The per-process buffering scheme tends to consume more memory than the
1856 per-user option because systems generally have more instrumented
1857 processes than Unix users running instrumented processes. However, the
1858 per-process buffering scheme ensures that one process having a high
1859 event throughput won't fill all the shared sub-buffers of the same Unix
1862 The buffering scheme of a Linux kernel channel is always to allocate a
1863 single set of ring buffers for the whole system. This scheme is similar
1864 to the per-user option, but with a single, global user ``running'' the
1868 [[channel-overwrite-mode-vs-discard-mode]]
1869 ==== Event record loss mode
1871 When LTTng emits an event, LTTng can record it to a specific, available
1872 sub-buffer within the ring buffers of specific channels. When there's no
1873 space left in a sub-buffer, the tracer marks it as consumable and
1874 another, available sub-buffer starts receiving the following event
1875 records. An LTTng <<lttng-consumerd,consumer daemon>> eventually
1876 consumes the marked sub-buffer, which returns to the available state.
1879 [role="docsvg-channel-subbuf-anim"]
1884 In an ideal world, sub-buffers are consumed faster than they're filled,
1885 as it's the case in the previous animation. In the real world,
1886 however, all sub-buffers can be full at some point, leaving no space to
1887 record the following events.
1889 By default, <<lttng-modules,LTTng-modules>> and <<lttng-ust,LTTng-UST>>
1890 are _non-blocking_ tracers: when there's no available sub-buffer to
1891 record an event, it's acceptable to lose event records when the
1892 alternative would be to cause substantial delays in the execution of the
1893 instrumented application. LTTng privileges performance over integrity;
1894 it aims at perturbing the instrumented application as little as possible
1895 in order to make the detection of subtle race conditions and rare
1896 interrupt cascades possible.
1898 Since LTTng{nbsp}2.10, the LTTng user space tracer, LTTng-UST, supports
1899 a _blocking mode_. See the <<blocking-timeout-example,blocking timeout
1900 example>> to learn how to use the blocking mode.
1902 When it comes to losing event records because there's no available
1903 sub-buffer, or because the blocking timeout of
1904 the channel is reached, the _event record loss mode_ of the channel
1905 determines what to do. The available event record loss modes are:
1907 [[discard-mode]]Discard mode::
1908 Drop the newest event records until a sub-buffer becomes available.
1910 This is the only available mode when you specify a blocking timeout.
1912 With this mode, LTTng increments a count of lost event records when an
1913 event record is lost and saves this count to the trace. A trace reader
1914 can use the saved discarded event record count of the trace to decide
1915 whether or not to perform some analysis even if trace data is known to
1918 [[overwrite-mode]]Overwrite mode::
1919 Clear the sub-buffer containing the oldest event records and start
1920 writing the newest event records there.
1922 This mode is sometimes called _flight recorder mode_ because it's
1923 similar to a https://en.wikipedia.org/wiki/Flight_recorder[flight
1924 recorder]: always keep a fixed amount of the latest data. It's also
1925 similar to the roll mode of an oscilloscope.
1927 Since LTTng{nbsp}2.8, with this mode, LTTng writes to a given sub-buffer
1928 its sequence number within its data stream. With a <<local-mode,local>>,
1929 <<net-streaming-mode,network streaming>>, or <<live-mode,live>> recording
1930 session, a trace reader can use such sequence numbers to report lost
1931 packets. A trace reader can use the saved discarded sub-buffer (packet)
1932 count of the trace to decide whether or not to perform some analysis
1933 even if trace data is known to be missing.
1935 With this mode, LTTng doesn't write to the trace the exact number of
1936 lost event records in the lost sub-buffers.
1938 Which mechanism you should choose depends on your context: prioritize
1939 the newest or the oldest event records in the ring buffer?
1941 Beware that, in overwrite mode, the tracer abandons a _whole sub-buffer_
1942 as soon as a there's no space left for a new event record, whereas in
1943 discard mode, the tracer only discards the event record that doesn't
1946 There are a few ways to decrease your probability of losing event
1947 records. The ``<<channel-subbuf-size-vs-subbuf-count,Sub-buffer size and
1948 count>>'' section shows how to fine-tune the sub-buffer size and count
1949 of a channel to virtually stop losing event records, though at the cost
1950 of greater memory usage.
1953 [[channel-subbuf-size-vs-subbuf-count]]
1954 ==== Sub-buffer size and count
1956 A channel has one or more ring buffer for each CPU of the target system.
1958 See the ``<<channel-buffering-schemes,Buffering scheme>>'' section to
1959 learn how many ring buffers of a given channel are dedicated to each CPU
1960 depending on its buffering scheme.
1962 Set the size of each sub-buffer the ring buffers of a channel contain
1963 and how many there are
1964 when you <<enabling-disabling-channels,create it>>.
1966 Note that LTTng switching the current sub-buffer of a ring buffer
1967 (marking a full one as consumable and switching to an available one for
1968 LTTng to record the next events) introduces noticeable CPU overhead.
1969 Knowing this, the following list presents a few practical situations
1970 along with how to configure the sub-buffer size and count for them:
1972 High event throughput::
1973 In general, prefer large sub-buffers to lower the risk of losing
1976 Having larger sub-buffers also ensures a lower sub-buffer switching
1979 The sub-buffer count is only meaningful if you create the channel in
1980 <<overwrite-mode,overwrite mode>>: in this case, if LTTng overwrites a
1981 sub-buffer, then the other sub-buffers are left unaltered.
1983 Low event throughput::
1984 In general, prefer smaller sub-buffers since the risk of losing
1985 event records is low.
1987 Because LTTng emits events less frequently, the sub-buffer switching
1988 frequency should remain low and therefore the overhead of the tracer
1989 shouldn't be a problem.
1992 If your target system has a low memory limit, prefer fewer first,
1993 then smaller sub-buffers.
1995 Even if the system is limited in memory, you want to keep the
1996 sub-buffers as large as possible to avoid a high sub-buffer switching
1999 Note that LTTng uses https://diamon.org/ctf/[CTF] as its trace format,
2000 which means event record data is very compact. For example, the average
2001 LTTng kernel event record weights about 32{nbsp}bytes. Therefore, a
2002 sub-buffer size of 1{nbsp}MiB is considered large.
2004 The previous scenarios highlight the major trade-off between a few large
2005 sub-buffers and more, smaller sub-buffers: sub-buffer switching
2006 frequency vs. how many event records are lost in overwrite mode.
2007 Assuming a constant event throughput and using the overwrite mode, the
2008 two following configurations have the same ring buffer total size:
2011 [role="docsvg-channel-subbuf-size-vs-count-anim"]
2016 Two sub-buffers of 4{nbsp}MiB each::
2017 Expect a very low sub-buffer switching frequency, but if LTTng
2018 ever needs to overwrite a sub-buffer, half of the event records so
2019 far (4{nbsp}MiB) are definitely lost.
2021 Eight sub-buffers of 1{nbsp}MiB each::
2022 Expect four times the tracer overhead of the configuration above,
2023 but if LTTng needs to overwrite a sub-buffer, only the eighth of
2024 event records so far (1{nbsp}MiB) are definitely lost.
2026 In <<discard-mode,discard mode>>, the sub-buffer count parameter is
2027 pointless: use two sub-buffers and set their size according to your
2031 [[tracefile-rotation]]
2032 ==== Maximum trace file size and count (trace file rotation)
2034 By default, trace files can grow as large as needed.
2036 Set the maximum size of each trace file that LTTng writes of a given
2037 channel when you <<enabling-disabling-channels,create it>>.
2039 When the size of a trace file reaches the fixed maximum size of the
2040 channel, LTTng creates another file to contain the next event records.
2041 LTTng appends a file count to each trace file name in this case.
2043 If you set the trace file size attribute when you create a channel, the
2044 maximum number of trace files that LTTng creates is _unlimited_ by
2045 default. To limit them, set a maximum number of trace files. When the
2046 number of trace files reaches the fixed maximum count of the channel,
2047 LTTng overwrites the oldest trace file. This mechanism is called _trace
2052 Even if you don't limit the trace file count, always assume that LTTng
2053 manages all the trace files of the recording session.
2055 In other words, there's no safe way to know if LTTng still holds a given
2056 trace file open with the trace file rotation feature.
2058 The only way to obtain an unmanaged, self-contained LTTng trace before
2059 you <<creating-destroying-tracing-sessions,destroy the recording session>>
2060 is with the <<session-rotation,recording session rotation>> feature, which
2061 is available since LTTng{nbsp}2.11.
2068 Each channel can have up to three optional timers:
2070 [[channel-switch-timer]]Switch timer::
2071 When this timer expires, a sub-buffer switch happens: for each ring
2072 buffer of the channel, LTTng marks the current sub-buffer as
2073 consumable and _switches_ to an available one to record the next
2077 [role="docsvg-channel-switch-timer"]
2082 A switch timer is useful to ensure that LTTng consumes and commits trace
2083 data to trace files or to a distant <<lttng-relayd,relay daemon>>
2084 periodically in case of a low event throughput.
2086 Such a timer is also convenient when you use large
2087 <<channel-subbuf-size-vs-subbuf-count,sub-buffers>> to cope with a
2088 sporadic high event throughput, even if the throughput is otherwise low.
2090 Set the period of the switch timer of a channel when you
2091 <<enabling-disabling-channels,create it>> with
2092 the opt:lttng-enable-channel(1):--switch-timer option.
2094 [[channel-read-timer]]Read timer::
2095 When this timer expires, LTTng checks for full, consumable
2098 By default, the LTTng tracers use an asynchronous message mechanism to
2099 signal a full sub-buffer so that a <<lttng-consumerd,consumer daemon>>
2102 When such messages must be avoided, for example in real-time
2103 applications, use this timer instead.
2105 Set the period of the read timer of a channel when you
2106 <<enabling-disabling-channels,create it>> with the
2107 opt:lttng-enable-channel(1):--read-timer option.
2109 [[channel-monitor-timer]]Monitor timer::
2110 When this timer expires, the consumer daemon samples some channel
2111 statistics to evaluate the following <<trigger,trigger>>
2115 . The consumed buffer size of a given <<tracing-session,recording
2116 session>> becomes greater than some value.
2117 . The buffer usage of a given channel becomes greater than some value.
2118 . The buffer usage of a given channel becomes less than some value.
2121 If you disable the monitor timer of a channel{nbsp}__C__:
2124 * The consumed buffer size value of the recording session of{nbsp}__C__
2125 could be wrong for trigger condition type{nbsp}1: the consumed buffer
2126 size of{nbsp}__C__ won't be part of the grand total.
2128 * The buffer usage trigger conditions (types{nbsp}2 and{nbsp}3)
2129 for{nbsp}__C__ will never be satisfied.
2132 Set the period of the monitor timer of a channel when you
2133 <<enabling-disabling-channels,create it>> with the
2134 opt:lttng-enable-channel(1):--monitor-timer option.
2138 === Recording event rule and event record
2140 A _recording event rule_ is a specific type of <<event-rule,event rule>>
2141 of which the action is to serialize and record the matched event as an
2144 Set the explicit conditions of a recording event rule when you
2145 <<enabling-disabling-events,create it>>. A recording event rule also has
2146 the following implicit conditions:
2148 * The recording event rule itself is enabled.
2150 A recording event rule is enabled on creation.
2152 * The <<channel,channel>> to which the recording event rule is attached
2155 A channel is enabled on creation.
2157 * The <<tracing-session,recording session>> of the recording event rule is
2158 <<basic-tracing-session-control,active>> (started).
2160 A recording session is inactive (stopped) on creation.
2162 * The process for which LTTng creates an event to match is
2163 <<pid-tracking,allowed to record events>>.
2165 All processes are allowed to record events on recording session
2168 You always attach a recording event rule to a channel, which belongs to
2169 a recording session, when you create it.
2171 When a recording event rule{nbsp}__ER__ matches an event{nbsp}__E__,
2172 LTTng attempts to serialize and record{nbsp}__E__ to one of the
2173 available sub-buffers of the channel to which{nbsp}__E__ is attached.
2175 When multiple matching recording event rules are attached to the same
2176 channel, LTTng attempts to serialize and record the matched event
2177 _once_. In the following example, the second recording event rule is
2178 redundant when both are enabled:
2182 $ lttng enable-event --userspace hello:world
2183 $ lttng enable-event --userspace hello:world --loglevel=INFO
2187 .Logical path from an instrumentation point to an event record.
2188 image::event-rule.png[]
2190 As of LTTng{nbsp}{revision}, you cannot remove a recording event
2191 rule: it exists as long as its recording session exists.
2195 == Components of noch:{LTTng}
2197 The second _T_ in _LTTng_ stands for _toolkit_: it would be wrong
2198 to call LTTng a simple _tool_ since it's composed of multiple
2199 interacting components.
2201 This section describes those components, explains their respective
2202 roles, and shows how they connect together to form the LTTng ecosystem.
2204 The following diagram shows how the most important components of LTTng
2205 interact with user applications, the Linux kernel, and you:
2208 .Control and trace data paths between LTTng components.
2209 image::plumbing.png[]
2211 The LTTng project integrates:
2214 Libraries and command-line interface to control recording sessions:
2216 * <<lttng-sessiond,Session daemon>> (man:lttng-sessiond(8)).
2217 * <<lttng-consumerd,Consumer daemon>> (cmd:lttng-consumerd).
2218 * <<lttng-relayd,Relay daemon>> (man:lttng-relayd(8)).
2219 * <<liblttng-ctl-lttng,Tracing control library>> (`liblttng-ctl`).
2220 * <<lttng-cli,Tracing control command-line tool>> (man:lttng(1)).
2221 * <<persistent-memory-file-systems,`lttng-crash` command-line tool>>
2222 (man:lttng-crash(1)).
2225 Libraries and Java/Python packages to instrument and trace user
2228 * <<lttng-ust,User space tracing library>> (`liblttng-ust`) and its
2229 headers to instrument and trace any native user application.
2230 * <<prebuilt-ust-helpers,Preloadable user space tracing helpers>>:
2231 ** `liblttng-ust-libc-wrapper`
2232 ** `liblttng-ust-pthread-wrapper`
2233 ** `liblttng-ust-cyg-profile`
2234 ** `liblttng-ust-cyg-profile-fast`
2235 ** `liblttng-ust-dl`
2236 * <<lttng-ust-agents,LTTng-UST Java agent>> to instrument and trace
2237 Java applications using `java.util.logging` or
2238 Apache log4j{nbsp}1.2 logging.
2239 * <<lttng-ust-agents,LTTng-UST Python agent>> to instrument
2240 Python applications using the standard `logging` package.
2243 <<lttng-modules,Linux kernel modules>> to instrument and trace the
2246 * LTTng kernel tracer module.
2247 * Recording ring buffer kernel modules.
2248 * Probe kernel modules.
2249 * LTTng logger kernel module.
2253 === Tracing control command-line interface
2255 The _man:lttng(1) command-line tool_ is the standard user interface to
2256 control LTTng <<tracing-session,recording sessions>>.
2258 The cmd:lttng tool is part of LTTng-tools.
2260 The cmd:lttng tool is linked with
2261 <<liblttng-ctl-lttng,`liblttng-ctl`>> to communicate with
2262 one or more <<lttng-sessiond,session daemons>> behind the scenes.
2264 The cmd:lttng tool has a Git-like interface:
2268 $ lttng [GENERAL OPTIONS] <COMMAND> [COMMAND OPTIONS]
2271 The ``<<controlling-tracing,Tracing control>>'' section explores the
2272 available features of LTTng through its cmd:lttng tool.
2275 [[liblttng-ctl-lttng]]
2276 === Tracing control library
2279 .The tracing control library.
2280 image::plumbing-liblttng-ctl.png[]
2282 The _LTTng control library_, `liblttng-ctl`, is used to communicate with
2283 a <<lttng-sessiond,session daemon>> using a C{nbsp}API that hides the
2284 underlying details of the protocol.
2286 `liblttng-ctl` is part of LTTng-tools.
2288 The <<lttng-cli,cmd:lttng command-line tool>> is linked with
2291 Use `liblttng-ctl` in C or $$C++$$ source code by including its
2296 #include <lttng/lttng.h>
2299 As of LTTng{nbsp}{revision}, the best available developer documentation
2300 for `liblttng-ctl` is its installed header files. Functions and
2301 structures are documented with header comments.
2305 === User space tracing library
2308 .The user space tracing library.
2309 image::plumbing-liblttng-ust.png[]
2311 The _user space tracing library_, `liblttng-ust` (see man:lttng-ust(3)),
2312 is the LTTng user space tracer.
2314 `liblttng-ust` receives commands from a <<lttng-sessiond,session
2315 daemon>>, for example to allow specific instrumentation points to emit
2316 LTTng <<event-rule,events>>, and writes event records to <<channel,ring
2317 buffers>> shared with a <<lttng-consumerd,consumer daemon>>.
2319 `liblttng-ust` is part of LTTng-UST.
2321 `liblttng-ust` can also send asynchronous messages to the session daemon
2322 when it emits an event. This supports the ``event rule matches''
2323 <<trigger,trigger>> condition feature (see
2324 “<<add-event-rule-matches-trigger,Add an ``event rule matches'' trigger
2325 to a session daemon>>”).
2327 Public C{nbsp}header files are installed beside `liblttng-ust` to
2328 instrument any <<c-application,C or $$C++$$ application>>.
2330 <<lttng-ust-agents,LTTng-UST agents>>, which are regular Java and Python
2331 packages, use their own <<tracepoint-provider,tracepoint provider
2332 package>> which is linked with `liblttng-ust`.
2334 An application or library doesn't have to initialize `liblttng-ust`
2335 manually: its constructor does the necessary tasks to register the
2336 application to a session daemon. The initialization phase also
2337 configures instrumentation points depending on the <<event-rule,event
2338 rules>> that you already created.
2341 [[lttng-ust-agents]]
2342 === User space tracing agents
2345 .The user space tracing agents.
2346 image::plumbing-lttng-ust-agents.png[]
2348 The _LTTng-UST Java and Python agents_ are regular Java and Python
2349 packages which add LTTng tracing capabilities to the
2350 native logging frameworks.
2352 The LTTng-UST agents are part of LTTng-UST.
2354 In the case of Java, the
2355 https://docs.oracle.com/javase/7/docs/api/java/util/logging/package-summary.html[`java.util.logging`
2356 core logging facilities] and
2357 https://logging.apache.org/log4j/1.2/[Apache log4j{nbsp}1.2] are supported.
2358 Note that Apache Log4j{nbsp}2 isn't supported.
2360 In the case of Python, the standard
2361 https://docs.python.org/3/library/logging.html[`logging`] package
2362 is supported. Both Python{nbsp}2 and Python{nbsp}3 modules can import the
2363 LTTng-UST Python agent package.
2365 The applications using the LTTng-UST agents are in the
2366 `java.util.logging` (JUL), log4j, and Python <<domain,tracing domains>>.
2368 Both agents use the same mechanism to convert log statements to LTTng
2369 events. When an agent initializes, it creates a log handler that
2370 attaches to the root logger. The agent also registers to a
2371 <<lttng-sessiond,session daemon>>. When the user application executes a
2372 log statement, the root logger passes it to the log handler of the
2373 agent. The custom log handler of the agent calls a native function in a
2374 tracepoint provider package shared library linked with
2375 <<lttng-ust,`liblttng-ust`>>, passing the formatted log message and
2376 other fields, like its logger name and its log level. This native
2377 function contains a user space instrumentation point, therefore tracing
2380 The log level condition of a <<event,recording event rule>> is
2381 considered when tracing a Java or a Python application, and it's
2382 compatible with the standard `java.util.logging`, log4j, and Python log
2387 === LTTng kernel modules
2390 .The LTTng kernel modules.
2391 image::plumbing-lttng-modules.png[]
2393 The _LTTng kernel modules_ are a set of Linux kernel modules
2394 which implement the kernel tracer of the LTTng project.
2396 The LTTng kernel modules are part of LTTng-modules.
2398 The LTTng kernel modules include:
2400 * A set of _probe_ modules.
2402 Each module attaches to a specific subsystem
2403 of the Linux kernel using its tracepoint instrument points.
2405 There are also modules to attach to the entry and return points of the
2406 Linux system call functions.
2408 * _Ring buffer_ modules.
2410 A ring buffer implementation is provided as kernel modules. The LTTng
2411 kernel tracer writes to ring buffers; a
2412 <<lttng-consumerd,consumer daemon>> reads from ring buffers.
2414 * The _LTTng kernel tracer_ module.
2415 * The <<proc-lttng-logger-abi,_LTTng logger_>> module.
2417 The LTTng logger module implements the special path:{/proc/lttng-logger}
2418 (and path:{/dev/lttng-logger}, since LTTng{nbsp}2.11) files so that any
2419 executable can generate LTTng events by opening those files and
2422 The LTTng kernel tracer can also send asynchronous messages to the
2423 <<lttng-sessiond,session daemon>> when it emits an event.
2424 This supports the ``event rule matches''
2425 <<trigger,trigger>> condition feature (see
2426 “<<add-event-rule-matches-trigger,Add an ``event rule matches'' trigger
2427 to a session daemon>>”).
2429 Generally, you don't have to load the LTTng kernel modules manually
2430 (using man:modprobe(8), for example): a root session daemon loads the
2431 necessary modules when starting. If you have extra probe modules, you
2432 can specify to load them to the session daemon on the command line
2433 (see the opt:lttng-sessiond(8):--extra-kmod-probes option). See also
2434 <<linux-kernel-sig,Linux kernel module signature>>.
2436 The LTTng kernel modules are installed in
2437 +/usr/lib/modules/__release__/extra+ by default, where +__release__+ is
2438 the kernel release (output of `uname --kernel-release`).
2445 .The session daemon.
2446 image::plumbing-sessiond.png[]
2448 The _session daemon_, man:lttng-sessiond(8), is a
2449 https://en.wikipedia.org/wiki/Daemon_(computing)[daemon] which:
2451 * Manages <<tracing-session,recording sessions>>.
2453 * Controls the various components (like tracers and
2454 <<lttng-consumerd,consumer daemons>>) of LTTng.
2456 * Sends <<notif-trigger-api,asynchronous notifications>> to user
2459 The session daemon is part of LTTng-tools.
2461 The session daemon sends control requests to and receives control
2464 * The <<lttng-ust,user space tracing library>>.
2466 Any instance of the user space tracing library first registers to
2467 a session daemon. Then, the session daemon can send requests to
2468 this instance, such as:
2471 ** Get the list of tracepoints.
2472 ** Share a <<event,recording event rule>> so that the user space tracing
2473 library can decide whether or not a given tracepoint can emit events.
2474 Amongst the possible conditions of a recording event rule is a filter
2475 expression which `liblttng-ust` evaluates before it emits an event.
2476 ** Share <<channel,channel>> attributes and ring buffer locations.
2479 The session daemon and the user space tracing library use a Unix
2480 domain socket to communicate.
2482 * The <<lttng-ust-agents,user space tracing agents>>.
2484 Any instance of a user space tracing agent first registers to
2485 a session daemon. Then, the session daemon can send requests to
2486 this instance, such as:
2489 ** Get the list of loggers.
2490 ** Enable or disable a specific logger.
2493 The session daemon and the user space tracing agent use a TCP connection
2496 * The <<lttng-modules,LTTng kernel tracer>>.
2497 * The <<lttng-consumerd,consumer daemon>>.
2499 The session daemon sends requests to the consumer daemon to instruct
2500 it where to send the trace data streams, amongst other information.
2502 * The <<lttng-relayd,relay daemon>>.
2504 The session daemon receives commands from the
2505 <<liblttng-ctl-lttng,tracing control library>>.
2507 The session daemon can receive asynchronous messages from the
2508 <<lttng-ust,user space>> and <<lttng-modules,kernel>> tracers
2509 when they emit events. This supports the ``event rule matches''
2510 <<trigger,trigger>> condition feature (see
2511 “<<add-event-rule-matches-trigger,Add an ``event rule matches'' trigger
2512 to a session daemon>>”).
2514 The root session daemon loads the appropriate
2515 <<lttng-modules,LTTng kernel modules>> on startup. It also spawns
2516 one or more <<lttng-consumerd,consumer daemons>> as soon as you create
2517 a <<event,recording event rule>>.
2519 The session daemon doesn't send and receive trace data: this is the
2520 role of the <<lttng-consumerd,consumer daemon>> and
2521 <<lttng-relayd,relay daemon>>. It does, however, generate the
2522 https://diamon.org/ctf/[CTF] metadata stream.
2524 Each Unix user can have its own session daemon instance. The
2525 recording sessions which different session daemons manage are completely
2528 The root user's session daemon is the only one which is
2529 allowed to control the LTTng kernel tracer, and its spawned consumer
2530 daemon is the only one which is allowed to consume trace data from the
2531 LTTng kernel tracer. Note, however, that any Unix user which is a member
2532 of the <<tracing-group,tracing group>> is allowed
2533 to create <<channel,channels>> in the
2534 Linux kernel <<domain,tracing domain>>, and therefore to use the Linux
2535 kernel LTTng tracer.
2537 The <<lttng-cli,cmd:lttng command-line tool>> automatically starts a
2538 session daemon when using its `create` command if none is currently
2539 running. You can also start the session daemon manually.
2546 .The consumer daemon.
2547 image::plumbing-consumerd.png[]
2549 The _consumer daemon_, cmd:lttng-consumerd, is a
2550 https://en.wikipedia.org/wiki/Daemon_(computing)[daemon] which shares
2551 ring buffers with user applications or with the LTTng kernel modules to
2552 collect trace data and send it to some location (file system or to a
2553 <<lttng-relayd,relay daemon>> over the network).
2555 The consumer daemon is part of LTTng-tools.
2557 You don't start a consumer daemon manually: a consumer daemon is always
2558 spawned by a <<lttng-sessiond,session daemon>> as soon as you create a
2559 <<event,recording event rule>>, that is, before you start recording. When
2560 you kill its owner session daemon, the consumer daemon also exits
2561 because it's the child process of the session daemon. Command-line
2562 options of man:lttng-sessiond(8) target the consumer daemon process.
2564 There are up to two running consumer daemons per Unix user, whereas only
2565 one session daemon can run per user. This is because each process can be
2566 either 32-bit or 64-bit: if the target system runs a mixture of 32-bit
2567 and 64-bit processes, it's more efficient to have separate
2568 corresponding 32-bit and 64-bit consumer daemons. The root user is an
2569 exception: it can have up to _three_ running consumer daemons: 32-bit
2570 and 64-bit instances for its user applications, and one more
2571 reserved for collecting kernel trace data.
2579 image::plumbing-relayd.png[]
2581 The _relay daemon_, man:lttng-relayd(8), is a
2582 https://en.wikipedia.org/wiki/Daemon_(computing)[daemon] acting as a bridge
2583 between remote session and consumer daemons, local trace files, and a
2584 remote live trace reader.
2586 The relay daemon is part of LTTng-tools.
2588 The main purpose of the relay daemon is to implement a receiver of
2589 <<sending-trace-data-over-the-network,trace data over the network>>.
2590 This is useful when the target system doesn't have much file system
2591 space to write trace files locally.
2593 The relay daemon is also a server to which a
2594 <<lttng-live,live trace reader>> can
2595 connect. The live trace reader sends requests to the relay daemon to
2596 receive trace data as the target system records events. The
2597 communication protocol is named _LTTng live_; it's used over TCP
2600 Note that you can start the relay daemon on the target system directly.
2601 This is the setup of choice when the use case is to view/analyze events
2602 as the target system records them without the need of a remote system.
2606 == [[using-lttng]]Instrumentation
2608 There are many examples of tracing and monitoring in our everyday life:
2610 * You have access to real-time and historical weather reports and
2611 forecasts thanks to weather stations installed around the country.
2612 * You know your heart is safe thanks to an electrocardiogram.
2613 * You make sure not to drive your car too fast and to have enough fuel
2614 to reach your destination thanks to gauges visible on your dashboard.
2616 All the previous examples have something in common: they rely on
2617 **instruments**. Without the electrodes attached to the surface of your
2618 body skin, cardiac monitoring is futile.
2620 LTTng, as a tracer, is no different from those real life examples. If
2621 you're about to trace a software system or, in other words, record its
2622 history of execution, you better have **instrumentation points** in the
2623 subject you're tracing, that is, the actual software system.
2625 <<instrumentation-point-types,Various ways>> were developed to
2626 instrument a piece of software for LTTng tracing. The most
2627 straightforward one is to manually place static instrumentation points,
2628 called _tracepoints_, in the source code of the application. The Linux
2629 kernel <<domain,tracing domain>> also makes it possible to dynamically
2630 add instrumentation points.
2632 If you're only interested in tracing the Linux kernel, your
2633 instrumentation needs are probably already covered by the built-in
2634 <<lttng-modules,Linux kernel instrumentation points>> of LTTng. You may
2635 also wish to have LTTng trace a user application which is already
2636 instrumented for LTTng tracing. In such cases, skip this whole section
2637 and read the topics of the ``<<controlling-tracing,Tracing control>>''
2640 Many methods are available to instrument a piece of software for LTTng
2643 * <<c-application,Instrument a C/$$C++$$ user application>>.
2644 * <<prebuilt-ust-helpers,Load a prebuilt user space tracing helper>>.
2645 * <<java-application,Instrument a Java application>>.
2646 * <<python-application,Instrument a Python application>>.
2647 * <<proc-lttng-logger-abi,Use the LTTng logger>>.
2648 * <<instrumenting-linux-kernel,Instrument a Linux kernel image or module>>.
2652 === [[cxx-application]]Instrument a C/$$C++$$ user application
2654 The high level procedure to instrument a C or $$C++$$ user application
2655 with the <<lttng-ust,LTTng user space tracing library>>, `liblttng-ust`,
2658 . <<tracepoint-provider,Create the source files of a tracepoint provider
2661 . <<probing-the-application-source-code,Add tracepoints to
2662 the source code of the application>>.
2664 . <<building-tracepoint-providers-and-user-application,Build and link
2665 a tracepoint provider package and the user application>>.
2667 If you need quick, man:printf(3)-like instrumentation, skip those steps
2668 and use <<tracef,`lttng_ust_tracef()`>> or
2669 <<tracelog,`lttng_ust_tracelog()`>> instead.
2671 IMPORTANT: You need to <<installing-lttng,install>> LTTng-UST to
2672 instrument a user application with `liblttng-ust`.
2675 [[tracepoint-provider]]
2676 ==== Create the source files of a tracepoint provider package
2678 A _tracepoint provider_ is a set of compiled functions which provide
2679 **tracepoints** to an application, the type of instrumentation point
2680 which LTTng-UST provides.
2682 Those functions can make LTTng emit events with user-defined fields and
2683 serialize those events as event records to one or more LTTng-UST
2684 <<channel,channel>> sub-buffers. The `lttng_ust_tracepoint()` macro,
2685 which you <<probing-the-application-source-code,insert in the source
2686 code of a user application>>, calls those functions.
2688 A _tracepoint provider package_ is an object file (`.o`) or a shared
2689 library (`.so`) which contains one or more tracepoint providers. Its
2692 * One or more <<tpp-header,tracepoint provider header>> (`.h`).
2693 * A <<tpp-source,tracepoint provider package source>> (`.c`).
2695 A tracepoint provider package is dynamically linked with `liblttng-ust`,
2696 the LTTng user space tracer, at run time.
2699 .User application linked with `liblttng-ust` and containing a tracepoint provider.
2700 image::ust-app.png[]
2702 NOTE: If you need quick, man:printf(3)-like instrumentation, skip
2703 creating and using a tracepoint provider and use
2704 <<tracef,`lttng_ust_tracef()`>> or <<tracelog,`lttng_ust_tracelog()`>>
2709 ===== Create a tracepoint provider header file template
2711 A _tracepoint provider header file_ contains the tracepoint definitions
2712 of a tracepoint provider.
2714 To create a tracepoint provider header file:
2716 . Start from this template:
2720 .Tracepoint provider header file template (`.h` file extension).
2722 #undef LTTNG_UST_TRACEPOINT_PROVIDER
2723 #define LTTNG_UST_TRACEPOINT_PROVIDER provider_name
2725 #undef LTTNG_UST_TRACEPOINT_INCLUDE
2726 #define LTTNG_UST_TRACEPOINT_INCLUDE "./tp.h"
2728 #if !defined(_TP_H) || defined(LTTNG_UST_TRACEPOINT_HEADER_MULTI_READ)
2731 #include <lttng/tracepoint.h>
2734 * Use LTTNG_UST_TRACEPOINT_EVENT(), LTTNG_UST_TRACEPOINT_EVENT_CLASS(),
2735 * LTTNG_UST_TRACEPOINT_EVENT_INSTANCE(), and
2736 * LTTNG_UST_TRACEPOINT_LOGLEVEL() here.
2741 #include <lttng/tracepoint-event.h>
2747 * +__provider_name__+ with the name of your tracepoint provider.
2748 * `"tp.h"` with the name of your tracepoint provider header file.
2750 . Below the `#include <lttng/tracepoint.h>` line, put your
2751 <<defining-tracepoints,tracepoint definitions>>.
2753 Your tracepoint provider name must be unique amongst all the possible
2754 tracepoint provider names used on the same target system. We suggest to
2755 include the name of your project or company in the name, for example,
2756 `org_lttng_my_project_tpp`.
2759 [[defining-tracepoints]]
2760 ===== Create a tracepoint definition
2762 A _tracepoint definition_ defines, for a given tracepoint:
2764 * Its **input arguments**.
2766 They're the macro parameters that the `lttng_ust_tracepoint()` macro
2767 accepts for this particular tracepoint in the source code of the user
2770 * Its **output event fields**.
2772 They're the sources of event fields that form the payload of any event
2773 that the execution of the `lttng_ust_tracepoint()` macro emits for this
2774 particular tracepoint.
2776 Create a tracepoint definition with the
2777 `LTTNG_UST_TRACEPOINT_EVENT()` macro below the `#include <lttng/tracepoint.h>`
2779 <<tpp-header,tracepoint provider header file template>>.
2781 The syntax of the `LTTNG_UST_TRACEPOINT_EVENT()` macro is:
2784 .`LTTNG_UST_TRACEPOINT_EVENT()` macro syntax.
2786 LTTNG_UST_TRACEPOINT_EVENT(
2787 /* Tracepoint provider name */
2790 /* Tracepoint name */
2793 /* Input arguments */
2798 /* Output event fields */
2799 LTTNG_UST_TP_FIELDS(
2807 * +__provider_name__+ with your tracepoint provider name.
2808 * +__tracepoint_name__+ with your tracepoint name.
2809 * +__arguments__+ with the <<tpp-def-input-args,input arguments>>.
2810 * +__fields__+ with the <<tpp-def-output-fields,output event field>>
2813 The full name of this tracepoint is `provider_name:tracepoint_name`.
2816 .Event name length limitation
2818 The concatenation of the tracepoint provider name and the tracepoint
2819 name must not exceed **254{nbsp}characters**. If it does, the
2820 instrumented application compiles and runs, but LTTng throws multiple
2821 warnings and you could experience serious issues.
2824 [[tpp-def-input-args]]The syntax of the `LTTNG_UST_TP_ARGS()` macro is:
2827 .`LTTNG_UST_TP_ARGS()` macro syntax.
2836 * +__type__+ with the C{nbsp}type of the argument.
2837 * +__arg_name__+ with the argument name.
2839 You can repeat +__type__+ and +__arg_name__+ up to 10{nbsp}times to have
2840 more than one argument.
2842 .`LTTNG_UST_TP_ARGS()` usage with three arguments.
2854 The `LTTNG_UST_TP_ARGS()` and `LTTNG_UST_TP_ARGS(void)` forms are valid
2855 to create a tracepoint definition with no input arguments.
2857 [[tpp-def-output-fields]]The `LTTNG_UST_TP_FIELDS()` macro contains a
2858 list of `lttng_ust_field_*()` macros. Each `lttng_ust_field_*()` macro
2859 defines one event field. See man:lttng-ust(3) for a complete description
2860 of the available `lttng_ust_field_*()` macros. A `lttng_ust_field_*()`
2861 macro specifies the type, size, and byte order of one event field.
2863 Each `lttng_ust_field_*()` macro takes an _argument expression_
2864 parameter. This is a C{nbsp}expression that the tracer evaluates at the
2865 `lttng_ust_tracepoint()` macro site in the source code of the
2866 application. This expression provides the source of data of a field. The
2867 argument expression can include input argument names listed in the
2868 `LTTNG_UST_TP_ARGS()` macro.
2870 Each `lttng_ust_field_*()` macro also takes a _field name_ parameter.
2871 Field names must be unique within a given tracepoint definition.
2873 Here's a complete tracepoint definition example:
2875 .Tracepoint definition.
2877 The following tracepoint definition defines a tracepoint which takes
2878 three input arguments and has four output event fields.
2882 #include "my-custom-structure.h"
2884 LTTNG_UST_TRACEPOINT_EVENT(
2888 const struct my_custom_structure *, my_custom_structure,
2892 LTTNG_UST_TP_FIELDS(
2893 lttng_ust_field_string(query_field, query)
2894 lttng_ust_field_float(double, ratio_field, ratio)
2895 lttng_ust_field_integer(int, recv_size,
2896 my_custom_structure->recv_size)
2897 lttng_ust_field_integer(int, send_size,
2898 my_custom_structure->send_size)
2903 Refer to this tracepoint definition with the `lttng_ust_tracepoint()`
2904 macro in the source code of your application like this:
2908 lttng_ust_tracepoint(my_provider, my_tracepoint,
2909 my_structure, some_ratio, the_query);
2913 NOTE: The LTTng-UST tracer only evaluates the arguments of a tracepoint
2914 at run time when such a tracepoint _could_ emit an event. See
2915 <<event-creation-emission-opti,this note>> to learn more.
2918 [[using-tracepoint-classes]]
2919 ===== Use a tracepoint class
2921 A _tracepoint class_ is a class of tracepoints which share the same
2922 output event field definitions. A _tracepoint instance_ is one
2923 instance of such a defined tracepoint class, with its own tracepoint
2926 The <<defining-tracepoints,`LTTNG_UST_TRACEPOINT_EVENT()` macro>> is
2927 actually a shorthand which defines both a tracepoint class and a
2928 tracepoint instance at the same time.
2930 When you build a tracepoint provider package, the C or $$C++$$ compiler
2931 creates one serialization function for each **tracepoint class**. A
2932 serialization function is responsible for serializing the event fields
2933 of a tracepoint to a sub-buffer when recording.
2935 For various performance reasons, when your situation requires multiple
2936 tracepoint definitions with different names, but with the same event
2937 fields, we recommend that you manually create a tracepoint class and
2938 instantiate as many tracepoint instances as needed. One positive effect
2939 of such a design, amongst other advantages, is that all tracepoint
2940 instances of the same tracepoint class reuse the same serialization
2941 function, thus reducing
2942 https://en.wikipedia.org/wiki/Cache_pollution[cache pollution].
2944 .Use a tracepoint class and tracepoint instances.
2946 Consider the following three tracepoint definitions:
2950 LTTNG_UST_TRACEPOINT_EVENT(
2957 LTTNG_UST_TP_FIELDS(
2958 lttng_ust_field_integer(int, userid, userid)
2959 lttng_ust_field_integer(size_t, len, len)
2963 LTTNG_UST_TRACEPOINT_EVENT(
2970 LTTNG_UST_TP_FIELDS(
2971 lttng_ust_field_integer(int, userid, userid)
2972 lttng_ust_field_integer(size_t, len, len)
2976 LTTNG_UST_TRACEPOINT_EVENT(
2983 LTTNG_UST_TP_FIELDS(
2984 lttng_ust_field_integer(int, userid, userid)
2985 lttng_ust_field_integer(size_t, len, len)
2990 In this case, we create three tracepoint classes, with one implicit
2991 tracepoint instance for each of them: `get_account`, `get_settings`, and
2992 `get_transaction`. However, they all share the same event field names
2993 and types. Hence three identical, yet independent serialization
2994 functions are created when you build the tracepoint provider package.
2996 A better design choice is to define a single tracepoint class and three
2997 tracepoint instances:
3001 /* The tracepoint class */
3002 LTTNG_UST_TRACEPOINT_EVENT_CLASS(
3003 /* Tracepoint class provider name */
3006 /* Tracepoint class name */
3009 /* Input arguments */
3015 /* Output event fields */
3016 LTTNG_UST_TP_FIELDS(
3017 lttng_ust_field_integer(int, userid, userid)
3018 lttng_ust_field_integer(size_t, len, len)
3022 /* The tracepoint instances */
3023 LTTNG_UST_TRACEPOINT_EVENT_INSTANCE(
3024 /* Tracepoint class provider name */
3027 /* Tracepoint class name */
3030 /* Instance provider name */
3033 /* Tracepoint name */
3036 /* Input arguments */
3042 LTTNG_UST_TRACEPOINT_EVENT_INSTANCE(
3051 LTTNG_UST_TRACEPOINT_EVENT_INSTANCE(
3063 The tracepoint class and instance provider names must be the same if the
3064 `LTTNG_UST_TRACEPOINT_EVENT_CLASS()` and
3065 `LTTNG_UST_TRACEPOINT_EVENT_INSTANCE()` expansions are part of the same
3066 translation unit. See man:lttng-ust(3) to learn more.
3069 [[assigning-log-levels]]
3070 ===== Assign a log level to a tracepoint definition
3072 Assign a _log level_ to a <<defining-tracepoints,tracepoint definition>>
3073 with the `LTTNG_UST_TRACEPOINT_LOGLEVEL()` macro.
3075 Assigning different levels of severity to tracepoint definitions can be
3076 useful: when you <<enabling-disabling-events,create a recording event
3077 rule>>, you can target tracepoints having a log level at least as severe
3078 as a specific value.
3080 The concept of LTTng-UST log levels is similar to the levels found
3081 in typical logging frameworks:
3083 * In a logging framework, the log level is given by the function
3084 or method name you use at the log statement site: `debug()`,
3085 `info()`, `warn()`, `error()`, and so on.
3087 * In LTTng-UST, you statically assign the log level to a tracepoint
3088 definition; any `lttng_ust_tracepoint()` macro invocation which refers
3089 to this definition has this log level.
3091 You must use `LTTNG_UST_TRACEPOINT_LOGLEVEL()` _after_ the
3092 <<defining-tracepoints,`LTTNG_UST_TRACEPOINT_EVENT()`>> or
3093 <<using-tracepoint-classes,`LTTNG_UST_TRACEPOINT_INSTANCE()`>> macro for
3096 The syntax of the `LTTNG_UST_TRACEPOINT_LOGLEVEL()` macro is:
3099 .`LTTNG_UST_TRACEPOINT_LOGLEVEL()` macro syntax.
3101 LTTNG_UST_TRACEPOINT_LOGLEVEL(provider_name, tracepoint_name, log_level)
3106 * +__provider_name__+ with the tracepoint provider name.
3107 * +__tracepoint_name__+ with the tracepoint name.
3108 * +__log_level__+ with the log level to assign to the tracepoint
3109 definition named +__tracepoint_name__+ in the +__provider_name__+
3110 tracepoint provider.
3112 See man:lttng-ust(3) for a list of available log level names.
3114 .Assign the `LTTNG_UST_TRACEPOINT_LOGLEVEL_DEBUG_UNIT` log level to a tracepoint definition.
3118 /* Tracepoint definition */
3119 LTTNG_UST_TRACEPOINT_EVENT(
3126 LTTNG_UST_TP_FIELDS(
3127 lttng_ust_field_integer(int, userid, userid)
3128 lttng_ust_field_integer(size_t, len, len)
3132 /* Log level assignment */
3133 LTTNG_UST_TRACEPOINT_LOGLEVEL(my_app, get_transaction,
3134 LTTNG_UST_TRACEPOINT_LOGLEVEL_DEBUG_UNIT)
3140 ===== Create a tracepoint provider package source file
3142 A _tracepoint provider package source file_ is a C source file which
3143 includes a <<tpp-header,tracepoint provider header file>> to expand its
3144 macros into event serialization and other functions.
3146 Use the following tracepoint provider package source file template:
3149 .Tracepoint provider package source file template.
3151 #define LTTNG_UST_TRACEPOINT_CREATE_PROBES
3156 Replace `tp.h` with the name of your <<tpp-header,tracepoint provider
3157 header file>> name. You may also include more than one tracepoint
3158 provider header file here to create a tracepoint provider package
3159 holding more than one tracepoint providers.
3162 [[probing-the-application-source-code]]
3163 ==== Add tracepoints to the source code of an application
3165 Once you <<tpp-header,create a tracepoint provider header file>>, use
3166 the `lttng_ust_tracepoint()` macro in the source code of your
3167 application to insert the tracepoints that this header
3168 <<defining-tracepoints,defines>>.
3170 The `lttng_ust_tracepoint()` macro takes at least two parameters: the
3171 tracepoint provider name and the tracepoint name. The corresponding
3172 tracepoint definition defines the other parameters.
3174 .`lttng_ust_tracepoint()` usage.
3176 The following <<defining-tracepoints,tracepoint definition>> defines a
3177 tracepoint which takes two input arguments and has two output event
3181 .Tracepoint provider header file.
3183 #include "my-custom-structure.h"
3185 LTTNG_UST_TRACEPOINT_EVENT(
3190 const char *, cmd_name
3192 LTTNG_UST_TP_FIELDS(
3193 lttng_ust_field_string(cmd_name, cmd_name)
3194 lttng_ust_field_integer(int, number_of_args, argc)
3199 Refer to this tracepoint definition with the `lttng_ust_tracepoint()`
3200 macro in the source code of your application like this:
3203 .Application source file.
3207 int main(int argc, char* argv[])
3209 lttng_ust_tracepoint(my_provider, my_tracepoint, argc, argv[0]);
3214 Note how the source code of the application includes
3215 the tracepoint provider header file containing the tracepoint
3216 definitions to use, path:{tp.h}.
3219 .`lttng_ust_tracepoint()` usage with a complex tracepoint definition.
3221 Consider this complex tracepoint definition, where multiple event
3222 fields refer to the same input arguments in their argument expression
3226 .Tracepoint provider header file.
3228 /* For `struct stat` */
3229 #include <sys/types.h>
3230 #include <sys/stat.h>
3233 LTTNG_UST_TRACEPOINT_EVENT(
3241 LTTNG_UST_TP_FIELDS(
3242 lttng_ust_field_integer(int, my_constant_field, 23 + 17)
3243 lttng_ust_field_integer(int, my_int_arg_field, my_int_arg)
3244 lttng_ust_field_integer(int, my_int_arg_field2,
3245 my_int_arg * my_int_arg)
3246 lttng_ust_field_integer(int, sum4_field,
3247 my_str_arg[0] + my_str_arg[1] +
3248 my_str_arg[2] + my_str_arg[3])
3249 lttng_ust_field_string(my_str_arg_field, my_str_arg)
3250 lttng_ust_field_integer_hex(off_t, size_field, st->st_size)
3251 lttng_ust_field_float(double, size_dbl_field, (double) st->st_size)
3252 lttng_ust_field_sequence_text(char, half_my_str_arg_field,
3254 strlen(my_str_arg) / 2)
3259 Refer to this tracepoint definition with the `lttng_ust_tracepoint()`
3260 macro in the source code of your application like this:
3263 .Application source file.
3265 #define LTTNG_UST_TRACEPOINT_DEFINE
3272 stat("/etc/fstab", &s);
3273 lttng_ust_tracepoint(my_provider, my_tracepoint, 23,
3274 "Hello, World!", &s);
3280 If you look at the event record that LTTng writes when recording this
3281 program, assuming the file size of path:{/etc/fstab} is 301{nbsp}bytes,
3282 it should look like this:
3284 .Event record fields
3286 |Field name |Field value
3287 |`my_constant_field` |40
3288 |`my_int_arg_field` |23
3289 |`my_int_arg_field2` |529
3291 |`my_str_arg_field` |`Hello, World!`
3292 |`size_field` |0x12d
3293 |`size_dbl_field` |301.0
3294 |`half_my_str_arg_field` |`Hello,`
3298 Sometimes, the arguments you pass to `lttng_ust_tracepoint()` are
3299 expensive to evaluate--they use the call stack, for example. To avoid
3300 this computation when LTTng wouldn't emit any event anyway, use the
3301 `lttng_ust_tracepoint_enabled()` and `lttng_ust_do_tracepoint()` macros.
3303 The syntax of the `lttng_ust_tracepoint_enabled()` and
3304 `lttng_ust_do_tracepoint()` macros is:
3307 .`lttng_ust_tracepoint_enabled()` and `lttng_ust_do_tracepoint()` macros syntax.
3309 lttng_ust_tracepoint_enabled(provider_name, tracepoint_name)
3311 lttng_ust_do_tracepoint(provider_name, tracepoint_name, ...)
3316 * +__provider_name__+ with the tracepoint provider name.
3317 * +__tracepoint_name__+ with the tracepoint name.
3319 `lttng_ust_tracepoint_enabled()` returns a non-zero value if executing
3320 the tracepoint named `tracepoint_name` from the provider named
3321 `provider_name` _could_ make LTTng emit an event, depending on the
3322 payload of said event.
3324 `lttng_ust_do_tracepoint()` is like `lttng_ust_tracepoint()`, except
3325 that it doesn't check what `lttng_ust_tracepoint_enabled()` checks.
3326 Using `lttng_ust_tracepoint()` with `lttng_ust_tracepoint_enabled()` is
3327 dangerous because `lttng_ust_tracepoint()` also contains the
3328 `lttng_ust_tracepoint_enabled()` check; therefore, a race condition is
3329 possible in this situation:
3332 .Possible race condition when using `lttng_ust_tracepoint_enabled()` with `lttng_ust_tracepoint()`.
3334 if (lttng_ust_tracepoint_enabled(my_provider, my_tracepoint)) {
3335 stuff = prepare_stuff();
3338 lttng_ust_tracepoint(my_provider, my_tracepoint, stuff);
3341 If `lttng_ust_tracepoint_enabled()` is false, but would be true after
3342 the conditional block, then `stuff` isn't prepared: the emitted event
3343 will either contain wrong data, or the whole application could crash
3344 (with a segmentation fault, for example).
3346 NOTE: Neither `lttng_ust_tracepoint_enabled()` nor
3347 `lttng_ust_do_tracepoint()` have an `STAP_PROBEV()` call. If you need
3348 it, you must emit this call yourself.
3351 [[building-tracepoint-providers-and-user-application]]
3352 ==== Build and link a tracepoint provider package and an application
3354 Once you have one or more <<tpp-header,tracepoint provider header
3355 files>> and a <<tpp-source,tracepoint provider package source file>>,
3356 create the tracepoint provider package by compiling its source
3357 file. From here, multiple build and run scenarios are possible. The
3358 following table shows common application and library configurations
3359 along with the required command lines to achieve them.
3361 In the following diagrams, we use the following file names:
3364 Executable application.
3367 Application object file.
3370 Tracepoint provider package object file.
3373 Tracepoint provider package archive file.
3376 Tracepoint provider package shared object file.
3379 User library object file.
3382 User library shared object file.
3384 We use the following symbols in the diagrams of table below:
3387 .Symbols used in the build scenario diagrams.
3388 image::ust-sit-symbols.png[]
3390 We assume that path:{.} is part of the env:LD_LIBRARY_PATH environment
3391 variable in the following instructions.
3393 [role="growable ust-scenarios",cols="asciidoc,asciidoc"]
3394 .Common tracepoint provider package scenarios.
3396 |Scenario |Instructions
3399 The instrumented application is statically linked with
3400 the tracepoint provider package object.
3402 image::ust-sit+app-linked-with-tp-o+app-instrumented.png[]
3405 include::../common/ust-sit-step-tp-o.txt[]
3407 To build the instrumented application:
3409 . In path:{app.c}, before including path:{tpp.h}, add the following line:
3414 #define LTTNG_UST_TRACEPOINT_DEFINE
3418 . Compile the application source file:
3427 . Build the application:
3432 $ gcc -o app app.o tpp.o -llttng-ust -ldl
3436 To run the instrumented application:
3438 * Start the application:
3448 The instrumented application is statically linked with the
3449 tracepoint provider package archive file.
3451 image::ust-sit+app-linked-with-tp-a+app-instrumented.png[]
3454 To create the tracepoint provider package archive file:
3456 . Compile the <<tpp-source,tracepoint provider package source file>>:
3465 . Create the tracepoint provider package archive file:
3470 $ ar rcs tpp.a tpp.o
3474 To build the instrumented application:
3476 . In path:{app.c}, before including path:{tpp.h}, add the following line:
3481 #define LTTNG_UST_TRACEPOINT_DEFINE
3485 . Compile the application source file:
3494 . Build the application:
3499 $ gcc -o app app.o tpp.a -llttng-ust -ldl
3503 To run the instrumented application:
3505 * Start the application:
3515 The instrumented application is linked with the tracepoint provider
3516 package shared object.
3518 image::ust-sit+app-linked-with-tp-so+app-instrumented.png[]
3521 include::../common/ust-sit-step-tp-so.txt[]
3523 To build the instrumented application:
3525 . In path:{app.c}, before including path:{tpp.h}, add the following line:
3530 #define LTTNG_UST_TRACEPOINT_DEFINE
3534 . Compile the application source file:
3543 . Build the application:
3548 $ gcc -o app app.o -ldl -L. -ltpp
3552 To run the instrumented application:
3554 * Start the application:
3564 The tracepoint provider package shared object is preloaded before the
3565 instrumented application starts.
3567 image::ust-sit+tp-so-preloaded+app-instrumented.png[]
3570 include::../common/ust-sit-step-tp-so.txt[]
3572 To build the instrumented application:
3574 . In path:{app.c}, before including path:{tpp.h}, add the
3580 #define LTTNG_UST_TRACEPOINT_DEFINE
3581 #define LTTNG_UST_TRACEPOINT_PROBE_DYNAMIC_LINKAGE
3585 . Compile the application source file:
3594 . Build the application:
3599 $ gcc -o app app.o -ldl
3603 To run the instrumented application with tracing support:
3605 * Preload the tracepoint provider package shared object and
3606 start the application:
3611 $ LD_PRELOAD=./libtpp.so ./app
3615 To run the instrumented application without tracing support:
3617 * Start the application:
3627 The instrumented application dynamically loads the tracepoint provider
3628 package shared object.
3630 image::ust-sit+app-dlopens-tp-so+app-instrumented.png[]
3633 include::../common/ust-sit-step-tp-so.txt[]
3635 To build the instrumented application:
3637 . In path:{app.c}, before including path:{tpp.h}, add the
3643 #define LTTNG_UST_TRACEPOINT_DEFINE
3644 #define LTTNG_UST_TRACEPOINT_PROBE_DYNAMIC_LINKAGE
3648 . Compile the application source file:
3657 . Build the application:
3662 $ gcc -o app app.o -ldl
3666 To run the instrumented application:
3668 * Start the application:
3678 The application is linked with the instrumented user library.
3680 The instrumented user library is statically linked with the tracepoint
3681 provider package object file.
3683 image::ust-sit+app-linked-with-lib+lib-linked-with-tp-o+lib-instrumented.png[]
3686 include::../common/ust-sit-step-tp-o-fpic.txt[]
3688 To build the instrumented user library:
3690 . In path:{emon.c}, before including path:{tpp.h}, add the
3696 #define LTTNG_UST_TRACEPOINT_DEFINE
3700 . Compile the user library source file:
3705 $ gcc -I. -fpic -c emon.c
3709 . Build the user library shared object:
3714 $ gcc -shared -o libemon.so emon.o tpp.o -llttng-ust -ldl
3718 To build the application:
3720 . Compile the application source file:
3729 . Build the application:
3734 $ gcc -o app app.o -L. -lemon
3738 To run the application:
3740 * Start the application:
3750 The application is linked with the instrumented user library.
3752 The instrumented user library is linked with the tracepoint provider
3753 package shared object.
3755 image::ust-sit+app-linked-with-lib+lib-linked-with-tp-so+lib-instrumented.png[]
3758 include::../common/ust-sit-step-tp-so.txt[]
3760 To build the instrumented user library:
3762 . In path:{emon.c}, before including path:{tpp.h}, add the
3768 #define LTTNG_UST_TRACEPOINT_DEFINE
3772 . Compile the user library source file:
3777 $ gcc -I. -fpic -c emon.c
3781 . Build the user library shared object:
3786 $ gcc -shared -o libemon.so emon.o -ldl -L. -ltpp
3790 To build the application:
3792 . Compile the application source file:
3801 . Build the application:
3806 $ gcc -o app app.o -L. -lemon
3810 To run the application:
3812 * Start the application:
3822 The tracepoint provider package shared object is preloaded before the
3825 The application is linked with the instrumented user library.
3827 image::ust-sit+tp-so-preloaded+app-linked-with-lib+lib-instrumented.png[]
3830 include::../common/ust-sit-step-tp-so.txt[]
3832 To build the instrumented user library:
3834 . In path:{emon.c}, before including path:{tpp.h}, add the
3840 #define LTTNG_UST_TRACEPOINT_DEFINE
3841 #define LTTNG_UST_TRACEPOINT_PROBE_DYNAMIC_LINKAGE
3845 . Compile the user library source file:
3850 $ gcc -I. -fpic -c emon.c
3854 . Build the user library shared object:
3859 $ gcc -shared -o libemon.so emon.o -ldl
3863 To build the application:
3865 . Compile the application source file:
3874 . Build the application:
3879 $ gcc -o app app.o -L. -lemon
3883 To run the application with tracing support:
3885 * Preload the tracepoint provider package shared object and
3886 start the application:
3891 $ LD_PRELOAD=./libtpp.so ./app
3895 To run the application without tracing support:
3897 * Start the application:
3907 The application is linked with the instrumented user library.
3909 The instrumented user library dynamically loads the tracepoint provider
3910 package shared object.
3912 image::ust-sit+app-linked-with-lib+lib-dlopens-tp-so+lib-instrumented.png[]
3915 include::../common/ust-sit-step-tp-so.txt[]
3917 To build the instrumented user library:
3919 . In path:{emon.c}, before including path:{tpp.h}, add the
3925 #define LTTNG_UST_TRACEPOINT_DEFINE
3926 #define LTTNG_UST_TRACEPOINT_PROBE_DYNAMIC_LINKAGE
3930 . Compile the user library source file:
3935 $ gcc -I. -fpic -c emon.c
3939 . Build the user library shared object:
3944 $ gcc -shared -o libemon.so emon.o -ldl
3948 To build the application:
3950 . Compile the application source file:
3959 . Build the application:
3964 $ gcc -o app app.o -L. -lemon
3968 To run the application:
3970 * Start the application:
3980 The application dynamically loads the instrumented user library.
3982 The instrumented user library is linked with the tracepoint provider
3983 package shared object.
3985 image::ust-sit+app-dlopens-lib+lib-linked-with-tp-so+lib-instrumented.png[]
3988 include::../common/ust-sit-step-tp-so.txt[]
3990 To build the instrumented user library:
3992 . In path:{emon.c}, before including path:{tpp.h}, add the
3998 #define LTTNG_UST_TRACEPOINT_DEFINE
4002 . Compile the user library source file:
4007 $ gcc -I. -fpic -c emon.c
4011 . Build the user library shared object:
4016 $ gcc -shared -o libemon.so emon.o -ldl -L. -ltpp
4020 To build the application:
4022 . Compile the application source file:
4031 . Build the application:
4036 $ gcc -o app app.o -ldl -L. -lemon
4040 To run the application:
4042 * Start the application:
4052 The application dynamically loads the instrumented user library.
4054 The instrumented user library dynamically loads the tracepoint provider
4055 package shared object.
4057 image::ust-sit+app-dlopens-lib+lib-dlopens-tp-so+lib-instrumented.png[]
4060 include::../common/ust-sit-step-tp-so.txt[]
4062 To build the instrumented user library:
4064 . In path:{emon.c}, before including path:{tpp.h}, add the
4070 #define LTTNG_UST_TRACEPOINT_DEFINE
4071 #define LTTNG_UST_TRACEPOINT_PROBE_DYNAMIC_LINKAGE
4075 . Compile the user library source file:
4080 $ gcc -I. -fpic -c emon.c
4084 . Build the user library shared object:
4089 $ gcc -shared -o libemon.so emon.o -ldl
4093 To build the application:
4095 . Compile the application source file:
4104 . Build the application:
4109 $ gcc -o app app.o -ldl -L. -lemon
4113 To run the application:
4115 * Start the application:
4125 The tracepoint provider package shared object is preloaded before the
4128 The application dynamically loads the instrumented user library.
4130 image::ust-sit+tp-so-preloaded+app-dlopens-lib+lib-instrumented.png[]
4133 include::../common/ust-sit-step-tp-so.txt[]
4135 To build the instrumented user library:
4137 . In path:{emon.c}, before including path:{tpp.h}, add the
4143 #define LTTNG_UST_TRACEPOINT_DEFINE
4144 #define LTTNG_UST_TRACEPOINT_PROBE_DYNAMIC_LINKAGE
4148 . Compile the user library source file:
4153 $ gcc -I. -fpic -c emon.c
4157 . Build the user library shared object:
4162 $ gcc -shared -o libemon.so emon.o -ldl
4166 To build the application:
4168 . Compile the application source file:
4177 . Build the application:
4182 $ gcc -o app app.o -L. -lemon
4186 To run the application with tracing support:
4188 * Preload the tracepoint provider package shared object and
4189 start the application:
4194 $ LD_PRELOAD=./libtpp.so ./app
4198 To run the application without tracing support:
4200 * Start the application:
4210 The application is statically linked with the tracepoint provider
4211 package object file.
4213 The application is linked with the instrumented user library.
4215 image::ust-sit+app-linked-with-tp-o+app-linked-with-lib+lib-instrumented.png[]
4218 include::../common/ust-sit-step-tp-o.txt[]
4220 To build the instrumented user library:
4222 . In path:{emon.c}, before including path:{tpp.h}, add the
4228 #define LTTNG_UST_TRACEPOINT_DEFINE
4232 . Compile the user library source file:
4237 $ gcc -I. -fpic -c emon.c
4241 . Build the user library shared object:
4246 $ gcc -shared -o libemon.so emon.o
4250 To build the application:
4252 . Compile the application source file:
4261 . Build the application:
4266 $ gcc -o app app.o tpp.o -llttng-ust -ldl -L. -lemon
4270 To run the instrumented application:
4272 * Start the application:
4282 The application is statically linked with the tracepoint provider
4283 package object file.
4285 The application dynamically loads the instrumented user library.
4287 image::ust-sit+app-linked-with-tp-o+app-dlopens-lib+lib-instrumented.png[]
4290 include::../common/ust-sit-step-tp-o.txt[]
4292 To build the application:
4294 . In path:{app.c}, before including path:{tpp.h}, add the following line:
4299 #define LTTNG_UST_TRACEPOINT_DEFINE
4303 . Compile the application source file:
4312 . Build the application:
4317 $ gcc -Wl,--export-dynamic -o app app.o tpp.o \
4322 The `--export-dynamic` option passed to the linker is necessary for the
4323 dynamically loaded library to ``see'' the tracepoint symbols defined in
4326 To build the instrumented user library:
4328 . Compile the user library source file:
4333 $ gcc -I. -fpic -c emon.c
4337 . Build the user library shared object:
4342 $ gcc -shared -o libemon.so emon.o
4346 To run the application:
4348 * Start the application:
4359 [[using-lttng-ust-with-daemons]]
4360 ===== Use noch:{LTTng-UST} with daemons
4362 If your instrumented application calls man:fork(2), man:clone(2),
4363 or BSD's man:rfork(2), without a following man:exec(3)-family
4364 system call, you must preload the path:{liblttng-ust-fork.so} shared
4365 object when you start the application.
4369 $ LD_PRELOAD=liblttng-ust-fork.so ./my-app
4372 If your tracepoint provider package is
4373 a shared library which you also preload, you must put both
4374 shared objects in env:LD_PRELOAD:
4378 $ LD_PRELOAD=liblttng-ust-fork.so:/path/to/tp.so ./my-app
4384 ===== Use noch:{LTTng-UST} with applications which close file descriptors that don't belong to them
4386 If your instrumented application closes one or more file descriptors
4387 which it did not open itself, you must preload the
4388 path:{liblttng-ust-fd.so} shared object when you start the application:
4392 $ LD_PRELOAD=liblttng-ust-fd.so ./my-app
4395 Typical use cases include closing all the file descriptors after
4396 man:fork(2) or man:rfork(2) and buggy applications doing
4400 [[lttng-ust-pkg-config]]
4401 ===== Use noch:{pkg-config}
4403 On some distributions, LTTng-UST ships with a
4404 https://www.freedesktop.org/wiki/Software/pkg-config/[pkg-config]
4405 metadata file. If this is your case, then use cmd:pkg-config to
4406 build an application on the command line:
4410 $ gcc -o my-app my-app.o tp.o $(pkg-config --cflags --libs lttng-ust)
4414 [[instrumenting-32-bit-app-on-64-bit-system]]
4415 ===== [[advanced-instrumenting-techniques]]Build a 32-bit instrumented application for a 64-bit target system
4417 In order to trace a 32-bit application running on a 64-bit system,
4418 LTTng must use a dedicated 32-bit
4419 <<lttng-consumerd,consumer daemon>>.
4421 The following steps show how to build and install a 32-bit consumer
4422 daemon, which is _not_ part of the default 64-bit LTTng build, how to
4423 build and install the 32-bit LTTng-UST libraries, and how to build and
4424 link an instrumented 32-bit application in that context.
4426 To build a 32-bit instrumented application for a 64-bit target system,
4427 assuming you have a fresh target system with no installed Userspace RCU
4430 . Download, build, and install a 32-bit version of Userspace RCU:
4435 $ cd $(mktemp -d) &&
4436 wget https://lttng.org/files/urcu/userspace-rcu-latest-0.13.tar.bz2 &&
4437 tar -xf userspace-rcu-latest-0.13.tar.bz2 &&
4438 cd userspace-rcu-0.13.* &&
4439 ./configure --libdir=/usr/local/lib32 CFLAGS=-m32 &&
4441 sudo make install &&
4446 . Using the package manager of your distribution, or from source,
4447 install the 32-bit versions of the following dependencies of
4448 LTTng-tools and LTTng-UST:
4451 * https://sourceforge.net/projects/libuuid/[libuuid]
4452 * https://directory.fsf.org/wiki/Popt[popt]
4453 * https://www.xmlsoft.org/[libxml2]
4454 * **Optional**: https://github.com/numactl/numactl[numactl]
4457 . Download, build, and install a 32-bit version of the latest
4458 LTTng-UST{nbsp}{revision}:
4463 $ cd $(mktemp -d) &&
4464 wget https://lttng.org/files/lttng-ust/lttng-ust-latest-2.13.tar.bz2 &&
4465 tar -xf lttng-ust-latest-2.13.tar.bz2 &&
4466 cd lttng-ust-2.13.* &&
4467 ./configure --libdir=/usr/local/lib32 \
4468 CFLAGS=-m32 CXXFLAGS=-m32 \
4469 LDFLAGS='-L/usr/local/lib32 -L/usr/lib32' &&
4471 sudo make install &&
4476 Add `--disable-numa` to `./configure` if you don't have
4477 https://github.com/numactl/numactl[numactl].
4481 Depending on your distribution, 32-bit libraries could be installed at a
4482 different location than `/usr/lib32`. For example, Debian is known to
4483 install some 32-bit libraries in `/usr/lib/i386-linux-gnu`.
4485 In this case, make sure to set `LDFLAGS` to all the
4486 relevant 32-bit library paths, for example:
4490 $ LDFLAGS='-L/usr/lib/i386-linux-gnu -L/usr/lib32'
4494 . Download the latest LTTng-tools{nbsp}{revision}, build, and install
4495 the 32-bit consumer daemon:
4500 $ cd $(mktemp -d) &&
4501 wget https://lttng.org/files/lttng-tools/lttng-tools-latest-2.13.tar.bz2 &&
4502 tar -xf lttng-tools-latest-2.13.tar.bz2 &&
4503 cd lttng-tools-2.13.* &&
4504 ./configure --libdir=/usr/local/lib32 CFLAGS=-m32 CXXFLAGS=-m32 \
4505 LDFLAGS='-L/usr/local/lib32 -L/usr/lib32' \
4506 --disable-bin-lttng --disable-bin-lttng-crash \
4507 --disable-bin-lttng-relayd --disable-bin-lttng-sessiond &&
4509 cd src/bin/lttng-consumerd &&
4510 sudo make install &&
4515 . From your distribution or from source, <<installing-lttng,install>>
4516 the 64-bit versions of LTTng-UST and Userspace RCU.
4518 . Download, build, and install the 64-bit version of the
4519 latest LTTng-tools{nbsp}{revision}:
4524 $ cd $(mktemp -d) &&
4525 wget https://lttng.org/files/lttng-tools/lttng-tools-latest-2.13.tar.bz2 &&
4526 tar -xf lttng-tools-latest-2.13.tar.bz2 &&
4527 cd lttng-tools-2.13.* &&
4528 ./configure --with-consumerd32-libdir=/usr/local/lib32 \
4529 --with-consumerd32-bin=/usr/local/lib32/lttng/libexec/lttng-consumerd &&
4531 sudo make install &&
4536 . Pass the following options to man:gcc(1), man:g++(1), or man:clang(1)
4537 when linking your 32-bit application:
4540 -m32 -L/usr/lib32 -L/usr/local/lib32 \
4541 -Wl,-rpath,/usr/lib32,-rpath,/usr/local/lib32
4544 For example, let's rebuild the quick start example in
4545 ``<<tracing-your-own-user-application,Record user application events>>''
4546 as an instrumented 32-bit application:
4551 $ gcc -m32 -c -I. hello-tp.c
4552 $ gcc -m32 -c hello.c
4553 $ gcc -m32 -o hello hello.o hello-tp.o \
4554 -L/usr/lib32 -L/usr/local/lib32 \
4555 -Wl,-rpath,/usr/lib32,-rpath,/usr/local/lib32 \
4560 No special action is required to execute the 32-bit application and
4561 for LTTng to trace it: use the command-line man:lttng(1) tool as usual.
4566 ==== Use `lttng_ust_tracef()`
4568 man:lttng_ust_tracef(3) is a small LTTng-UST API designed for quick,
4569 man:printf(3)-like instrumentation without the burden of
4570 <<tracepoint-provider,creating>> and
4571 <<building-tracepoint-providers-and-user-application,building>>
4572 a tracepoint provider package.
4574 To use `lttng_ust_tracef()` in your application:
4576 . In the C or $$C++$$ source files where you need to use
4577 `lttng_ust_tracef()`, include `<lttng/tracef.h>`:
4582 #include <lttng/tracef.h>
4586 . In the source code of the application, use `lttng_ust_tracef()` like
4587 you would use man:printf(3):
4594 lttng_ust_tracef("my message: %d (%s)", my_integer, my_string);
4600 . Link your application with `liblttng-ust`:
4605 $ gcc -o app app.c -llttng-ust
4609 To record the events that `lttng_ust_tracef()` calls emit:
4611 * <<enabling-disabling-events,Create a recording event rule>> which
4612 matches user space events named `lttng_ust_tracef:*`:
4617 $ lttng enable-event --userspace 'lttng_ust_tracef:*'
4622 .Limitations of `lttng_ust_tracef()`
4624 The `lttng_ust_tracef()` utility function was developed to make user
4625 space tracing super simple, albeit with notable disadvantages compared
4626 to <<defining-tracepoints,user-defined tracepoints>>:
4628 * All the created events have the same tracepoint provider and
4629 tracepoint names, respectively `lttng_ust_tracef` and `event`.
4630 * There's no static type checking.
4631 * The only event record field you actually get, named `msg`, is a string
4632 potentially containing the values you passed to `lttng_ust_tracef()`
4633 using your own format string. This also means that you can't filter
4634 events with a custom expression at run time because there are no
4636 * Since `lttng_ust_tracef()` uses the man:vasprintf(3) function of the
4637 C{nbsp}standard library behind the scenes to format the strings at run
4638 time, its expected performance is lower than with user-defined
4639 tracepoints, which don't require a conversion to a string.
4641 Taking this into consideration, `lttng_ust_tracef()` is useful for some
4642 quick prototyping and debugging, but you shouldn't consider it for any
4643 permanent and serious applicative instrumentation.
4649 ==== Use `lttng_ust_tracelog()`
4651 The man:tracelog(3) API is very similar to
4652 <<tracef,`lttng_ust_tracef()`>>, with the difference that it accepts an
4653 additional log level parameter.
4655 The goal of `lttng_ust_tracelog()` is to ease the migration from logging
4658 To use `lttng_ust_tracelog()` in your application:
4660 . In the C or $$C++$$ source files where you need to use `tracelog()`,
4661 include `<lttng/tracelog.h>`:
4666 #include <lttng/tracelog.h>
4670 . In the source code of the application, use `lttng_ust_tracelog()` like
4671 you would use man:printf(3), except for the first parameter which is
4679 tracelog(LTTNG_UST_TRACEPOINT_LOGLEVEL_WARNING,
4680 "my message: %d (%s)", my_integer, my_string);
4686 See man:lttng-ust(3) for a list of available log level names.
4688 . Link your application with `liblttng-ust`:
4693 $ gcc -o app app.c -llttng-ust
4697 To record the events that `lttng_ust_tracelog()` calls emit with a log
4698 level _at least as severe as_ a specific log level:
4700 * <<enabling-disabling-events,Create a recording event rule>> which
4701 matches user space tracepoint events named `lttng_ust_tracelog:*` and
4702 with some minimum level of severity:
4707 $ lttng enable-event --userspace 'lttng_ust_tracelog:*' \
4712 To record the events that `lttng_ust_tracelog()` calls emit with a
4713 _specific log level_:
4715 * Create a recording event rule which matches tracepoint events named
4716 `lttng_ust_tracelog:*` and with a specific log level:
4721 $ lttng enable-event --userspace 'lttng_ust_tracelog:*' \
4722 --loglevel-only=INFO
4727 [[prebuilt-ust-helpers]]
4728 === Load a prebuilt user space tracing helper
4730 The LTTng-UST package provides a few helpers in the form of preloadable
4731 shared objects which automatically instrument system functions and
4734 The helper shared objects are normally found in dir:{/usr/lib}. If you
4735 built LTTng-UST <<building-from-source,from source>>, they're probably
4736 located in dir:{/usr/local/lib}.
4738 The installed user space tracing helpers in LTTng-UST{nbsp}{revision}
4741 path:{liblttng-ust-libc-wrapper.so}::
4742 path:{liblttng-ust-pthread-wrapper.so}::
4743 <<liblttng-ust-libc-pthread-wrapper,C{nbsp}standard library
4744 memory and POSIX threads function tracing>>.
4746 path:{liblttng-ust-cyg-profile.so}::
4747 path:{liblttng-ust-cyg-profile-fast.so}::
4748 <<liblttng-ust-cyg-profile,Function entry and exit tracing>>.
4750 path:{liblttng-ust-dl.so}::
4751 <<liblttng-ust-dl,Dynamic linker tracing>>.
4753 To use a user space tracing helper with any user application:
4755 * Preload the helper shared object when you start the application:
4760 $ LD_PRELOAD=liblttng-ust-libc-wrapper.so my-app
4764 You can preload more than one helper:
4769 $ LD_PRELOAD=liblttng-ust-libc-wrapper.so:liblttng-ust-dl.so my-app
4775 [[liblttng-ust-libc-pthread-wrapper]]
4776 ==== Instrument C standard library memory and POSIX threads functions
4778 The path:{liblttng-ust-libc-wrapper.so} and
4779 path:{liblttng-ust-pthread-wrapper.so} helpers
4780 add instrumentation to some C standard library and POSIX
4784 .Functions instrumented by preloading path:{liblttng-ust-libc-wrapper.so}.
4786 |TP provider name |TP name |Instrumented function
4788 .6+|`lttng_ust_libc` |`malloc` |man:malloc(3)
4789 |`calloc` |man:calloc(3)
4790 |`realloc` |man:realloc(3)
4791 |`free` |man:free(3)
4792 |`memalign` |man:memalign(3)
4793 |`posix_memalign` |man:posix_memalign(3)
4797 .Functions instrumented by preloading path:{liblttng-ust-pthread-wrapper.so}.
4799 |TP provider name |TP name |Instrumented function
4801 .4+|`lttng_ust_pthread` |`pthread_mutex_lock_req` |man:pthread_mutex_lock(3p) (request time)
4802 |`pthread_mutex_lock_acq` |man:pthread_mutex_lock(3p) (acquire time)
4803 |`pthread_mutex_trylock` |man:pthread_mutex_trylock(3p)
4804 |`pthread_mutex_unlock` |man:pthread_mutex_unlock(3p)
4807 When you preload the shared object, it replaces the functions listed
4808 in the previous tables by wrappers which contain tracepoints and call
4809 the replaced functions.
4812 [[liblttng-ust-cyg-profile]]
4813 ==== Instrument function entry and exit
4815 The path:{liblttng-ust-cyg-profile*.so} helpers can add instrumentation
4816 to the entry and exit points of functions.
4818 man:gcc(1) and man:clang(1) have an option named
4819 https://gcc.gnu.org/onlinedocs/gcc/Instrumentation-Options.html[`-finstrument-functions`]
4820 which generates instrumentation calls for entry and exit to functions.
4821 The LTTng-UST function tracing helpers,
4822 path:{liblttng-ust-cyg-profile.so} and
4823 path:{liblttng-ust-cyg-profile-fast.so}, take advantage of this feature
4824 to add tracepoints to the two generated functions (which contain
4825 `cyg_profile` in their names, hence the name of the helper).
4827 To use the LTTng-UST function tracing helper, the source files to
4828 instrument must be built using the `-finstrument-functions` compiler
4831 There are two versions of the LTTng-UST function tracing helper:
4833 * **path:{liblttng-ust-cyg-profile-fast.so}** is a lightweight variant
4834 that you should only use when it can be _guaranteed_ that the
4835 complete event stream is recorded without any lost event record.
4836 Any kind of duplicate information is left out.
4838 Assuming no event record is lost, having only the function addresses on
4839 entry is enough to create a call graph, since an event record always
4840 contains the ID of the CPU that generated it.
4842 Use a tool like man:addr2line(1) to convert function addresses back to
4843 source file names and line numbers.
4845 * **path:{liblttng-ust-cyg-profile.so}** is a more robust variant
4846 which also works in use cases where event records might get discarded or
4847 not recorded from application startup.
4848 In these cases, the trace analyzer needs more information to be
4849 able to reconstruct the program flow.
4851 See man:lttng-ust-cyg-profile(3) to learn more about the instrumentation
4852 points of this helper.
4854 All the tracepoints that this helper provides have the log level
4855 `LTTNG_UST_TRACEPOINT_LOGLEVEL_DEBUG_FUNCTION` (see man:lttng-ust(3)).
4857 TIP: It's sometimes a good idea to limit the number of source files that
4858 you compile with the `-finstrument-functions` option to prevent LTTng
4859 from writing an excessive amount of trace data at run time. When using
4861 `-finstrument-functions-exclude-function-list` option to avoid
4862 instrument entries and exits of specific function names.
4867 ==== Instrument the dynamic linker
4869 The path:{liblttng-ust-dl.so} helper adds instrumentation to the
4870 man:dlopen(3) and man:dlclose(3) function calls.
4872 See man:lttng-ust-dl(3) to learn more about the instrumentation points
4877 [[java-application]]
4878 === Instrument a Java application
4880 You can instrument any Java application which uses one of the following
4883 * The https://docs.oracle.com/javase/7/docs/api/java/util/logging/package-summary.html[**`java.util.logging`**]
4884 (JUL) core logging facilities.
4886 * https://logging.apache.org/log4j/1.2/[**Apache log4j{nbsp}1.2**], since
4887 LTTng{nbsp}2.6. Note that Apache Log4j{nbsp}2 isn't supported.
4890 .LTTng-UST Java agent imported by a Java application.
4891 image::java-app.png[]
4893 Note that the methods described below are new in LTTng{nbsp}2.8.
4894 Previous LTTng versions use another technique.
4896 NOTE: We use https://openjdk.java.net/[OpenJDK]{nbsp}8 for development
4897 and https://ci.lttng.org/[continuous integration], thus this version is
4898 directly supported. However, the LTTng-UST Java agent is also tested
4899 with OpenJDK{nbsp}7.
4904 ==== Use the LTTng-UST Java agent for `java.util.logging`
4906 To use the LTTng-UST Java agent in a Java application which uses
4907 `java.util.logging` (JUL):
4909 . In the source code of the Java application, import the LTTng-UST log
4910 handler package for `java.util.logging`:
4915 import org.lttng.ust.agent.jul.LttngLogHandler;
4919 . Create an LTTng-UST `java.util.logging` log handler:
4924 Handler lttngUstLogHandler = new LttngLogHandler();
4928 . Add this handler to the `java.util.logging` loggers which should emit
4934 Logger myLogger = Logger.getLogger("some-logger");
4936 myLogger.addHandler(lttngUstLogHandler);
4940 . Use `java.util.logging` log statements and configuration as usual.
4941 The loggers with an attached LTTng-UST log handler can emit
4944 . Before exiting the application, remove the LTTng-UST log handler from
4945 the loggers attached to it and call its `close()` method:
4950 myLogger.removeHandler(lttngUstLogHandler);
4951 lttngUstLogHandler.close();
4955 This isn't strictly necessary, but it's recommended for a clean
4956 disposal of the resources of the handler.
4958 . Include the common and JUL-specific JAR files of the LTTng-UST Java agent,
4959 path:{lttng-ust-agent-common.jar} and path:{lttng-ust-agent-jul.jar},
4961 https://docs.oracle.com/javase/tutorial/essential/environment/paths.html[class
4962 path] when you build the Java application.
4964 The JAR files are typically located in dir:{/usr/share/java}.
4966 IMPORTANT: The LTTng-UST Java agent must be
4967 <<installing-lttng,installed>> for the logging framework your
4970 .Use the LTTng-UST Java agent for `java.util.logging`.
4975 import java.io.IOException;
4976 import java.util.logging.Handler;
4977 import java.util.logging.Logger;
4978 import org.lttng.ust.agent.jul.LttngLogHandler;
4982 private static final int answer = 42;
4984 public static void main(String[] argv) throws Exception
4987 Logger logger = Logger.getLogger("jello");
4989 // Create an LTTng-UST log handler
4990 Handler lttngUstLogHandler = new LttngLogHandler();
4992 // Add the LTTng-UST log handler to our logger
4993 logger.addHandler(lttngUstLogHandler);
4996 logger.info("some info");
4997 logger.warning("some warning");
4999 logger.finer("finer information; the answer is " + answer);
5001 logger.severe("error!");
5003 // Not mandatory, but cleaner
5004 logger.removeHandler(lttngUstLogHandler);
5005 lttngUstLogHandler.close();
5014 $ javac -cp /usr/share/java/jarpath/lttng-ust-agent-common.jar:/usr/share/java/jarpath/lttng-ust-agent-jul.jar Test.java
5017 <<creating-destroying-tracing-sessions,Create a recording session>>,
5018 <<enabling-disabling-events,create a recording event rule>> matching JUL
5019 events named `jello`, and <<basic-tracing-session-control,start
5025 $ lttng enable-event --jul jello
5029 Run the compiled class:
5033 $ java -cp /usr/share/java/jarpath/lttng-ust-agent-common.jar:/usr/share/java/jarpath/lttng-ust-agent-jul.jar:. Test
5036 <<basic-tracing-session-control,Stop recording>> and inspect the
5046 In the resulting trace, an <<event,event record>> which a Java
5047 application using `java.util.logging` generated is named
5048 `lttng_jul:event` and has the following fields:
5057 Name of the class in which the log statement was executed.
5060 Name of the method in which the log statement was executed.
5063 Logging time (timestamp in milliseconds).
5066 Log level integer value.
5069 ID of the thread in which the log statement was executed.
5071 Use the opt:lttng-enable-event(1):--loglevel or
5072 opt:lttng-enable-event(1):--loglevel-only option of the
5073 man:lttng-enable-event(1) command to target a range of
5074 `java.util.logging` log levels or a specific `java.util.logging` log
5080 ==== Use the LTTng-UST Java agent for Apache log4j
5082 To use the LTTng-UST Java agent in a Java application which uses
5083 Apache log4j{nbsp}1.2:
5085 . In the source code of the Java application, import the LTTng-UST log
5086 appender package for Apache log4j:
5091 import org.lttng.ust.agent.log4j.LttngLogAppender;
5095 . Create an LTTng-UST log4j log appender:
5100 Appender lttngUstLogAppender = new LttngLogAppender();
5104 . Add this appender to the log4j loggers which should emit LTTng events:
5109 Logger myLogger = Logger.getLogger("some-logger");
5111 myLogger.addAppender(lttngUstLogAppender);
5115 . Use Apache log4j log statements and configuration as usual. The
5116 loggers with an attached LTTng-UST log appender can emit LTTng events.
5118 . Before exiting the application, remove the LTTng-UST log appender from
5119 the loggers attached to it and call its `close()` method:
5124 myLogger.removeAppender(lttngUstLogAppender);
5125 lttngUstLogAppender.close();
5129 This isn't strictly necessary, but it's recommended for a clean
5130 disposal of the resources of the appender.
5132 . Include the common and log4j-specific JAR
5133 files of the LTTng-UST Java agent, path:{lttng-ust-agent-common.jar} and
5134 path:{lttng-ust-agent-log4j.jar}, in the
5135 https://docs.oracle.com/javase/tutorial/essential/environment/paths.html[class
5136 path] when you build the Java application.
5138 The JAR files are typically located in dir:{/usr/share/java}.
5140 IMPORTANT: The LTTng-UST Java agent must be
5141 <<installing-lttng,installed>> for the logging framework your
5144 .Use the LTTng-UST Java agent for Apache log4j.
5149 import org.apache.log4j.Appender;
5150 import org.apache.log4j.Logger;
5151 import org.lttng.ust.agent.log4j.LttngLogAppender;
5155 private static final int answer = 42;
5157 public static void main(String[] argv) throws Exception
5160 Logger logger = Logger.getLogger("jello");
5162 // Create an LTTng-UST log appender
5163 Appender lttngUstLogAppender = new LttngLogAppender();
5165 // Add the LTTng-UST log appender to our logger
5166 logger.addAppender(lttngUstLogAppender);
5169 logger.info("some info");
5170 logger.warn("some warning");
5172 logger.debug("debug information; the answer is " + answer);
5174 logger.fatal("error!");
5176 // Not mandatory, but cleaner
5177 logger.removeAppender(lttngUstLogAppender);
5178 lttngUstLogAppender.close();
5184 Build this example (`$LOG4JPATH` is the path to the Apache log4j JAR
5189 $ javac -cp /usr/share/java/jarpath/lttng-ust-agent-common.jar:/usr/share/java/jarpath/lttng-ust-agent-log4j.jar:$LOG4JPATH Test.java
5192 <<creating-destroying-tracing-sessions,Create a recording session>>,
5193 <<enabling-disabling-events,create a recording event rule>> matching
5194 log4j events named `jello`, and <<basic-tracing-session-control,start
5200 $ lttng enable-event --log4j jello
5204 Run the compiled class:
5208 $ java -cp /usr/share/java/jarpath/lttng-ust-agent-common.jar:/usr/share/java/jarpath/lttng-ust-agent-log4j.jar:$LOG4JPATH:. Test
5211 <<basic-tracing-session-control,Stop recording>> and inspect the
5221 In the resulting trace, an <<event,event record>> which a Java
5222 application using log4j generated is named `lttng_log4j:event` and
5223 has the following fields:
5232 Name of the class in which the log statement was executed.
5235 Name of the method in which the log statement was executed.
5238 Name of the file in which the executed log statement is located.
5241 Line number at which the log statement was executed.
5247 Log level integer value.
5250 Name of the Java thread in which the log statement was executed.
5252 Use the opt:lttng-enable-event(1):--loglevel or
5253 opt:lttng-enable-event(1):--loglevel-only option of the
5254 man:lttng-enable-event(1) command to target a range of Apache log4j
5255 log levels or a specific log4j log level.
5259 [[java-application-context]]
5260 ==== Provide application-specific context fields in a Java application
5262 A Java application-specific context field is a piece of state which
5263 the Java application provides. You can <<adding-context,add>> such
5264 a context field to be recorded, using the
5265 man:lttng-add-context(1) command, to each <<event,event record>>
5266 which the log statements of this application produce.
5268 For example, a given object might have a current request ID variable.
5269 You can create a context information retriever for this object and
5270 assign a name to this current request ID. You can then, using the
5271 man:lttng-add-context(1) command, add this context field by name so that
5272 LTTng writes it to the event records of a given `java.util.logging` or
5273 log4j <<channel,channel>>.
5275 To provide application-specific context fields in a Java application:
5277 . In the source code of the Java application, import the LTTng-UST
5278 Java agent context classes and interfaces:
5283 import org.lttng.ust.agent.context.ContextInfoManager;
5284 import org.lttng.ust.agent.context.IContextInfoRetriever;
5288 . Create a context information retriever class, that is, a class which
5289 implements the `IContextInfoRetriever` interface:
5294 class MyContextInfoRetriever implements IContextInfoRetriever
5297 public Object retrieveContextInfo(String key)
5299 if (key.equals("intCtx")) {
5301 } else if (key.equals("strContext")) {
5302 return "context value!";
5311 This `retrieveContextInfo()` method is the only member of the
5312 `IContextInfoRetriever` interface. Its role is to return the current
5313 value of a state by name to create a context field. The names of the
5314 context fields and which state variables they return depends on your
5317 All primitive types and objects are supported as context fields.
5318 When `retrieveContextInfo()` returns an object, the context field
5319 serializer calls its `toString()` method to add a string field to
5320 event records. The method can also return `null`, which means that
5321 no context field is available for the required name.
5323 . Register an instance of your context information retriever class to
5324 the context information manager singleton:
5329 IContextInfoRetriever cir = new MyContextInfoRetriever();
5330 ContextInfoManager cim = ContextInfoManager.getInstance();
5331 cim.registerContextInfoRetriever("retrieverName", cir);
5335 . Before exiting the application, remove your context information
5336 retriever from the context information manager singleton:
5341 ContextInfoManager cim = ContextInfoManager.getInstance();
5342 cim.unregisterContextInfoRetriever("retrieverName");
5346 This isn't strictly necessary, but it's recommended for a clean
5347 disposal of some resources of the manager.
5349 . Build your Java application with LTTng-UST Java agent support as
5350 usual, following the procedure for either the
5351 <<jul,`java.util.logging`>> or <<log4j,Apache log4j>> framework.
5353 .Provide application-specific context fields in a Java application.
5358 import java.util.logging.Handler;
5359 import java.util.logging.Logger;
5360 import org.lttng.ust.agent.jul.LttngLogHandler;
5361 import org.lttng.ust.agent.context.ContextInfoManager;
5362 import org.lttng.ust.agent.context.IContextInfoRetriever;
5366 // Our context information retriever class
5367 private static class MyContextInfoRetriever
5368 implements IContextInfoRetriever
5371 public Object retrieveContextInfo(String key) {
5372 if (key.equals("intCtx")) {
5374 } else if (key.equals("strContext")) {
5375 return "context value!";
5382 private static final int answer = 42;
5384 public static void main(String args[]) throws Exception
5386 // Get the context information manager instance
5387 ContextInfoManager cim = ContextInfoManager.getInstance();
5389 // Create and register our context information retriever
5390 IContextInfoRetriever cir = new MyContextInfoRetriever();
5391 cim.registerContextInfoRetriever("myRetriever", cir);
5394 Logger logger = Logger.getLogger("jello");
5396 // Create an LTTng-UST log handler
5397 Handler lttngUstLogHandler = new LttngLogHandler();
5399 // Add the LTTng-UST log handler to our logger
5400 logger.addHandler(lttngUstLogHandler);
5403 logger.info("some info");
5404 logger.warning("some warning");
5406 logger.finer("finer information; the answer is " + answer);
5408 logger.severe("error!");
5410 // Not mandatory, but cleaner
5411 logger.removeHandler(lttngUstLogHandler);
5412 lttngUstLogHandler.close();
5413 cim.unregisterContextInfoRetriever("myRetriever");
5422 $ javac -cp /usr/share/java/jarpath/lttng-ust-agent-common.jar:/usr/share/java/jarpath/lttng-ust-agent-jul.jar Test.java
5425 <<creating-destroying-tracing-sessions,Create a recording session>> and
5426 <<enabling-disabling-events,create a recording event rule>> matching
5427 `java.util.logging` events named `jello`:
5432 $ lttng enable-event --jul jello
5435 <<adding-context,Add the application-specific context fields>> to be
5436 recorded to the event records of the `java.util.logging` channel:
5440 $ lttng add-context --jul --type='$app.myRetriever:intCtx'
5441 $ lttng add-context --jul --type='$app.myRetriever:strContext'
5444 <<basic-tracing-session-control,Start recording>>:
5451 Run the compiled class:
5455 $ java -cp /usr/share/java/jarpath/lttng-ust-agent-common.jar:/usr/share/java/jarpath/lttng-ust-agent-jul.jar:. Test
5458 <<basic-tracing-session-control,Stop recording>> and inspect the
5470 [[python-application]]
5471 === Instrument a Python application
5473 You can instrument a Python{nbsp}2 or Python{nbsp}3 application which
5475 https://docs.python.org/3/library/logging.html[`logging`] package.
5477 Each log statement creates an LTTng event once the application module
5478 imports the <<lttng-ust-agents,LTTng-UST Python agent>> package.
5481 .A Python application importing the LTTng-UST Python agent.
5482 image::python-app.png[]
5484 To use the LTTng-UST Python agent:
5486 . In the source code of the Python application, import the LTTng-UST
5496 The LTTng-UST Python agent automatically adds its logging handler to the
5497 root logger at import time.
5499 A log statement that the application executes before this import doesn't
5500 create an LTTng event.
5502 IMPORTANT: The LTTng-UST Python agent must be
5503 <<installing-lttng,installed>>.
5505 . Use log statements and logging configuration as usual.
5506 Since the LTTng-UST Python agent adds a handler to the _root_
5507 logger, any log statement from any logger can emit an LTTng event.
5509 .Use the LTTng-UST Python agent.
5520 logging.basicConfig()
5521 logger = logging.getLogger('my-logger')
5524 logger.debug('debug message')
5525 logger.info('info message')
5526 logger.warn('warn message')
5527 logger.error('error message')
5528 logger.critical('critical message')
5532 if __name__ == '__main__':
5536 NOTE: `logging.basicConfig()`, which adds to the root logger a basic
5537 logging handler which prints to the standard error stream, isn't
5538 strictly required for LTTng-UST tracing to work, but in versions of
5539 Python preceding{nbsp}3.2, you could see a warning message which
5540 indicates that no handler exists for the logger `my-logger`.
5542 <<creating-destroying-tracing-sessions,Create a recording session>>,
5543 <<enabling-disabling-events,create a recording event rule>> matching
5544 Python logging events named `my-logger`, and
5545 <<basic-tracing-session-control,start recording>>:
5550 $ lttng enable-event --python my-logger
5554 Run the Python script:
5561 <<basic-tracing-session-control,Stop recording>> and inspect the
5571 In the resulting trace, an <<event,event record>> which a Python
5572 application generated is named `lttng_python:event` and has the
5576 Logging time (string).
5585 Name of the function in which the log statement was executed.
5588 Line number at which the log statement was executed.
5591 Log level integer value.
5594 ID of the Python thread in which the log statement was executed.
5597 Name of the Python thread in which the log statement was executed.
5599 Use the opt:lttng-enable-event(1):--loglevel or
5600 opt:lttng-enable-event(1):--loglevel-only option of the
5601 man:lttng-enable-event(1) command to target a range of Python log levels
5602 or a specific Python log level.
5604 When an application imports the LTTng-UST Python agent, the agent tries
5605 to register to a <<lttng-sessiond,session daemon>>. Note that you must
5606 <<start-sessiond,start the session daemon>> _before_ you run the Python
5607 application. If a session daemon is found, the agent tries to register
5608 to it during five seconds, after which the application continues
5609 without LTTng tracing support. Override this timeout value with
5610 the env:LTTNG_UST_PYTHON_REGISTER_TIMEOUT environment variable
5613 If the session daemon stops while a Python application with an imported
5614 LTTng-UST Python agent runs, the agent retries to connect and to
5615 register to a session daemon every three seconds. Override this
5616 delay with the env:LTTNG_UST_PYTHON_REGISTER_RETRY_DELAY environment
5621 [[proc-lttng-logger-abi]]
5622 === Use the LTTng logger
5624 The `lttng-tracer` Linux kernel module, part of
5625 <<lttng-modules,LTTng-modules>>, creates the special LTTng logger files
5626 path:{/proc/lttng-logger} and path:{/dev/lttng-logger} (since
5627 LTTng{nbsp}2.11) when it's loaded. Any application can write text data
5628 to any of those files to create one or more LTTng events.
5631 .An application writes to the LTTng logger file to create one or more LTTng events.
5632 image::lttng-logger.png[]
5634 The LTTng logger is the quickest method--not the most efficient,
5635 however--to add instrumentation to an application. It's designed
5636 mostly to instrument shell scripts:
5640 $ echo "Some message, some $variable" > /dev/lttng-logger
5643 Any event that the LTTng logger creates is named `lttng_logger` and
5644 belongs to the Linux kernel <<domain,tracing domain>>. However, unlike
5645 other instrumentation points in the kernel tracing domain, **any Unix
5646 user** can <<enabling-disabling-events,create a recording event rule>>
5647 which matches events named `lttng_logger`, not only the root user or
5648 users in the <<tracing-group,tracing group>>.
5650 To use the LTTng logger:
5652 * From any application, write text data to the path:{/dev/lttng-logger}
5655 The `msg` field of `lttng_logger` event records contains the
5658 NOTE: The maximum message length of an LTTng logger event is
5659 1024{nbsp}bytes. Writing more than this makes the LTTng logger emit more
5660 than one event to contain the remaining data.
5662 You shouldn't use the LTTng logger to trace a user application which you
5663 can instrument in a more efficient way, namely:
5665 * <<c-application,C and $$C++$$ applications>>.
5666 * <<java-application,Java applications>>.
5667 * <<python-application,Python applications>>.
5669 .Use the LTTng logger.
5674 echo 'Hello, World!' > /dev/lttng-logger
5676 df --human-readable --print-type / > /dev/lttng-logger
5679 <<creating-destroying-tracing-sessions,Create a recording session>>,
5680 <<enabling-disabling-events,create a recording event rule>> matching
5681 Linux kernel tracepoint events named `lttng_logger`, and
5682 <<basic-tracing-session-control,start recording>>:
5687 $ lttng enable-event --kernel lttng_logger
5691 Run the Bash script:
5698 <<basic-tracing-session-control,Stop recording>> and inspect the recorded
5709 [[instrumenting-linux-kernel]]
5710 === Instrument a Linux kernel image or module
5712 NOTE: This section shows how to _add_ instrumentation points to the
5713 Linux kernel. The subsystems of the kernel are already thoroughly
5714 instrumented at strategic points for LTTng when you
5715 <<installing-lttng,install>> the <<lttng-modules,LTTng-modules>>
5719 [[linux-add-lttng-layer]]
5720 ==== [[instrumenting-linux-kernel-itself]][[mainline-trace-event]][[lttng-adaptation-layer]]Add an LTTng layer to an existing ftrace tracepoint
5722 This section shows how to add an LTTng layer to existing ftrace
5723 instrumentation using the `TRACE_EVENT()` API.
5725 This section doesn't document the `TRACE_EVENT()` macro. Read the
5726 following articles to learn more about this API:
5728 * https://lwn.net/Articles/379903/[Using the TRACE_EVENT() macro (Part{nbsp}1)]
5729 * https://lwn.net/Articles/381064/[Using the TRACE_EVENT() macro (Part{nbsp}2)]
5730 * https://lwn.net/Articles/383362/[Using the TRACE_EVENT() macro (Part{nbsp}3)]
5732 The following procedure assumes that your ftrace tracepoints are
5733 correctly defined in their own header and that they're created in
5734 one source file using the `CREATE_TRACE_POINTS` definition.
5736 To add an LTTng layer over an existing ftrace tracepoint:
5738 . Make sure the following kernel configuration options are
5744 * `CONFIG_HIGH_RES_TIMERS`
5745 * `CONFIG_TRACEPOINTS`
5748 . Build the Linux source tree with your custom ftrace tracepoints.
5749 . Boot the resulting Linux image on your target system.
5751 Confirm that the tracepoints exist by looking for their names in the
5752 dir:{/sys/kernel/debug/tracing/events/subsys} directory, where `subsys`
5753 is your subsystem name.
5755 . Get a copy of the latest LTTng-modules{nbsp}{revision}:
5760 $ cd $(mktemp -d) &&
5761 wget https://lttng.org/files/lttng-modules/lttng-modules-latest-2.13.tar.bz2 &&
5762 tar -xf lttng-modules-latest-2.13.tar.bz2 &&
5763 cd lttng-modules-2.13.*
5767 . In dir:{instrumentation/events/lttng-module}, relative to the root
5768 of the LTTng-modules source tree, create a header file named
5769 +__subsys__.h+ for your custom subsystem +__subsys__+ and write your
5770 LTTng-modules tracepoint definitions using the LTTng-modules
5773 Start with this template:
5777 .path:{instrumentation/events/lttng-module/my_subsys.h}
5780 #define TRACE_SYSTEM my_subsys
5782 #if !defined(_LTTNG_MY_SUBSYS_H) || defined(TRACE_HEADER_MULTI_READ)
5783 #define _LTTNG_MY_SUBSYS_H
5785 #include "../../../probes/lttng-tracepoint-event.h"
5786 #include <linux/tracepoint.h>
5788 LTTNG_TRACEPOINT_EVENT(
5790 * Format is identical to the TRACE_EVENT() version for the three
5791 * following macro parameters:
5794 TP_PROTO(int my_int, const char *my_string),
5795 TP_ARGS(my_int, my_string),
5797 /* LTTng-modules specific macros */
5799 ctf_integer(int, my_int_field, my_int)
5800 ctf_string(my_bar_field, my_bar)
5804 #endif /* !defined(_LTTNG_MY_SUBSYS_H) || defined(TRACE_HEADER_MULTI_READ) */
5806 #include "../../../probes/define_trace.h"
5810 The entries in the `TP_FIELDS()` section are the list of fields for the
5811 LTTng tracepoint. This is similar to the `TP_STRUCT__entry()` part of
5812 the `TRACE_EVENT()` ftrace macro.
5814 See ``<<lttng-modules-tp-fields,Tracepoint fields macros>>'' for a
5815 complete description of the available `ctf_*()` macros.
5817 . Create the kernel module C{nbsp}source file of the LTTng-modules
5818 probe, +probes/lttng-probe-__subsys__.c+, where +__subsys__+ is your
5823 .path:{probes/lttng-probe-my-subsys.c}
5825 #include <linux/module.h>
5826 #include "../lttng-tracer.h"
5829 * Build-time verification of mismatch between mainline
5830 * TRACE_EVENT() arguments and the LTTng-modules adaptation
5831 * layer LTTNG_TRACEPOINT_EVENT() arguments.
5833 #include <trace/events/my_subsys.h>
5835 /* Create LTTng tracepoint probes */
5836 #define LTTNG_PACKAGE_BUILD
5837 #define CREATE_TRACE_POINTS
5838 #define TRACE_INCLUDE_PATH ../instrumentation/events/lttng-module
5840 #include "../instrumentation/events/lttng-module/my_subsys.h"
5842 MODULE_LICENSE("GPL and additional rights");
5843 MODULE_AUTHOR("Your name <your-email>");
5844 MODULE_DESCRIPTION("LTTng my_subsys probes");
5845 MODULE_VERSION(__stringify(LTTNG_MODULES_MAJOR_VERSION) "."
5846 __stringify(LTTNG_MODULES_MINOR_VERSION) "."
5847 __stringify(LTTNG_MODULES_PATCHLEVEL_VERSION)
5848 LTTNG_MODULES_EXTRAVERSION);
5852 . Edit path:{probes/KBuild} and add your new kernel module object
5853 next to the existing ones:
5857 .path:{probes/KBuild}
5861 obj-m += lttng-probe-module.o
5862 obj-m += lttng-probe-power.o
5864 obj-m += lttng-probe-my-subsys.o
5870 . Build and install the LTTng kernel modules:
5875 $ make KERNELDIR=/path/to/linux
5876 # make modules_install && depmod -a
5880 Replace `/path/to/linux` with the path to the Linux source tree where
5881 you defined and used tracepoints with the `TRACE_EVENT()` ftrace macro.
5883 Note that you can also use the
5884 <<lttng-tracepoint-event-code,`LTTNG_TRACEPOINT_EVENT_CODE()` macro>>
5885 instead of `LTTNG_TRACEPOINT_EVENT()` to use custom local variables and
5886 C{nbsp}code that need to be executed before LTTng records the event
5889 The best way to learn how to use the previous LTTng-modules macros is to
5890 inspect the existing LTTng-modules tracepoint definitions in the
5891 dir:{instrumentation/events/lttng-module} header files. Compare them
5892 with the Linux kernel mainline versions in the
5893 dir:{include/trace/events} directory of the Linux source tree.
5897 [[lttng-tracepoint-event-code]]
5898 ===== Use custom C code to access the data for tracepoint fields
5900 Although we recommended to always use the
5901 <<lttng-adaptation-layer,`LTTNG_TRACEPOINT_EVENT()`>> macro to describe
5902 the arguments and fields of an LTTng-modules tracepoint when possible,
5903 sometimes you need a more complex process to access the data that the
5904 tracer records as event record fields. In other words, you need local
5905 variables and multiple C{nbsp}statements instead of simple
5906 argument-based expressions that you pass to the
5907 <<lttng-modules-tp-fields,`ctf_*()` macros of `TP_FIELDS()`>>.
5909 Use the `LTTNG_TRACEPOINT_EVENT_CODE()` macro instead of
5910 `LTTNG_TRACEPOINT_EVENT()` to declare custom local variables and define
5911 a block of C{nbsp}code to be executed before LTTng records the fields.
5912 The structure of this macro is:
5915 .`LTTNG_TRACEPOINT_EVENT_CODE()` macro syntax.
5917 LTTNG_TRACEPOINT_EVENT_CODE(
5919 * Format identical to the LTTNG_TRACEPOINT_EVENT()
5920 * version for the following three macro parameters:
5923 TP_PROTO(int my_int, const char *my_string),
5924 TP_ARGS(my_int, my_string),
5926 /* Declarations of custom local variables */
5929 unsigned long b = 0;
5930 const char *name = "(undefined)";
5931 struct my_struct *my_struct;
5935 * Custom code which uses both tracepoint arguments
5936 * (in TP_ARGS()) and local variables (in TP_locvar()).
5938 * Local variables are actually members of a structure pointed
5939 * to by the special variable tp_locvar.
5943 tp_locvar->a = my_int + 17;
5944 tp_locvar->my_struct = get_my_struct_at(tp_locvar->a);
5945 tp_locvar->b = my_struct_compute_b(tp_locvar->my_struct);
5946 tp_locvar->name = my_struct_get_name(tp_locvar->my_struct);
5947 put_my_struct(tp_locvar->my_struct);
5956 * Format identical to the LTTNG_TRACEPOINT_EVENT()
5957 * version for this, except that tp_locvar members can be
5958 * used in the argument expression parameters of
5959 * the ctf_*() macros.
5962 ctf_integer(unsigned long, my_struct_b, tp_locvar->b)
5963 ctf_integer(int, my_struct_a, tp_locvar->a)
5964 ctf_string(my_string_field, my_string)
5965 ctf_string(my_struct_name, tp_locvar->name)
5970 IMPORTANT: The C code defined in `TP_code()` must not have any side
5971 effects when executed. In particular, the code must not allocate
5972 memory or get resources without deallocating this memory or putting
5973 those resources afterwards.
5976 [[instrumenting-linux-kernel-tracing]]
5977 ==== Load and unload a custom probe kernel module
5979 You must load a <<lttng-adaptation-layer,created LTTng-modules probe
5980 kernel module>> in the kernel before it can emit LTTng events.
5982 To load the default probe kernel modules and a custom probe kernel
5985 * Use the opt:lttng-sessiond(8):--extra-kmod-probes option to give extra
5986 probe modules to load when starting a root <<lttng-sessiond,session
5990 .Load the `my_subsys`, `usb`, and the default probe modules.
5994 # lttng-sessiond --extra-kmod-probes=my_subsys,usb
5999 You only need to pass the subsystem name, not the whole kernel module
6002 To load _only_ a given custom probe kernel module:
6004 * Use the opt:lttng-sessiond(8):--kmod-probes option to give the probe
6005 modules to load when starting a root session daemon:
6008 .Load only the `my_subsys` and `usb` probe modules.
6012 # lttng-sessiond --kmod-probes=my_subsys,usb
6017 To confirm that a probe module is loaded:
6024 $ lsmod | grep lttng_probe_usb
6028 To unload the loaded probe modules:
6030 * Kill the session daemon with `SIGTERM`:
6035 # pkill lttng-sessiond
6039 You can also use the `--remove` option of man:modprobe(8) if the session
6040 daemon terminates abnormally.
6043 [[controlling-tracing]]
6046 Once an application or a Linux kernel is <<instrumenting,instrumented>>
6047 for LTTng tracing, you can _trace_ it.
6049 In the LTTng context, _tracing_ means making sure that LTTng attempts to
6050 execute some action(s) when a CPU executes an instrumentation point.
6052 This section is divided in topics on how to use the various
6053 <<plumbing,components of LTTng>>, in particular the
6054 <<lttng-cli,cmd:lttng command-line tool>>, to _control_ the LTTng
6055 daemons and tracers.
6057 NOTE: In the following subsections, we refer to an man:lttng(1) command
6058 using its man page name. For example, instead of ``Run the `create`
6059 command to'', we write ``Run the man:lttng-create(1) command to''.
6063 === Start a session daemon
6065 In some situations, you need to run a <<lttng-sessiond,session daemon>>
6066 (man:lttng-sessiond(8)) _before_ you can use the man:lttng(1)
6069 You will see the following error when you run a command while no session
6073 Error: No session daemon is available
6076 The only command that automatically runs a session daemon is
6077 man:lttng-create(1), which you use to
6078 <<creating-destroying-tracing-sessions,create a recording session>>. While
6079 this could be your most used first operation, sometimes it's not. Some
6082 * <<list-instrumentation-points,List the available instrumentation points>>.
6083 * <<saving-loading-tracing-session,Load a recording session configuration>>.
6084 * <<add-event-rule-matches-trigger,Add a trigger>>.
6086 All the examples above don't require a recording session to operate on.
6088 [[tracing-group]] Each Unix user can have its own running session daemon
6089 to use the user space LTTng tracer. The session daemon that the `root`
6090 user starts is the only one allowed to control the LTTng kernel tracer.
6091 Members of the Unix _tracing group_ may connect to and control the root
6092 session daemon, even for user space tracing. See the ``Session daemon
6093 connection'' section of man:lttng(1) to learn more about the Unix
6096 To start a user session daemon:
6098 * Run man:lttng-sessiond(8):
6103 $ lttng-sessiond --daemonize
6107 To start the root session daemon:
6109 * Run man:lttng-sessiond(8) as the `root` user:
6114 # lttng-sessiond --daemonize
6118 In both cases, remove the opt:lttng-sessiond(8):--daemonize option to
6119 start the session daemon in foreground.
6121 To stop a session daemon, kill its process (see man:kill(1)) with the
6122 standard `TERM` signal.
6124 Note that some Linux distributions could manage the LTTng session daemon
6125 as a service. In this case, we suggest that you use the service manager
6126 to start, restart, and stop session daemons.
6129 [[creating-destroying-tracing-sessions]]
6130 === Create and destroy a recording session
6132 Many LTTng control operations happen in the scope of a
6133 <<tracing-session,recording session>>, which is the dialogue between the
6134 <<lttng-sessiond,session daemon>> and you for everything related to
6135 <<event,event recording>>.
6137 To create a recording session with a generated name:
6139 * Use the man:lttng-create(1) command:
6148 The name of the created recording session is `auto` followed by the
6151 To create a recording session with a specific name:
6153 * Use the optional argument of the man:lttng-create(1) command:
6158 $ lttng create SESSION
6162 Replace +__SESSION__+ with your specific recording session name.
6164 In <<local-mode,local mode>>, LTTng writes the traces of a recording
6165 session to the +$LTTNG_HOME/lttng-traces/__NAME__-__DATE__-__TIME__+
6166 directory by default, where +__NAME__+ is the name of the recording
6167 session. Note that the env:LTTNG_HOME environment variable defaults to
6170 To output LTTng traces to a non-default location:
6172 * Use the opt:lttng-create(1):--output option of the man:lttng-create(1)
6178 $ lttng create my-session --output=/tmp/some-directory
6182 You may create as many recording sessions as you wish.
6184 To list all the existing recording sessions for your Unix user, or for
6185 all users if your Unix user is `root`:
6187 * Use the man:lttng-list(1) command:
6196 [[cur-tracing-session]]When you create a recording session, the
6197 man:lttng-create(1) command sets it as the _current recording session_.
6198 The following man:lttng(1) commands operate on the current recording
6199 session when you don't specify one:
6201 [role="list-3-cols"]
6202 * man:lttng-add-context(1)
6203 * man:lttng-clear(1)
6204 * man:lttng-destroy(1)
6205 * man:lttng-disable-channel(1)
6206 * man:lttng-disable-event(1)
6207 * man:lttng-disable-rotation(1)
6208 * man:lttng-enable-channel(1)
6209 * man:lttng-enable-event(1)
6210 * man:lttng-enable-rotation(1)
6212 * man:lttng-regenerate(1)
6213 * man:lttng-rotate(1)
6215 * man:lttng-snapshot(1)
6216 * man:lttng-start(1)
6217 * man:lttng-status(1)
6219 * man:lttng-track(1)
6220 * man:lttng-untrack(1)
6223 To change the current recording session:
6225 * Use the man:lttng-set-session(1) command:
6230 $ lttng set-session SESSION
6234 Replace +__SESSION__+ with the name of the new current recording session.
6236 When you're done recording in a given recording session, destroy it.
6237 This operation frees the resources taken by the recording session to
6238 destroy; it doesn't destroy the trace data that LTTng wrote for this
6239 recording session (see ``<<clear,Clear a recording session>>'' for one
6242 To destroy the current recording session:
6244 * Use the man:lttng-destroy(1) command:
6253 The man:lttng-destroy(1) command also runs the man:lttng-stop(1) command
6254 implicitly (see ``<<basic-tracing-session-control,Start and stop a
6255 recording session>>''). You need to stop recording to make LTTng flush the
6256 remaining trace data and make the trace readable.
6259 [[list-instrumentation-points]]
6260 === List the available instrumentation points
6262 The <<lttng-sessiond,session daemon>> can query the running instrumented
6263 user applications and the Linux kernel to get a list of available
6264 instrumentation points:
6266 * LTTng tracepoints and system calls for the Linux kernel
6267 <<domain,tracing domain>>.
6269 * LTTng tracepoints for the user space tracing domain.
6271 To list the available instrumentation points:
6273 . <<start-sessiond,Make sure>> there's a running
6274 <<lttng-sessiond,session daemon>> to which your Unix user can
6277 . Use the man:lttng-list(1) command with the option of the requested
6278 tracing domain amongst:
6281 opt:lttng-list(1):--kernel::
6282 Linux kernel tracepoints.
6284 Your Unix user must be `root`, or it must be a member of the Unix
6285 <<tracing-group,tracing group>>.
6287 opt:lttng-list(1):--kernel with opt:lttng-list(1):--syscall::
6288 Linux kernel system calls.
6290 Your Unix user must be `root`, or it must be a member of the Unix
6291 <<tracing-group,tracing group>>.
6293 opt:lttng-list(1):--userspace::
6294 User space tracepoints.
6296 opt:lttng-list(1):--jul::
6297 `java.util.logging` loggers.
6299 opt:lttng-list(1):--log4j::
6300 Apache log4j loggers.
6302 opt:lttng-list(1):--python::
6306 .List the available user space tracepoints.
6310 $ lttng list --userspace
6314 .List the available Linux kernel system calls.
6318 $ lttng list --kernel --syscall
6323 [[enabling-disabling-events]]
6324 === Create and enable a recording event rule
6326 Once you <<creating-destroying-tracing-sessions,create a recording
6327 session>>, you can create <<event,recording event rules>> with the
6328 man:lttng-enable-event(1) command.
6330 The man:lttng-enable-event(1) command always attaches an event rule to a
6331 <<channel,channel>> on creation. The command can create a _default
6332 channel_, named `channel0`, for you. The man:lttng-enable-event(1)
6333 command reuses the default channel each time you run it for the same
6334 tracing domain and session.
6336 A recording event rule is always enabled at creation time.
6338 The following examples show how to combine the command-line arguments of
6339 the man:lttng-enable-event(1) command to create simple to more complex
6340 recording event rules within the <<cur-tracing-session,current recording
6343 .Create a recording event rule matching specific Linux kernel tracepoint events (default channel).
6347 # lttng enable-event --kernel sched_switch
6351 .Create a recording event rule matching Linux kernel system call events with four specific names (default channel).
6355 # lttng enable-event --kernel --syscall open,write,read,close
6359 .Create recording event rules matching tracepoint events which satisfy a filter expressions (default channel).
6363 # lttng enable-event --kernel sched_switch --filter='prev_comm == "bash"'
6368 # lttng enable-event --kernel --all \
6369 --filter='$ctx.tid == 1988 || $ctx.tid == 1534'
6374 $ lttng enable-event --jul my_logger \
6375 --filter='$app.retriever:cur_msg_id > 3'
6378 IMPORTANT: Make sure to always single-quote the filter string when you
6379 run man:lttng(1) from a shell.
6381 See also ``<<pid-tracking,Allow specific processes to record events>>''
6382 which offers another, more efficient filtering mechanism for process ID,
6383 user ID, and group ID attributes.
6386 .Create a recording event rule matching any user space event from the `my_app` tracepoint provider and with a log level range (default channel).
6390 $ lttng enable-event --userspace my_app:'*' --loglevel=INFO
6393 IMPORTANT: Make sure to always single-quote the wildcard character when
6394 you run man:lttng(1) from a shell.
6397 .Create a recording event rule matching user space events named specifically, but with name exclusions (default channel).
6401 $ lttng enable-event --userspace my_app:'*' \
6402 --exclude=my_app:set_user,my_app:handle_sig
6406 .Create a recording event rule matching any Apache log4j event with a specific log level (default channel).
6410 $ lttng enable-event --log4j --all --loglevel-only=WARN
6414 .Create a recording event rule, attached to a specific channel, and matching user space tracepoint events named `my_app:my_tracepoint`.
6418 $ lttng enable-event --userspace my_app:my_tracepoint \
6419 --channel=my-channel
6423 .Create a recording event rule matching user space probe events for the `malloc` function entry in path:{/usr/lib/libc.so.6}:
6427 # lttng enable-event --kernel \
6428 --userspace-probe=/usr/lib/libc.so.6:malloc \
6433 .Create a recording event rule matching user space probe events for the `server`/`accept_request` https://www.sourceware.org/systemtap/wiki/AddingUserSpaceProbingToApps[USDT probe] in path:{/usr/bin/serv}:
6437 # lttng enable-event --kernel \
6438 --userspace-probe=sdt:serv:server:accept_request \
6439 server_accept_request
6443 The recording event rules of a given channel form a whitelist: as soon
6444 as an event rule matches an event, LTTng emits it _once_ and therefore
6445 <<channel-overwrite-mode-vs-discard-mode,can>> record it. For example,
6446 the following rules both match user space tracepoint events named
6447 `my_app:my_tracepoint` with an `INFO` log level:
6451 $ lttng enable-event --userspace my_app:my_tracepoint
6452 $ lttng enable-event --userspace my_app:my_tracepoint \
6456 The second recording event rule is redundant: the first one includes the
6460 [[disable-event-rule]]
6461 === Disable a recording event rule
6463 To disable a <<event,recording event rule>> that you
6464 <<enabling-disabling-events,created>> previously, use the
6465 man:lttng-disable-event(1) command.
6467 man:lttng-disable-event(1) can only find recording event rules to
6468 disable by their <<instrumentation-point-types,instrumentation point
6469 type>> and event name conditions. Therefore, you cannot disable
6470 recording event rules having a specific instrumentation point log level
6471 condition, for example.
6473 LTTng doesn't emit (and, therefore, won't record) an event which only
6474 _disabled_ recording event rules match.
6476 .Disable event rules matching Python logging events from the `my-logger` logger (default <<channel,channel>>, <<cur-tracing-session,current recording session>>).
6480 $ lttng disable-event --python my-logger
6484 .Disable event rules matching all `java.util.logging` events (default channel, recording session `my-session`).
6488 $ lttng disable-event --jul --session=my-session '*'
6492 .Disable _all_ the Linux kernel recording event rules (channel `my-chan`, current recording session).
6494 The opt:lttng-disable-event(1):--all-events option isn't, like the
6495 opt:lttng-enable-event(1):--all option of the man:lttng-enable-event(1)
6496 command, an alias for the event name globbing pattern `*`: it disables
6497 _all_ the recording event rules of a given channel.
6501 # lttng disable-event --kernel --channel=my-chan --all-events
6505 NOTE: You can't _remove_ a recording event rule once you create it.
6509 === Get the status of a recording session
6511 To get the status of the <<cur-tracing-session,current recording
6512 session>>, that is, its parameters, its channels, recording event rules,
6513 and their attributes:
6515 * Use the man:lttng-status(1) command:
6524 To get the status of any recording session:
6526 * Use the man:lttng-list(1) command with the name of the recording
6532 $ lttng list SESSION
6536 Replace +__SESSION__+ with the recording session name.
6539 [[basic-tracing-session-control]]
6540 === Start and stop a recording session
6542 Once you <<creating-destroying-tracing-sessions,create a recording
6543 session>> and <<enabling-disabling-events,create one or more recording
6544 event rules>>, you can start and stop the tracers for this recording
6547 To start the <<cur-tracing-session,current recording session>>:
6549 * Use the man:lttng-start(1) command:
6558 LTTng is flexible: you can launch user applications before or after you
6559 start the tracers. An LTTng tracer only <<event,records an event>> if a
6560 recording event rule matches it, which means the tracer is active.
6562 The `start-session` <<trigger,trigger>> action can also start a recording
6565 To stop the current recording session:
6567 * Use the man:lttng-stop(1) command:
6576 If there were <<channel-overwrite-mode-vs-discard-mode,lost event
6577 records>> or lost sub-buffers since the last time you ran
6578 man:lttng-start(1), the man:lttng-stop(1) command prints corresponding
6581 IMPORTANT: You need to stop recording to make LTTng flush the remaining
6582 trace data and make the trace readable. Note that the
6583 man:lttng-destroy(1) command (see
6584 ``<<creating-destroying-tracing-sessions,Create and destroy a recording
6585 session>>'') also runs the man:lttng-stop(1) command implicitly.
6587 The `stop-session` <<trigger,trigger>> action can also stop a recording
6592 === Clear a recording session
6594 You might need to remove all the current tracing data of one or more
6595 <<tracing-session,recording sessions>> between multiple attempts to
6596 reproduce a problem without interrupting the LTTng recording activity.
6598 To clear the tracing data of the
6599 <<cur-tracing-session,current recording session>>:
6601 * Use the man:lttng-clear(1) command:
6610 To clear the tracing data of all the recording sessions:
6612 * Use the `lttng clear` command with its opt:lttng-clear(1):--all
6623 [[enabling-disabling-channels]]
6624 === Create a channel
6626 Once you <<creating-destroying-tracing-sessions,create a recording
6627 session>>, you can create a <<channel,channel>> with the
6628 man:lttng-enable-channel(1) command.
6630 Note that LTTng can automatically create a default channel when you
6631 <<enabling-disabling-events,create a recording event rule>>.
6632 Therefore, you only need to create a channel when you need non-default
6635 Specify each non-default channel attribute with a command-line
6636 option when you run the man:lttng-enable-channel(1) command.
6638 You can only create a custom channel in the Linux kernel and user space
6639 <<domain,tracing domains>>: the Java/Python logging tracing domains have
6640 their own default channel which LTTng automatically creates when you
6641 <<enabling-disabling-events,create a recording event rule>>.
6645 As of LTTng{nbsp}{revision}, you may _not_ perform the
6646 following operations with the man:lttng-enable-channel(1) command:
6648 * Change an attribute of an existing channel.
6650 * Enable a disabled channel once its recording session has been
6651 <<basic-tracing-session-control,active>> at least once.
6653 * Create a channel once its recording session has been active at
6656 * Create a user space channel with a given
6657 <<channel-buffering-schemes,buffering scheme>> and create a second
6658 user space channel with a different buffering scheme in the same
6662 The following examples show how to combine the command-line options of
6663 the man:lttng-enable-channel(1) command to create simple to more complex
6664 channels within the <<cur-tracing-session,current recording session>>.
6666 .Create a Linux kernel channel with default attributes.
6670 # lttng enable-channel --kernel my-channel
6674 .Create a user space channel with four sub-buffers or 1{nbsp}MiB each, per CPU, per instrumented process.
6678 $ lttng enable-channel --userspace --num-subbuf=4 --subbuf-size=1M \
6679 --buffers-pid my-channel
6683 .[[blocking-timeout-example]]Create a default user space channel with an infinite blocking timeout.
6685 <<creating-destroying-tracing-sessions,Create a recording session>>,
6686 create the channel, <<enabling-disabling-events,create a recording event
6687 rule>>, and <<basic-tracing-session-control,start recording>>:
6692 $ lttng enable-channel --userspace --blocking-timeout=inf blocking-chan
6693 $ lttng enable-event --userspace --channel=blocking-chan --all
6697 Run an application instrumented with LTTng-UST tracepoints and allow it
6702 $ LTTNG_UST_ALLOW_BLOCKING=1 my-app
6706 .Create a Linux kernel channel which rotates eight trace files of 4{nbsp}MiB each for each stream.
6710 # lttng enable-channel --kernel --tracefile-count=8 \
6711 --tracefile-size=4194304 my-channel
6715 .Create a user space channel in <<overwrite-mode,overwrite>> (or ``flight recorder'') mode.
6719 $ lttng enable-channel --userspace --overwrite my-channel
6723 .<<enabling-disabling-events,Create>> the same <<event,recording event rule>> attached to two different channels.
6727 $ lttng enable-event --userspace --channel=my-channel app:tp
6728 $ lttng enable-event --userspace --channel=other-channel app:tp
6731 When a CPU executes the `app:tp` <<c-application,user space
6732 tracepoint>>, the two recording event rules above match the created
6733 event, making LTTng emit the event. Because the recording event rules
6734 are not attached to the same channel, LTTng records the event twice.
6739 === Disable a channel
6741 To disable a specific channel that you
6742 <<enabling-disabling-channels,created>> previously, use the
6743 man:lttng-disable-channel(1) command.
6745 .Disable a specific Linux kernel channel (<<cur-tracing-session,current recording session>>).
6749 # lttng disable-channel --kernel my-channel
6753 An enabled channel is an implicit <<event,recording event rule>>
6756 NOTE: As of LTTng{nbsp}{revision}, you may _not_ enable a disabled
6757 channel once its recording session has been
6758 <<basic-tracing-session-control,started>> at least once.
6762 === Add context fields to be recorded to the event records of a channel
6764 <<event,Event record>> fields in trace files provide important
6765 information about previously emitted events, but sometimes some external
6766 context may help you solve a problem faster.
6768 Examples of context fields are:
6770 * The **process ID**, **thread ID**, **process name**, and
6771 **process priority** of the thread from which LTTng emits the event.
6773 * The **hostname** of the system on which LTTng emits the event.
6775 * The Linux kernel and user call stacks (since LTTng{nbsp}2.11).
6777 * The current values of many possible **performance counters** using
6780 ** CPU cycles, stalled cycles, idle cycles, and the other cycle types.
6782 ** Branch instructions, misses, and loads.
6785 * Any state defined at the application level (supported for the
6786 `java.util.logging` and Apache log4j <<domain,tracing domains>>).
6788 To get the full list of available context fields:
6790 * Use the opt:lttng-add-context(1):--list option of the
6791 man:lttng-add-context(1) command:
6795 $ lttng add-context --list
6798 .Add context fields to be recorded to the event records of all the <<channel,channels>> of the <<cur-tracing-session,current recording session>>.
6800 The following command line adds the virtual process identifier and the
6801 per-thread CPU cycles count fields to all the user space channels of the
6802 current recording session.
6806 $ lttng add-context --userspace --type=vpid --type=perf:thread:cpu-cycles
6810 .Add performance counter context fields by raw ID
6812 See man:lttng-add-context(1) for the exact format of the context field
6813 type, which is partly compatible with the format used in
6818 # lttng add-context --userspace --type=perf:thread:raw:r0110:test
6819 # lttng add-context --kernel --type=perf:cpu:raw:r0013c:x86unhalted
6823 .Add context fields to be recorded to the event records of a specific channel.
6825 The following command line adds the thread identifier and user call
6826 stack context fields to the Linux kernel channel named `my-channel` of
6827 the <<cur-tracing-session,current recording session>>.
6831 # lttng add-context --kernel --channel=my-channel \
6832 --type=tid --type=callstack-user
6836 .Add an <<java-application-context,application-specific context field>> to be recorded to the event records of a specific channel.
6838 The following command line makes sure LTTng writes the `cur_msg_id`
6839 context field of the `retriever` context retriever to all the Java
6840 logging <<event,event records>> of the channel named `my-channel`:
6844 # lttng add-context --kernel --channel=my-channel \
6845 --type='$app:retriever:cur_msg_id'
6848 IMPORTANT: Make sure to always single-quote the `$` character when you
6849 run man:lttng-add-context(1) from a shell.
6852 NOTE: You can't undo what the man:lttng-add-context(1) command does.
6857 === Allow specific processes to record events
6859 It's often useful to only allow processes with specific attributes to
6860 record events. For example, you may wish to record all the system calls
6861 which a given process makes (à la man:strace(1)).
6863 The man:lttng-track(1) and man:lttng-untrack(1) commands serve this
6864 purpose. Both commands operate on _inclusion sets_ of process
6865 attributes. The available process attribute types are:
6867 Linux kernel <<domain,tracing domain>>::
6871 * Virtual process ID (VPID).
6873 This is the PID as seen by the application.
6875 * Unix user ID (UID).
6877 * Virtual Unix user ID (VUID).
6879 This is the UID as seen by the application.
6881 * Unix group ID (GID).
6883 * Virtual Unix group ID (VGID).
6885 This is the GID as seen by the application.
6887 User space tracing domain::
6893 A <<tracing-session,recording session>> has nine process
6894 attribute inclusion sets: six for the Linux kernel <<domain,tracing domain>>
6895 and three for the user space tracing domain.
6897 For a given recording session, a process{nbsp}__P__ is allowed to record
6898 LTTng events for a given <<domain,tracing domain>>{nbsp}__D__ if _all_
6899 the attributes of{nbsp}__P__ are part of the inclusion sets
6902 Whether a process is allowed or not to record LTTng events is an
6903 implicit condition of all <<event,recording event rules>>. Therefore, if
6904 LTTng creates an event{nbsp}__E__ for a given process, but this process
6905 may not record events, then no recording event rule matches{nbsp}__E__,
6906 which means LTTng won't emit and record{nbsp}__E__.
6908 When you <<creating-destroying-tracing-sessions,create a recording
6909 session>>, all its process attribute inclusion sets contain all the
6910 possible values. In other words, all processes are allowed to record
6913 Add values to an inclusion set with the man:lttng-track(1) command and
6914 remove values with the man:lttng-untrack(1) command.
6918 The process attribute values are _numeric_.
6920 Should a process with a given ID (part of an inclusion set), for
6921 example, exit, and then a new process be given this same ID, then the
6922 latter would also be allowed to record events.
6924 With the man:lttng-track(1) command, you can add Unix user and group
6925 _names_ to the user and group inclusion sets: the
6926 <<lttng-sessiond,session daemon>> finds the corresponding UID, VUID,
6927 GID, or VGID once on _addition_ to the inclusion set. This means that if
6928 you rename the user or group after you run the man:lttng-track(1)
6929 command, its user/group ID remains part of the inclusion sets.
6932 .Allow processes to record events based on their virtual process ID (VPID).
6934 For the sake of the following example, assume the target system has
6935 16{nbsp}possible VPIDs.
6938 <<creating-destroying-tracing-sessions,create a recording session>>,
6939 the user space VPID inclusion set contains _all_ the possible VPIDs:
6942 .The VPID inclusion set is full.
6943 image::track-all.png[]
6945 When the inclusion set is full and you run the man:lttng-track(1)
6946 command to specify some VPIDs, LTTng:
6948 . Clears the inclusion set.
6949 . Adds the specific VPIDs to the inclusion set.
6955 $ lttng track --userspace --vpid=3,4,7,10,13
6958 the VPID inclusion set is:
6961 .The VPID inclusion set contains the VPIDs 3, 4, 7, 10, and 13.
6962 image::track-3-4-7-10-13.png[]
6964 Add more VPIDs to the inclusion set afterwards:
6968 $ lttng track --userspace --vpid=1,15,16
6974 .VPIDs 1, 15, and 16 are added to the inclusion set.
6975 image::track-1-3-4-7-10-13-15-16.png[]
6977 The man:lttng-untrack(1) command removes entries from process attribute
6978 inclusion sets. Given the previous example, the following command:
6982 $ lttng untrack --userspace --vpid=3,7,10,13
6985 leads to this VPID inclusion set:
6988 .VPIDs 3, 7, 10, and 13 are removed from the inclusion set.
6989 image::track-1-4-15-16.png[]
6991 You can make the VPID inclusion set full again with the
6992 opt:lttng-track(1):--all option:
6996 $ lttng track --userspace --vpid --all
6999 The result is, again:
7002 .The VPID inclusion set is full.
7003 image::track-all.png[]
7006 .Allow specific processes to record events based on their user ID (UID).
7008 A typical use case with process attribute inclusion sets is to start
7009 with an empty inclusion set, then <<basic-tracing-session-control,start
7010 the tracers>>, and finally add values manually while the tracers are
7013 Use the opt:lttng-untrack(1):--all option of the
7014 man:lttng-untrack(1) command to clear the inclusion set after you
7015 <<creating-destroying-tracing-sessions,create a recording session>>, for
7016 example (with UIDs):
7020 # lttng untrack --kernel --uid --all
7026 .The UID inclusion set is empty.
7027 image::untrack-all.png[]
7029 If the LTTng tracer runs with this inclusion set configuration, it
7030 records no events within the <<cur-tracing-session,current recording
7031 session>> because no processes is allowed to do so. Use the
7032 man:lttng-track(1) command as usual to add specific values to the UID
7033 inclusion set when you need to, for example:
7037 # lttng track --kernel --uid=http,11
7043 .UIDs 6 (`http`) and 11 are part of the UID inclusion set.
7044 image::track-6-11.png[]
7049 [[saving-loading-tracing-session]]
7050 === Save and load recording session configurations
7052 Configuring a <<tracing-session,recording session>> can be long. Some of
7053 the tasks involved are:
7055 * <<enabling-disabling-channels,Create channels>> with
7056 specific attributes.
7058 * <<adding-context,Add context fields>> to be recorded to the
7059 <<event,event records>> of specific channels.
7061 * <<enabling-disabling-events,Create recording event rules>> with
7062 specific log level, filter, and other conditions.
7064 If you use LTTng to solve real world problems, chances are you have to
7065 record events using the same recording session setup over and over,
7066 modifying a few variables each time in your instrumented program or
7069 To avoid constant recording session reconfiguration, the man:lttng(1)
7070 command-line tool can save and load recording session configurations
7073 To save a given recording session configuration:
7075 * Use the man:lttng-save(1) command:
7080 $ lttng save SESSION
7084 Replace +__SESSION__+ with the name of the recording session to save.
7086 LTTng saves recording session configurations to
7087 dir:{$LTTNG_HOME/.lttng/sessions} by default. Note that the
7088 env:LTTNG_HOME environment variable defaults to `$HOME` if not set. See
7089 man:lttng-save(1) to learn more about the recording session configuration
7092 LTTng saves all configuration parameters, for example:
7094 * The recording session name.
7095 * The trace data output path.
7096 * The <<channel,channels>>, with their state and all their attributes.
7097 * The context fields you added to channels.
7098 * The <<event,recording event rules>> with their state and conditions.
7100 To load a recording session:
7102 * Use the man:lttng-load(1) command:
7107 $ lttng load SESSION
7111 Replace +__SESSION__+ with the name of the recording session to load.
7113 When LTTng loads a configuration, it restores your saved recording session
7114 as if you just configured it manually.
7116 You can also save and load many sessions at a time; see
7117 man:lttng-save(1) and man:lttng-load(1) to learn more.
7120 [[sending-trace-data-over-the-network]]
7121 === Send trace data over the network
7123 LTTng can send the recorded trace data of a <<tracing-session,recording
7124 session>> to a remote system over the network instead of writing it to
7125 the local file system.
7127 To send the trace data over the network:
7129 . On the _remote_ system (which can also be the target system),
7130 start an LTTng <<lttng-relayd,relay daemon>> (man:lttng-relayd(8)):
7139 . On the _target_ system, create a recording session
7140 <<net-streaming-mode,configured>> to send trace data over the network:
7145 $ lttng create my-session --set-url=net://remote-system
7149 Replace +__remote-system__+ with the host name or IP address of the
7150 remote system. See man:lttng-create(1) for the exact URL format.
7152 . On the target system, use the man:lttng(1) command-line tool as usual.
7154 When recording is <<basic-tracing-session-control,active>>, the
7155 <<lttng-consumerd,consumer daemon>> of the target sends the contents of
7156 <<channel,sub-buffers>> to the remote relay daemon instead of flushing
7157 them to the local file system. The relay daemon writes the received
7158 packets to its local file system.
7160 See the ``Output directory'' section of man:lttng-relayd(8) to learn
7161 where a relay daemon writes its received trace data.
7166 === View events as LTTng records them (noch:{LTTng} live)
7168 _LTTng live_ is a network protocol implemented by the
7169 <<lttng-relayd,relay daemon>> (man:lttng-relayd(8)) to allow compatible
7170 trace readers to display or analyze <<event,event records>> as LTTng
7171 records events on the target system while recording is
7172 <<basic-tracing-session-control,active>>.
7174 The relay daemon creates a _tee_: it forwards the trace data to both the
7175 local file system and to connected live readers:
7178 .The relay daemon creates a _tee_, forwarding the trace data to both trace files and a connected live reader.
7183 . On the _target system_, create a <<tracing-session,recording session>>
7189 $ lttng create my-session --live
7193 This operation spawns a local relay daemon.
7195 . Start the live reader and configure it to connect to the relay daemon.
7197 For example, with man:babeltrace2(1):
7202 $ babeltrace2 net://localhost/host/HOSTNAME/my-session
7206 Replace +__HOSTNAME__+ with the host name of the target system.
7208 . Configure the recording session as usual with the man:lttng(1)
7209 command-line tool, and <<basic-tracing-session-control,start recording>>.
7211 List the available live recording sessions with man:babeltrace2(1):
7215 $ babeltrace2 net://localhost
7218 You can start the relay daemon on another system. In this case, you need
7219 to specify the URL of the relay daemon when you
7220 <<creating-destroying-tracing-sessions,create the recording session>> with
7221 the opt:lttng-create(1):--set-url option of the man:lttng-create(1)
7222 command. You also need to replace +__localhost__+ in the procedure above
7223 with the host name of the system on which the relay daemon runs.
7227 [[taking-a-snapshot]]
7228 === Take a snapshot of the current sub-buffers of a recording session
7230 The normal behavior of LTTng is to append full sub-buffers to growing
7231 trace data files. This is ideal to keep a full history of the events
7232 which the target system emitted, but it can represent too much data in
7235 For example, you may wish to have LTTng record your application
7236 continuously until some critical situation happens, in which case you
7237 only need the latest few recorded events to perform the desired
7238 analysis, not multi-gigabyte trace files.
7240 With the man:lttng-snapshot(1) command, you can take a _snapshot_ of the
7241 current <<channel,sub-buffers>> of a given <<tracing-session,recording
7242 session>>. LTTng can write the snapshot to the local file system or send
7243 it over the network.
7246 .A snapshot is a copy of the current sub-buffers, which LTTng does _not_ clear after the operation.
7247 image::snapshot.png[]
7249 The snapshot feature of LTTng is similar to how a
7250 https://en.wikipedia.org/wiki/Flight_recorder[flight recorder] or the
7251 ``roll'' mode of an oscilloscope work.
7253 TIP: If you wish to create unmanaged, self-contained, non-overlapping
7254 trace chunk archives instead of a simple copy of the current
7255 sub-buffers, see the <<session-rotation,recording session rotation>>
7256 feature (available since LTTng{nbsp}2.11).
7258 To take a snapshot of the <<cur-tracing-session,current recording
7261 . Create a recording session in <<snapshot-mode,snapshot mode>>:
7266 $ lttng create my-session --snapshot
7270 The <<channel-overwrite-mode-vs-discard-mode,event record loss mode>> of
7271 <<channel,channels>> created in this mode is automatically set to
7272 <<overwrite-mode,_overwrite_>>.
7274 . Configure the recording session as usual with the man:lttng(1)
7275 command-line tool, and <<basic-tracing-session-control,start
7278 . **Optional**: When you need to take a snapshot,
7279 <<basic-tracing-session-control,stop recording>>.
7281 You can take a snapshot when the tracers are active, but if you stop
7282 them first, you're guaranteed that the trace data in the sub-buffers
7283 doesn't change before you actually take the snapshot.
7290 $ lttng snapshot record --name=my-first-snapshot
7294 LTTng writes the current sub-buffers of all the channels of the
7295 <<cur-tracing-session,current recording session>> to
7296 trace files on the local file system. Those trace files have
7297 `my-first-snapshot` in their name.
7299 There's no difference between the format of a normal trace file and the
7300 format of a snapshot: LTTng trace readers also support LTTng snapshots.
7302 By default, LTTng writes snapshot files to the path shown by
7306 $ lttng snapshot list-output
7309 You can change this path or decide to send snapshots over the network
7312 . An output path or URL that you specify when you
7313 <<creating-destroying-tracing-sessions,create the recording session>>.
7315 . A snapshot output path or URL that you add using the
7316 `add-output` action of the man:lttng-snapshot(1) command.
7318 . An output path or URL that you provide directly to the
7319 `record` action of the man:lttng-snapshot(1) command.
7321 Method{nbsp}3 overrides method{nbsp}2, which overrides method 1. When
7322 you specify a URL, a <<lttng-relayd,relay daemon>> must listen on a
7323 remote system (see ``<<sending-trace-data-over-the-network,Send trace
7324 data over the network>>'').
7326 The `snapshot-session` <<trigger,trigger>> action can also take
7327 a recording session snapshot.
7331 [[session-rotation]]
7332 === Archive the current trace chunk (rotate a recording session)
7334 The <<taking-a-snapshot,snapshot user guide>> shows how to dump the
7335 current sub-buffers of a recording session to the file system or send them
7336 over the network. When you take a snapshot, LTTng doesn't clear the ring
7337 buffers of the recording session: if you take another snapshot immediately
7338 after, both snapshots could contain overlapping trace data.
7340 Inspired by https://en.wikipedia.org/wiki/Log_rotation[log rotation],
7341 _recording session rotation_ is a feature which appends the content of the
7342 ring buffers to what's already on the file system or sent over the
7343 network since the creation of the recording session or since the last
7344 rotation, and then clears those ring buffers to avoid trace data
7347 What LTTng is about to write when performing a recording session rotation
7348 is called the _current trace chunk_. When LTTng writes or sends over the
7349 network this current trace chunk, it becomes a _trace chunk archive_.
7350 Therefore, a recording session rotation operation _archives_ the current
7354 .A recording session rotation operation _archives_ the current trace chunk.
7355 image::rotation.png[]
7357 A trace chunk archive is a self-contained LTTng trace which LTTng
7358 doesn't manage anymore: you can read it, modify it, move it, or remove
7361 As of LTTng{nbsp}{revision}, there are three methods to perform a
7362 recording session rotation:
7364 * <<immediate-rotation,Immediately>>.
7366 * With a <<rotation-schedule,rotation schedule>>.
7368 * Through the execution of a `rotate-session` <<trigger,trigger>>
7371 [[immediate-rotation]]To perform an immediate rotation of the
7372 <<cur-tracing-session,current recording session>>:
7374 . <<creating-destroying-tracing-sessions,Create a recording session>> in
7375 <<local-mode,local mode>> or <<net-streaming-mode,network streaming
7376 mode>> (only those two recording session modes support recording session
7382 # lttng create my-session
7386 . <<enabling-disabling-events,Create one or more recording event rules>>
7387 and <<basic-tracing-session-control,start recording>>:
7392 # lttng enable-event --kernel sched_'*'
7397 . When needed, immediately rotate the current recording session:
7406 The man:lttng-rotate(1) command prints the path to the created trace
7407 chunk archive. See its manual page to learn about the format of trace
7408 chunk archive directory names.
7410 Perform other immediate rotations while the recording session is active.
7411 It's guaranteed that all the trace chunk archives don't contain
7412 overlapping trace data. You can also perform an immediate rotation once
7413 you have <<basic-tracing-session-control,stopped>> the recording session.
7415 . When you're done recording,
7416 <<creating-destroying-tracing-sessions,destroy the current recording
7426 The recording session destruction operation creates one last trace chunk
7427 archive from the current trace chunk.
7429 [[rotation-schedule]]A recording session rotation schedule is a planned
7430 rotation which LTTng performs automatically based on one of the
7431 following conditions:
7433 * A timer with a configured period expires.
7435 * The total size of the _flushed_ part of the current trace chunk
7436 becomes greater than or equal to a configured value.
7438 To schedule a rotation of the <<cur-tracing-session,current recording
7439 session>>, set a _rotation schedule_:
7441 . <<creating-destroying-tracing-sessions,Create a recording session>> in
7442 <<local-mode,local mode>> or <<net-streaming-mode,network streaming
7443 mode>> (only those two creation modes support recording session
7449 # lttng create my-session
7453 . <<enabling-disabling-events,Create one or more recording event rules>>:
7458 # lttng enable-event --kernel sched_'*'
7462 . Set a recording session rotation schedule:
7467 # lttng enable-rotation --timer=10s
7471 In this example, we set a rotation schedule so that LTTng performs a
7472 recording session rotation every ten seconds.
7474 See man:lttng-enable-rotation(1) to learn more about other ways to set a
7477 . <<basic-tracing-session-control,Start recording>>:
7486 LTTng performs recording session rotations automatically while the
7487 recording session is active thanks to the rotation schedule.
7489 . When you're done recording,
7490 <<creating-destroying-tracing-sessions,destroy the current recording
7500 The recording session destruction operation creates one last trace chunk
7501 archive from the current trace chunk.
7503 Unset a recording session rotation schedule with the
7504 man:lttng-disable-rotation(1) command.
7508 [[add-event-rule-matches-trigger]]
7509 === Add an ``event rule matches'' trigger to a session daemon
7511 With the man:lttng-add-trigger(1) command, you can add a
7512 <<trigger,trigger>> to a <<lttng-sessiond,session daemon>>.
7514 A trigger associates an LTTng tracing condition to one or more actions:
7515 when the condition is satisfied, LTTng attempts to execute the actions.
7517 A trigger doesn't need any <<tracing-session,recording session>> to exist:
7518 it belongs to a session daemon.
7520 As of LTTng{nbsp}{revision}, many condition types are available through
7521 the <<liblttng-ctl-lttng,`liblttng-ctl`>> C{nbsp}API, but the
7522 man:lttng-add-trigger(1) command only accepts the ``event rule matches''
7525 An ``event rule matches'' condition is satisfied when its event rule
7528 Unlike a <<event,recording event rule>>, the event rule of an
7529 ``event rule matches'' trigger condition has no implicit conditions,
7532 * It has no enabled/disabled state.
7533 * It has no attached <<channel,channel>>.
7534 * It doesn't belong to a <<tracing-session,recording session>>.
7536 Both the man:lttng-add-trigger(1) and man:lttng-enable-event(1) commands
7537 accept command-line arguments to specify an <<event-rule,event rule>>.
7538 That being said, the former is a more recent command and therefore
7539 follows the common event rule specification format (see
7540 man:lttng-event-rule(7)).
7542 .Start a <<tracing-session,recording session>> when an event rule matches.
7544 This example shows how to add the following trigger to the root
7545 <<lttng-sessiond,session daemon>>:
7548 An event rule matches a Linux kernel system call event of which the
7549 name starts with `exec` and `*/ls` matches the `filename` payload
7552 With such an event rule, LTTng emits an event when the cmd:ls program
7556 <<basic-tracing-session-control,Start the recording session>>
7559 To add such a trigger to the root session daemon:
7561 . **If there's no currently running LTTng root session daemon**, start
7566 # lttng-sessiond --daemonize
7569 . <<creating-destroying-tracing-sessions,Create a recording session>>
7571 <<enabling-disabling-events,create a recording event rule>> matching
7572 all the system call events:
7576 # lttng create pitou
7577 # lttng enable-event --kernel --syscall --all
7580 . Add the trigger to the root session daemon:
7584 # lttng add-trigger --condition=event-rule-matches \
7585 --type=syscall --name='exec*' \
7586 --filter='filename == "*/ls"' \
7587 --action=start-session pitou
7590 Confirm that the trigger exists with the man:lttng-list-triggers(1)
7595 # lttng list-triggers
7598 . Make sure the `pitou` recording session is still inactive (stopped):
7605 The first line should be something like:
7608 Recording session pitou: [inactive]
7611 Run the cmd:ls program to fire the LTTng trigger above:
7618 At this point, the `pitou` recording session should be active
7619 (started). Confirm this with the man:lttng-list(1) command again:
7626 The first line should now look like:
7629 Recording session pitou: [active]
7632 This line confirms that the LTTng trigger you added fired, therefore
7633 starting the `pitou` recording session.
7636 .[[trigger-event-notif]]Send a notification to a user application when an event rule matches.
7638 This example shows how to add the following trigger to the root
7639 <<lttng-sessiond,session daemon>>:
7642 An event rule matches a Linux kernel tracepoint event named
7643 `sched_switch` and of which the value of the `next_comm` payload
7646 With such an event rule, LTTng emits an event when Linux gives access to
7647 the processor to a process named `bash`.
7650 Send an LTTng notification to a user application.
7652 Moreover, we'll specify a _capture descriptor_ with the
7653 `event-rule-matches` trigger condition so that the user application can
7654 get the value of a specific `sched_switch` event payload field.
7656 First, write and build the user application:
7658 . Create the C{nbsp}source file of the application:
7666 #include <stdbool.h>
7669 #include <lttng/lttng.h>
7672 * Subscribes to notifications, through the notification channel
7673 * `notification_channel`, which match the condition of the trigger
7674 * named `trigger_name`.
7676 * Returns `true` on success.
7678 static bool subscribe(struct lttng_notification_channel *notification_channel,
7679 const char *trigger_name)
7681 const struct lttng_condition *condition = NULL;
7682 struct lttng_triggers *triggers = NULL;
7683 unsigned int trigger_count;
7685 enum lttng_error_code error_code;
7686 enum lttng_trigger_status trigger_status;
7689 /* Get all LTTng triggers */
7690 error_code = lttng_list_triggers(&triggers);
7691 assert(error_code == LTTNG_OK);
7693 /* Get the number of triggers */
7694 trigger_status = lttng_triggers_get_count(triggers, &trigger_count);
7695 assert(trigger_status == LTTNG_TRIGGER_STATUS_OK);
7697 /* Find the trigger named `trigger_name` */
7698 for (i = 0; i < trigger_count; i++) {
7699 const struct lttng_trigger *trigger;
7700 const char *this_trigger_name;
7702 trigger = lttng_triggers_get_at_index(triggers, i);
7703 trigger_status = lttng_trigger_get_name(trigger, &this_trigger_name);
7704 assert(trigger_status == LTTNG_TRIGGER_STATUS_OK);
7706 if (strcmp(this_trigger_name, trigger_name) == 0) {
7707 /* Trigger found: subscribe with its condition */
7708 enum lttng_notification_channel_status notification_channel_status;
7710 notification_channel_status = lttng_notification_channel_subscribe(
7711 notification_channel,
7712 lttng_trigger_get_const_condition(trigger));
7713 assert(notification_channel_status ==
7714 LTTNG_NOTIFICATION_CHANNEL_STATUS_OK);
7720 lttng_triggers_destroy(triggers);
7725 * Handles the evaluation `evaluation` of a single notification.
7727 static void handle_evaluation(const struct lttng_evaluation *evaluation)
7729 enum lttng_evaluation_status evaluation_status;
7730 const struct lttng_event_field_value *array_field_value;
7731 const struct lttng_event_field_value *string_field_value;
7732 enum lttng_event_field_value_status event_field_value_status;
7733 const char *string_field_string_value;
7735 /* Get the value of the first captured (string) field */
7736 evaluation_status = lttng_evaluation_event_rule_matches_get_captured_values(
7737 evaluation, &array_field_value);
7738 assert(evaluation_status == LTTNG_EVALUATION_STATUS_OK);
7739 event_field_value_status =
7740 lttng_event_field_value_array_get_element_at_index(
7741 array_field_value, 0, &string_field_value);
7742 assert(event_field_value_status == LTTNG_EVENT_FIELD_VALUE_STATUS_OK);
7743 assert(lttng_event_field_value_get_type(string_field_value) ==
7744 LTTNG_EVENT_FIELD_VALUE_TYPE_STRING);
7745 event_field_value_status = lttng_event_field_value_string_get_value(
7746 string_field_value, &string_field_string_value);
7747 assert(event_field_value_status == LTTNG_EVENT_FIELD_VALUE_STATUS_OK);
7749 /* Print the string value of the field */
7750 puts(string_field_string_value);
7753 int main(int argc, char *argv[])
7755 int exit_status = EXIT_SUCCESS;
7756 struct lttng_notification_channel *notification_channel;
7757 enum lttng_notification_channel_status notification_channel_status;
7758 const struct lttng_condition *condition;
7759 const char *trigger_name;
7763 trigger_name = argv[1];
7766 * Create a notification channel.
7768 * A notification channel connects the user application to the LTTng
7771 * You can use this notification channel to listen to various types
7774 notification_channel = lttng_notification_channel_create(
7775 lttng_session_daemon_notification_endpoint);
7776 assert(notification_channel);
7779 * Subscribe to notifications which match the condition of the
7780 * trigger named `trigger_name`.
7782 if (!subscribe(notification_channel, trigger_name)) {
7784 "Error: Failed to subscribe to notifications (trigger `%s`).\n",
7786 exit_status = EXIT_FAILURE;
7791 * Notification loop.
7793 * Put this in a dedicated thread to avoid blocking the main thread.
7796 struct lttng_notification *notification;
7797 enum lttng_notification_channel_status status;
7798 const struct lttng_evaluation *notification_evaluation;
7800 /* Receive the next notification */
7801 status = lttng_notification_channel_get_next_notification(
7802 notification_channel, ¬ification);
7805 case LTTNG_NOTIFICATION_CHANNEL_STATUS_OK:
7807 case LTTNG_NOTIFICATION_CHANNEL_STATUS_NOTIFICATIONS_DROPPED:
7809 * The session daemon can drop notifications if a receiving
7810 * application doesn't consume the notifications fast
7814 case LTTNG_NOTIFICATION_CHANNEL_STATUS_CLOSED:
7816 * The session daemon closed the notification channel.
7818 * This is typically caused by a session daemon shutting
7823 /* Unhandled conditions or errors */
7824 exit_status = EXIT_FAILURE;
7829 * Handle the condition evaluation.
7831 * A notification provides, amongst other things:
7833 * * The condition that caused LTTng to send this notification.
7835 * * The condition evaluation, which provides more specific
7836 * information on the evaluation of the condition.
7838 handle_evaluation(lttng_notification_get_evaluation(notification));
7840 /* Destroy the notification object */
7841 lttng_notification_destroy(notification);
7845 lttng_notification_channel_destroy(notification_channel);
7851 This application prints the first captured string field value of the
7852 condition evaluation of each LTTng notification it receives.
7854 . Build the `notif-app` application,
7855 using https://www.freedesktop.org/wiki/Software/pkg-config/[pkg-config]
7856 to provide the right compiler and linker flags:
7861 $ gcc -o notif-app notif-app.c $(pkg-config --cflags --libs lttng-ctl)
7865 Now, to add the trigger to the root session daemon:
7868 . **If there's no currently running LTTng root session daemon**, start
7873 # lttng-sessiond --daemonize
7876 . Add the trigger, naming it `sched-switch-notif`, to the root
7881 # lttng add-trigger --name=sched-switch-notif \
7882 --condition=event-rule-matches \
7883 --type=kernel --name=sched_switch \
7884 --filter='next_comm == "bash"' --capture=prev_comm \
7888 Confirm that the `sched-switch-notif` trigger exists with the
7889 man:lttng-list-triggers(1) command:
7893 # lttng list-triggers
7896 Run the cmd:notif-app application, passing the name of the trigger
7897 of which to watch the notifications:
7901 # ./notif-app sched-switch-notif
7904 Now, in an interactive Bash, type a few keys to fire the
7905 `sched-switch-notif` trigger. Watch the `notif-app` application print
7906 the previous process names.
7911 === Use the machine interface
7913 With any command of the man:lttng(1) command-line tool, set the
7914 opt:lttng(1):--mi option to `xml` (before the command name) to get an
7915 XML machine interface output, for example:
7919 $ lttng --mi=xml list my-session
7922 A schema definition (XSD) is
7923 https://github.com/lttng/lttng-tools/blob/stable-{revision}/src/common/mi-lttng-4.0.xsd[available]
7924 to ease the integration with external tools as much as possible.
7928 [[metadata-regenerate]]
7929 === Regenerate the metadata of an LTTng trace
7931 An LTTng trace, which is a https://diamon.org/ctf[CTF] trace, has both
7932 data stream files and a metadata stream file. This metadata file
7933 contains, amongst other things, information about the offset of the
7934 clock sources which LTTng uses to assign timestamps to <<event,event
7935 records>> when recording.
7937 If, once a <<tracing-session,recording session>> is
7938 <<basic-tracing-session-control,started>>, a major
7939 https://en.wikipedia.org/wiki/Network_Time_Protocol[NTP] correction
7940 happens, the clock offset of the trace also needs to be updated. Use
7941 the `metadata` item of the man:lttng-regenerate(1) command to do so.
7943 The main use case of this command is to allow a system to boot with
7944 an incorrect wall time and have LTTng trace it before its wall time
7945 is corrected. Once the system is known to be in a state where its
7946 wall time is correct, you can run `lttng regenerate metadata`.
7948 To regenerate the metadata stream files of the
7949 <<cur-tracing-session,current recording session>>:
7951 * Use the `metadata` item of the man:lttng-regenerate(1) command:
7956 $ lttng regenerate metadata
7962 [[regenerate-statedump]]
7963 === Regenerate the state dump event records of a recording session
7965 The LTTng kernel and user space tracers generate state dump
7966 <<event,event records>> when the application starts or when you
7967 <<basic-tracing-session-control,start a recording session>>.
7969 An analysis can use the state dump event records to set an initial state
7970 before it builds the rest of the state from the subsequent event
7971 records. http://tracecompass.org/[Trace Compass] and
7972 https://github.com/lttng/lttng-analyses[LTTng analyses] are notable
7973 examples of applications which use the state dump of an LTTng trace.
7975 When you <<taking-a-snapshot,take a snapshot>>, it's possible that the
7976 state dump event records aren't included in the snapshot trace files
7977 because they were recorded to a <<channel,sub-buffer>> that has been
7978 consumed or <<overwrite-mode,overwritten>> already.
7980 Use the `statedump` item of the man:lttng-regenerate(1) command to emit
7981 and record the state dump events again.
7983 To regenerate the state dump of the <<cur-tracing-session,current
7984 recording session>>, provided you created it in <<snapshot-mode,snapshot
7985 mode>>, before you take a snapshot:
7987 . Use the `statedump` item of the man:lttng-regenerate(1) command:
7992 $ lttng regenerate statedump
7996 . <<basic-tracing-session-control,Stop the recording session>>:
8005 . <<taking-a-snapshot,Take a snapshot>>:
8010 $ lttng snapshot record --name=my-snapshot
8014 Depending on the event throughput, you should run steps{nbsp}1
8015 and{nbsp}2 as closely as possible.
8019 To record the state dump events, you need to
8020 <<enabling-disabling-events,create recording event rules>> which enable
8023 * The names of LTTng-UST state dump tracepoints start with
8024 `lttng_ust_statedump:`.
8026 * The names of LTTng-modules state dump tracepoints start with
8032 [[persistent-memory-file-systems]]
8033 === Record trace data on persistent memory file systems
8035 https://en.wikipedia.org/wiki/Non-volatile_random-access_memory[Non-volatile
8036 random-access memory] (NVRAM) is random-access memory that retains its
8037 information when power is turned off (non-volatile). Systems with such
8038 memory can store data structures in RAM and retrieve them after a
8039 reboot, without flushing to typical _storage_.
8041 Linux supports NVRAM file systems thanks to either
8042 https://www.kernel.org/doc/Documentation/filesystems/dax.txt[DAX]{nbsp}+{nbsp}http://lkml.iu.edu/hypermail/linux/kernel/1504.1/03463.html[pmem]
8043 (requires Linux{nbsp}4.1+) or http://pramfs.sourceforge.net/[PRAMFS] (requires Linux{nbsp}<{nbsp}4).
8045 This section doesn't describe how to operate such file systems; we
8046 assume that you have a working persistent memory file system.
8048 When you <<creating-destroying-tracing-sessions,create a recording
8049 session>>, you can specify the path of the shared memory holding the
8050 sub-buffers. If you specify a location on an NVRAM file system, then you
8051 can retrieve the latest recorded trace data when the system reboots
8054 To record trace data on a persistent memory file system and retrieve the
8055 trace data after a system crash:
8057 . Create a recording session with a <<channel,sub-buffer>> shared memory
8058 path located on an NVRAM file system:
8063 $ lttng create my-session --shm-path=/path/to/shm/on/nvram
8067 . Configure the recording session as usual with the man:lttng(1)
8068 command-line tool, and <<basic-tracing-session-control,start
8071 . After a system crash, use the man:lttng-crash(1) command-line tool to
8072 read the trace data recorded on the NVRAM file system:
8077 $ lttng-crash /path/to/shm/on/nvram
8081 The binary layout of the ring buffer files isn't exactly the same as the
8082 trace files layout. This is why you need to use man:lttng-crash(1)
8083 instead of some standard LTTng trace reader.
8085 To convert the ring buffer files to LTTng trace files:
8087 * Use the opt:lttng-crash(1):--extract option of man:lttng-crash(1):
8092 $ lttng-crash --extract=/path/to/trace /path/to/shm/on/nvram
8098 [[notif-trigger-api]]
8099 === Get notified when the buffer usage of a channel is too high or too low
8101 With the notification and <<trigger,trigger>> C{nbsp}API of
8102 <<liblttng-ctl-lttng,`liblttng-ctl`>>, LTTng can notify your user
8103 application when the buffer usage of one or more <<channel,channels>>
8104 becomes too low or too high.
8106 Use this API and enable or disable <<event,recording event rules>> while
8107 a recording session <<basic-tracing-session-control,is active>> to avoid
8108 <<channel-overwrite-mode-vs-discard-mode,discarded event records>>, for
8111 .Send a notification to a user application when the buffer usage of an LTTng channel is too high.
8113 In this example, we create and build an application which gets notified
8114 when the buffer usage of a specific LTTng channel is higher than
8117 We only print that it's the case in this example, but we could as well
8118 use the `liblttng-ctl` C{nbsp}API to <<enabling-disabling-events,disable
8119 recording event rules>> when this happens, for example.
8121 . Create the C{nbsp}source file of the application:
8130 #include <lttng/lttng.h>
8132 int main(int argc, char *argv[])
8134 int exit_status = EXIT_SUCCESS;
8135 struct lttng_notification_channel *notification_channel;
8136 struct lttng_condition *condition;
8137 struct lttng_action *action;
8138 struct lttng_trigger *trigger;
8139 const char *recording_session_name;
8140 const char *channel_name;
8143 recording_session_name = argv[1];
8144 channel_name = argv[2];
8147 * Create a notification channel.
8149 * A notification channel connects the user application to the LTTng
8152 * You can use this notification channel to listen to various types
8155 notification_channel = lttng_notification_channel_create(
8156 lttng_session_daemon_notification_endpoint);
8159 * Create a "buffer usage becomes greater than" condition.
8161 * In this case, the condition is satisfied when the buffer usage
8162 * becomes greater than or equal to 75 %.
8164 * We create the condition for a specific recording session name,
8165 * channel name, and for the user space tracing domain.
8167 * The following condition types also exist:
8169 * * The buffer usage of a channel becomes less than a given value.
8171 * * The consumed data size of a recording session becomes greater
8172 * than a given value.
8174 * * A recording session rotation becomes ongoing.
8176 * * A recording session rotation becomes completed.
8178 * * A given event rule matches an event.
8180 condition = lttng_condition_buffer_usage_high_create();
8181 lttng_condition_buffer_usage_set_threshold_ratio(condition, .75);
8182 lttng_condition_buffer_usage_set_session_name(condition,
8183 recording_session_name);
8184 lttng_condition_buffer_usage_set_channel_name(condition,
8186 lttng_condition_buffer_usage_set_domain_type(condition,
8190 * Create an action (receive a notification) to execute when the
8191 * condition created above is satisfied.
8193 action = lttng_action_notify_create();
8198 * A trigger associates a condition to an action: LTTng executes
8199 * the action when the condition is satisfied.
8201 trigger = lttng_trigger_create(condition, action);
8203 /* Register the trigger to the LTTng session daemon. */
8204 lttng_register_trigger(trigger);
8207 * Now that we have registered a trigger, LTTng will send a
8208 * notification every time its condition is met through a
8209 * notification channel.
8211 * To receive this notification, we must subscribe to notifications
8212 * which match the same condition.
8214 lttng_notification_channel_subscribe(notification_channel,
8218 * Notification loop.
8220 * Put this in a dedicated thread to avoid blocking the main thread.
8223 struct lttng_notification *notification;
8224 enum lttng_notification_channel_status status;
8225 const struct lttng_evaluation *notification_evaluation;
8226 const struct lttng_condition *notification_condition;
8227 double buffer_usage;
8229 /* Receive the next notification. */
8230 status = lttng_notification_channel_get_next_notification(
8231 notification_channel, ¬ification);
8234 case LTTNG_NOTIFICATION_CHANNEL_STATUS_OK:
8236 case LTTNG_NOTIFICATION_CHANNEL_STATUS_NOTIFICATIONS_DROPPED:
8238 * The session daemon can drop notifications if a monitoring
8239 * application isn't consuming the notifications fast
8243 case LTTNG_NOTIFICATION_CHANNEL_STATUS_CLOSED:
8245 * The session daemon closed the notification channel.
8247 * This is typically caused by a session daemon shutting
8252 /* Unhandled conditions or errors. */
8253 exit_status = EXIT_FAILURE;
8258 * A notification provides, amongst other things:
8260 * * The condition that caused LTTng to send this notification.
8262 * * The condition evaluation, which provides more specific
8263 * information on the evaluation of the condition.
8265 * The condition evaluation provides the buffer usage
8266 * value at the moment the condition was satisfied.
8268 notification_condition = lttng_notification_get_condition(
8270 notification_evaluation = lttng_notification_get_evaluation(
8273 /* We're subscribed to only one condition. */
8274 assert(lttng_condition_get_type(notification_condition) ==
8275 LTTNG_CONDITION_TYPE_BUFFER_USAGE_HIGH);
8278 * Get the exact sampled buffer usage from the condition
8281 lttng_evaluation_buffer_usage_get_usage_ratio(
8282 notification_evaluation, &buffer_usage);
8285 * At this point, instead of printing a message, we could do
8286 * something to reduce the buffer usage of the channel, like
8287 * disable specific events, for example.
8289 printf("Buffer usage is %f %% in recording session \"%s\", "
8290 "user space channel \"%s\".\n", buffer_usage * 100,
8291 recording_session_name, channel_name);
8293 /* Destroy the notification object. */
8294 lttng_notification_destroy(notification);
8298 lttng_action_destroy(action);
8299 lttng_condition_destroy(condition);
8300 lttng_trigger_destroy(trigger);
8301 lttng_notification_channel_destroy(notification_channel);
8307 . Build the `notif-app` application, linking it with `liblttng-ctl`:
8312 $ gcc -o notif-app notif-app.c $(pkg-config --cflags --libs lttng-ctl)
8316 . <<creating-destroying-tracing-sessions,Create a recording session>>,
8317 <<enabling-disabling-events,create a recording event rule>> matching
8318 all the user space tracepoint events, and
8319 <<basic-tracing-session-control,start recording>>:
8324 $ lttng create my-session
8325 $ lttng enable-event --userspace --all
8330 If you create the channel manually with the man:lttng-enable-channel(1)
8331 command, you can set its <<channel-monitor-timer,monitor timer>> to
8332 control how frequently LTTng samples the current values of the channel
8333 properties to evaluate user conditions.
8335 . Run the `notif-app` application.
8337 This program accepts the <<tracing-session,recording session>> and
8338 user space channel names as its two first arguments. The channel
8339 which LTTng automatically creates with the man:lttng-enable-event(1)
8340 command above is named `channel0`:
8345 $ ./notif-app my-session channel0
8349 . In another terminal, run an application with a very high event
8350 throughput so that the 75{nbsp}% buffer usage condition is reached.
8352 In the first terminal, the application should print lines like this:
8355 Buffer usage is 81.45197 % in recording session "my-session", user space
8359 If you don't see anything, try to make the threshold of the condition in
8360 path:{notif-app.c} lower (0.1{nbsp}%, for example), and then rebuild the
8361 `notif-app` application (step{nbsp}2) and run it again (step{nbsp}4).
8368 [[lttng-modules-ref]]
8369 === noch:{LTTng-modules}
8373 [[lttng-tracepoint-enum]]
8374 ==== `LTTNG_TRACEPOINT_ENUM()` usage
8376 Use the `LTTNG_TRACEPOINT_ENUM()` macro to define an enumeration:
8380 LTTNG_TRACEPOINT_ENUM(name, TP_ENUM_VALUES(entries))
8385 * `name` with the name of the enumeration (C identifier, unique
8386 amongst all the defined enumerations).
8387 * `entries` with a list of enumeration entries.
8389 The available enumeration entry macros are:
8391 +ctf_enum_value(__name__, __value__)+::
8392 Entry named +__name__+ mapped to the integral value +__value__+.
8394 +ctf_enum_range(__name__, __begin__, __end__)+::
8395 Entry named +__name__+ mapped to the range of integral values between
8396 +__begin__+ (included) and +__end__+ (included).
8398 +ctf_enum_auto(__name__)+::
8399 Entry named +__name__+ mapped to the integral value following the
8402 The last value of a `ctf_enum_value()` entry is its +__value__+
8405 The last value of a `ctf_enum_range()` entry is its +__end__+ parameter.
8407 If `ctf_enum_auto()` is the first entry in the list, its integral
8410 Use the `ctf_enum()` <<lttng-modules-tp-fields,field definition macro>>
8411 to use a defined enumeration as a tracepoint field.
8413 .Define an enumeration with `LTTNG_TRACEPOINT_ENUM()`.
8417 LTTNG_TRACEPOINT_ENUM(
8420 ctf_enum_auto("AUTO: EXPECT 0")
8421 ctf_enum_value("VALUE: 23", 23)
8422 ctf_enum_value("VALUE: 27", 27)
8423 ctf_enum_auto("AUTO: EXPECT 28")
8424 ctf_enum_range("RANGE: 101 TO 303", 101, 303)
8425 ctf_enum_auto("AUTO: EXPECT 304")
8433 [[lttng-modules-tp-fields]]
8434 ==== Tracepoint fields macros (for `TP_FIELDS()`)
8436 [[tp-fast-assign]][[tp-struct-entry]]The available macros to define
8437 tracepoint fields, which must be listed within `TP_FIELDS()` in
8438 `LTTNG_TRACEPOINT_EVENT()`, are:
8440 [role="func-desc growable",cols="asciidoc,asciidoc"]
8441 .Available macros to define LTTng-modules tracepoint fields
8443 |Macro |Description and parameters
8446 +ctf_integer(__t__, __n__, __e__)+
8448 +ctf_integer_nowrite(__t__, __n__, __e__)+
8450 +ctf_user_integer(__t__, __n__, __e__)+
8452 +ctf_user_integer_nowrite(__t__, __n__, __e__)+
8454 Standard integer, displayed in base{nbsp}10.
8457 Integer C type (`int`, `long`, `size_t`, ...).
8463 Argument expression.
8466 +ctf_integer_hex(__t__, __n__, __e__)+
8468 +ctf_user_integer_hex(__t__, __n__, __e__)+
8470 Standard integer, displayed in base{nbsp}16.
8479 Argument expression.
8481 |+ctf_integer_oct(__t__, __n__, __e__)+
8483 Standard integer, displayed in base{nbsp}8.
8492 Argument expression.
8495 +ctf_integer_network(__t__, __n__, __e__)+
8497 +ctf_user_integer_network(__t__, __n__, __e__)+
8499 Integer in network byte order (big-endian), displayed in base{nbsp}10.
8508 Argument expression.
8511 +ctf_integer_network_hex(__t__, __n__, __e__)+
8513 +ctf_user_integer_network_hex(__t__, __n__, __e__)+
8515 Integer in network byte order, displayed in base{nbsp}16.
8524 Argument expression.
8527 +ctf_enum(__N__, __t__, __n__, __e__)+
8529 +ctf_enum_nowrite(__N__, __t__, __n__, __e__)+
8531 +ctf_user_enum(__N__, __t__, __n__, __e__)+
8533 +ctf_user_enum_nowrite(__N__, __t__, __n__, __e__)+
8538 Name of a <<lttng-tracepoint-enum,previously defined enumeration>>.
8541 Integer C type (`int`, `long`, `size_t`, ...).
8547 Argument expression.
8550 +ctf_string(__n__, __e__)+
8552 +ctf_string_nowrite(__n__, __e__)+
8554 +ctf_user_string(__n__, __e__)+
8556 +ctf_user_string_nowrite(__n__, __e__)+
8558 Null-terminated string; undefined behavior if +__e__+ is `NULL`.
8564 Argument expression.
8567 +ctf_array(__t__, __n__, __e__, __s__)+
8569 +ctf_array_nowrite(__t__, __n__, __e__, __s__)+
8571 +ctf_user_array(__t__, __n__, __e__, __s__)+
8573 +ctf_user_array_nowrite(__t__, __n__, __e__, __s__)+
8575 Statically-sized array of integers.
8578 Array element C type.
8584 Argument expression.
8590 +ctf_array_bitfield(__t__, __n__, __e__, __s__)+
8592 +ctf_array_bitfield_nowrite(__t__, __n__, __e__, __s__)+
8594 +ctf_user_array_bitfield(__t__, __n__, __e__, __s__)+
8596 +ctf_user_array_bitfield_nowrite(__t__, __n__, __e__, __s__)+
8598 Statically-sized array of bits.
8600 The type of +__e__+ must be an integer type. +__s__+ is the number
8601 of elements of such type in +__e__+, not the number of bits.
8604 Array element C type.
8610 Argument expression.
8616 +ctf_array_text(__t__, __n__, __e__, __s__)+
8618 +ctf_array_text_nowrite(__t__, __n__, __e__, __s__)+
8620 +ctf_user_array_text(__t__, __n__, __e__, __s__)+
8622 +ctf_user_array_text_nowrite(__t__, __n__, __e__, __s__)+
8624 Statically-sized array, printed as text.
8626 The string doesn't need to be null-terminated.
8629 Array element C type (always `char`).
8635 Argument expression.
8641 +ctf_sequence(__t__, __n__, __e__, __T__, __E__)+
8643 +ctf_sequence_nowrite(__t__, __n__, __e__, __T__, __E__)+
8645 +ctf_user_sequence(__t__, __n__, __e__, __T__, __E__)+
8647 +ctf_user_sequence_nowrite(__t__, __n__, __e__, __T__, __E__)+
8649 Dynamically-sized array of integers.
8651 The type of +__E__+ must be unsigned.
8654 Array element C type.
8660 Argument expression.
8663 Length expression C type.
8669 +ctf_sequence_hex(__t__, __n__, __e__, __T__, __E__)+
8671 +ctf_user_sequence_hex(__t__, __n__, __e__, __T__, __E__)+
8673 Dynamically-sized array of integers, displayed in base{nbsp}16.
8675 The type of +__E__+ must be unsigned.
8678 Array element C type.
8684 Argument expression.
8687 Length expression C type.
8692 |+ctf_sequence_network(__t__, __n__, __e__, __T__, __E__)+
8694 Dynamically-sized array of integers in network byte order (big-endian),
8695 displayed in base{nbsp}10.
8697 The type of +__E__+ must be unsigned.
8700 Array element C type.
8706 Argument expression.
8709 Length expression C type.
8715 +ctf_sequence_bitfield(__t__, __n__, __e__, __T__, __E__)+
8717 +ctf_sequence_bitfield_nowrite(__t__, __n__, __e__, __T__, __E__)+
8719 +ctf_user_sequence_bitfield(__t__, __n__, __e__, __T__, __E__)+
8721 +ctf_user_sequence_bitfield_nowrite(__t__, __n__, __e__, __T__, __E__)+
8723 Dynamically-sized array of bits.
8725 The type of +__e__+ must be an integer type. +__s__+ is the number
8726 of elements of such type in +__e__+, not the number of bits.
8728 The type of +__E__+ must be unsigned.
8731 Array element C type.
8737 Argument expression.
8740 Length expression C type.
8746 +ctf_sequence_text(__t__, __n__, __e__, __T__, __E__)+
8748 +ctf_sequence_text_nowrite(__t__, __n__, __e__, __T__, __E__)+
8750 +ctf_user_sequence_text(__t__, __n__, __e__, __T__, __E__)+
8752 +ctf_user_sequence_text_nowrite(__t__, __n__, __e__, __T__, __E__)+
8754 Dynamically-sized array, displayed as text.
8756 The string doesn't need to be null-terminated.
8758 The type of +__E__+ must be unsigned.
8760 The behaviour is undefined if +__e__+ is `NULL`.
8763 Sequence element C type (always `char`).
8769 Argument expression.
8772 Length expression C type.
8778 Use the `_user` versions when the argument expression, `e`, is
8779 a user space address. In the cases of `ctf_user_integer*()` and
8780 `ctf_user_float*()`, `&e` must be a user space address, thus `e` must
8783 The `_nowrite` versions omit themselves from the trace data, but are
8784 otherwise identical. This means LTTng won't write the `_nowrite` fields
8785 to the recorded trace. Their primary purpose is to make some of the
8786 event context available to the <<enabling-disabling-events,recording
8787 event rule filters>> without having to commit the data to
8788 <<channel,sub-buffers>>.
8794 Terms related to LTTng and to tracing in general:
8796 [[def-action]]action::
8797 The part of a <<def-trigger,trigger>> which LTTng executes when the
8798 trigger <<def-condition,condition>> is satisfied.
8801 The https://diamon.org/babeltrace[Babeltrace] project, which includes:
8804 https://babeltrace.org/docs/v2.0/man1/babeltrace2.1/[cmd:babeltrace2]
8805 command-line interface.
8806 * The libbabeltrace2 library which offers a
8807 https://babeltrace.org/docs/v2.0/libbabeltrace2/[C API].
8808 * https://babeltrace.org/docs/v2.0/python/bt2/[Python{nbsp}3 bindings].
8811 [[def-buffering-scheme]]<<channel-buffering-schemes,buffering scheme>>::
8812 A layout of <<def-sub-buffer,sub-buffers>> applied to a given channel.
8814 [[def-channel]]<<channel,channel>>::
8815 An entity which is responsible for a set of
8816 <<def-ring-buffer,ring buffers>>.
8818 <<def-recording-event-rule,Recording event rules>> are always attached
8819 to a specific channel.
8822 A source of time for a <<def-tracer,tracer>>.
8824 [[def-condition]]condition::
8825 The part of a <<def-trigger,trigger>> which must be satisfied for
8826 LTTng to attempt to execute the trigger <<def-action,actions>>.
8828 [[def-consumer-daemon]]<<lttng-consumerd,consumer daemon>>::
8829 A program which is responsible for consuming the full
8830 <<def-sub-buffer,sub-buffers>> and write them to a file system or
8831 send them over the network.
8833 [[def-current-trace-chunk]]current trace chunk::
8834 A <<def-trace-chunk,trace chunk>> which includes the current content
8835 of all the <<def-sub-buffer,sub-buffers>> of the
8836 <<def-tracing-session,recording session>> and the stream files
8837 produced since the latest event amongst:
8839 * The creation of the recording session.
8840 * The last <<def-tracing-session-rotation,recording session rotation>>, if
8843 <<channel-overwrite-mode-vs-discard-mode,discard mode>>::
8844 The <<def-event-record-loss-mode,event record loss mode>> in which
8845 the <<def-tracer,tracer>> _discards_ new <<def-event-record,event
8846 records>> when there's no <<def-sub-buffer,sub-buffer>> space left to
8849 [[def-event]]event::
8850 The execution of an <<def-instrumentation-point,instrumentation
8851 point>>, like a <<def-tracepoint,tracepoint>> that you manually place
8852 in some source code, or a Linux kprobe.
8854 When an instrumentation point is executed, LTTng creates an event.
8856 When an <<def-event-rule,event rule>> matches the event,
8857 <<def-lttng,LTTng>> executes some action, for example:
8859 * Record its payload to a <<def-sub-buffer,sub-buffer>> as an
8860 <<def-event-record,event record>>.
8861 * Attempt to execute the user-defined actions of a
8862 <<def-trigger,trigger>> with an
8863 <<add-event-rule-matches-trigger,``event rule matches''>> condition.
8865 [[def-event-name]]event name::
8866 The name of an <<def-event,event>>, which is also the name of the
8867 <<def-event-record,event record>>.
8869 This is also called the _instrumentation point name_.
8871 [[def-event-record]]event record::
8872 A record (binary serialization), in a <<def-trace,trace>>, of the
8873 payload of an <<def-event,event>>.
8875 The payload of an event record has zero or more _fields_.
8877 [[def-event-record-loss-mode]]<<channel-overwrite-mode-vs-discard-mode,event record loss mode>>::
8878 The mechanism by which event records of a given
8879 <<def-channel,channel>> are lost (not recorded) when there's no
8880 <<def-sub-buffer,sub-buffer>> space left to store them.
8882 [[def-event-rule]]<<event-rule,event rule>>::
8883 Set of conditions which an <<def-event,event>> must satisfy
8884 for LTTng to execute some action.
8886 An event rule is said to _match_ events, like a
8887 https://en.wikipedia.org/wiki/Regular_expression[regular expression]
8890 A <<def-recording-event-rule,recording event rule>> is a specific type
8891 of event rule of which the action is to <<def-record,record>> the event
8892 to a <<def-sub-buffer,sub-buffer>>.
8894 [[def-incl-set]]inclusion set::
8895 In the <<pid-tracking,process attribute inclusion set>> context: a
8896 set of <<def-proc-attr,process attributes>> of a given type.
8898 <<instrumenting,instrumentation>>::
8899 The use of <<def-lttng,LTTng>> probes to make a kernel or
8900 <<def-user-application,user application>> traceable.
8902 [[def-instrumentation-point]]instrumentation point::
8903 A point in the execution path of a kernel or
8904 <<def-user-application,user application>> which, when executed,
8905 create an <<def-event,event>>.
8907 instrumentation point name::
8908 See _<<def-event-name,event name>>_.
8910 `java.util.logging`::
8912 https://docs.oracle.com/javase/7/docs/api/java/util/logging/package-summary.html[core logging facilities]
8913 of the Java platform.
8916 A https://logging.apache.org/log4j/1.2/[logging library] for Java
8917 developed by the Apache Software Foundation.
8920 Level of severity of a log statement or user space
8921 <<def-instrumentation-point,instrumentation point>>.
8923 [[def-lttng]]LTTng::
8924 The _Linux Trace Toolkit: next generation_ project.
8926 <<lttng-cli,cmd:lttng>>::
8927 A command-line tool provided by the <<def-lttng-tools,LTTng-tools>>
8928 project which you can use to send and receive control messages to and
8929 from a <<def-session-daemon,session daemon>>.
8932 The https://github.com/lttng/lttng-analyses[LTTng analyses] project,
8933 which is a set of analyzing programs that you can use to obtain a
8934 higher level view of an <<def-lttng,LTTng>> <<def-trace,trace>>.
8936 cmd:lttng-consumerd::
8937 The name of the <<def-consumer-daemon,consumer daemon>> program.
8940 A utility provided by the <<def-lttng-tools,LTTng-tools>> project
8941 which can convert <<def-ring-buffer,ring buffer>> files (usually
8942 <<persistent-memory-file-systems,saved on a persistent memory file
8943 system>>) to <<def-trace,trace>> files.
8945 See man:lttng-crash(1).
8947 LTTng Documentation::
8950 <<lttng-live,LTTng live>>::
8951 A communication protocol between the <<lttng-relayd,relay daemon>> and
8952 live readers which makes it possible to show or analyze
8953 <<def-event-record,event records>> ``live'', as they're received by
8954 the <<def-relay-daemon,relay daemon>>.
8956 <<lttng-modules,LTTng-modules>>::
8957 The https://github.com/lttng/lttng-modules[LTTng-modules] project,
8958 which contains the Linux kernel modules to make the Linux kernel
8959 <<def-instrumentation-point,instrumentation points>> available for
8960 <<def-lttng,LTTng>> tracing.
8963 The name of the <<def-relay-daemon,relay daemon>> program.
8965 cmd:lttng-sessiond::
8966 The name of the <<def-session-daemon,session daemon>> program.
8968 [[def-lttng-tools]]LTTng-tools::
8969 The https://github.com/lttng/lttng-tools[LTTng-tools] project, which
8970 contains the various programs and libraries used to
8971 <<controlling-tracing,control tracing>>.
8973 [[def-lttng-ust]]<<lttng-ust,LTTng-UST>>::
8974 The https://github.com/lttng/lttng-ust[LTTng-UST] project, which
8975 contains libraries to instrument
8976 <<def-user-application,user applications>>.
8978 <<lttng-ust-agents,LTTng-UST Java agent>>::
8979 A Java package provided by the <<def-lttng-ust,LTTng-UST>> project to
8980 allow the LTTng instrumentation of `java.util.logging` and Apache
8981 log4j{nbsp}1.2 logging statements.
8983 <<lttng-ust-agents,LTTng-UST Python agent>>::
8984 A Python package provided by the <<def-lttng-ust,LTTng-UST>> project
8985 to allow the <<def-lttng,LTTng>> instrumentation of Python logging
8988 <<channel-overwrite-mode-vs-discard-mode,overwrite mode>>::
8989 The <<def-event-record-loss-mode,event record loss mode>> in which new
8990 <<def-event-record,event records>> _overwrite_ older event records
8991 when there's no <<def-sub-buffer,sub-buffer>> space left to store
8994 <<channel-buffering-schemes,per-process buffering>>::
8995 A <<def-buffering-scheme,buffering scheme>> in which each instrumented
8996 process has its own <<def-sub-buffer,sub-buffers>> for a given user
8997 space <<def-channel,channel>>.
8999 <<channel-buffering-schemes,per-user buffering>>::
9000 A <<def-buffering-scheme,buffering scheme>> in which all the processes
9001 of a Unix user share the same <<def-sub-buffer,sub-buffers>> for a
9002 given user space <<def-channel,channel>>.
9004 [[def-proc-attr]]process attribute::
9005 In the <<pid-tracking,process attribute inclusion set>> context:
9008 * A virtual process ID.
9010 * A virtual Unix user ID.
9012 * A virtual Unix group ID.
9015 See <<def-event-record,_event record_>>.
9017 [[def-record]]record (_verb_)::
9018 Serialize the binary payload of an <<def-event,event>> to a
9019 <<def-sub-buffer,sub-buffer>>.
9021 [[def-recording-event-rule]]<<event,recording event rule>>::
9022 Specific type of <<def-event-rule,event rule>> of which the action is
9023 to <<def-record,record>> the matched event to a
9024 <<def-sub-buffer,sub-buffer>>.
9026 [[def-tracing-session]][[def-recording-session]]<<tracing-session,recording session>>::
9027 A stateful dialogue between you and a <<lttng-sessiond,session daemon>>.
9029 [[def-tracing-session-rotation]]<<session-rotation,recording session rotation>>::
9030 The action of archiving the
9031 <<def-current-trace-chunk,current trace chunk>> of a
9032 <<def-tracing-session,recording session>>.
9034 [[def-relay-daemon]]<<lttng-relayd,relay daemon>>::
9035 A process which is responsible for receiving the <<def-trace,trace>>
9036 data which a distant <<def-consumer-daemon,consumer daemon>> sends.
9038 [[def-ring-buffer]]ring buffer::
9039 A set of <<def-sub-buffer,sub-buffers>>.
9042 See _<<def-tracing-session-rotation,recording session rotation>>_.
9044 [[def-session-daemon]]<<lttng-sessiond,session daemon>>::
9045 A process which receives control commands from you and orchestrates
9046 the <<def-tracer,tracers>> and various <<def-lttng,LTTng>> daemons.
9048 <<taking-a-snapshot,snapshot>>::
9049 A copy of the current data of all the <<def-sub-buffer,sub-buffers>>
9050 of a given <<def-tracing-session,recording session>>, saved as
9051 <<def-trace,trace>> files.
9053 [[def-sub-buffer]]sub-buffer::
9054 One part of an <<def-lttng,LTTng>> <<def-ring-buffer,ring buffer>>
9055 which contains <<def-event-record,event records>>.
9058 The time information attached to an <<def-event,event>> when LTTng
9061 [[def-trace]]trace (_noun_)::
9064 * One https://diamon.org/ctf/[CTF] metadata stream file.
9065 * One or more CTF data stream files which are the concatenations of one
9066 or more flushed <<def-sub-buffer,sub-buffers>>.
9068 [[def-trace-verb]]trace (_verb_)::
9069 From the perspective of a <<def-tracer,tracer>>: attempt to execute
9070 one or more actions when emitting an <<def-event,event>> in an
9071 application or in a system.
9073 [[def-trace-chunk]]trace chunk::
9074 A self-contained <<def-trace,trace>> which is part of a
9075 <<def-tracing-session,recording session>>. Each
9076 <<def-tracing-session-rotation, recording session rotation>> produces a
9077 <<def-trace-chunk-archive,trace chunk archive>>.
9079 [[def-trace-chunk-archive]]trace chunk archive::
9080 The result of a <<def-tracing-session-rotation, recording session
9083 <<def-lttng,LTTng>> doesn't manage any trace chunk archive, even if its
9084 containing <<def-tracing-session,recording session>> is still active: you
9085 are free to read it, modify it, move it, or remove it.
9088 The http://tracecompass.org[Trace Compass] project and application.
9090 [[def-tracepoint]]tracepoint::
9091 An instrumentation point using the tracepoint mechanism of the Linux
9092 kernel or of <<def-lttng-ust,LTTng-UST>>.
9094 tracepoint definition::
9095 The definition of a single <<def-tracepoint,tracepoint>>.
9098 The name of a <<def-tracepoint,tracepoint>>.
9100 [[def-tracepoint-provider]]tracepoint provider::
9101 A set of functions providing <<def-tracepoint,tracepoints>> to an
9102 instrumented <<def-user-application,user application>>.
9104 Not to be confused with a <<def-tracepoint-provider-package,tracepoint
9105 provider package>>: many tracepoint providers can exist within a
9106 tracepoint provider package.
9108 [[def-tracepoint-provider-package]]tracepoint provider package::
9109 One or more <<def-tracepoint-provider,tracepoint providers>> compiled
9110 as an https://en.wikipedia.org/wiki/Object_file[object file] or as a
9111 link:https://en.wikipedia.org/wiki/Library_(computing)#Shared_libraries[shared
9114 [[def-tracer]]tracer::
9115 A piece of software which executes some action when it emits
9116 an <<def-event,event>>, like <<def-record,record>> it to some
9119 <<domain,tracing domain>>::
9120 A type of LTTng <<def-tracer,tracer>>.
9122 <<tracing-group,tracing group>>::
9123 The Unix group which a Unix user can be part of to be allowed to
9124 control the Linux kernel LTTng <<def-tracer,tracer>>.
9126 [[def-trigger]]<<trigger,trigger>>::
9127 A <<def-condition,condition>>-<<def-action,actions>> pair; when the
9128 condition of a trigger is satisfied, LTTng attempts to execute its
9131 [[def-user-application]]user application::
9132 An application (program or library) running in user space, as opposed
9133 to a Linux kernel module, for example.