Tracing/USDT
Userland Statically Defined Tracing
Некоторый софт позволяет добавлять статические точки трассировки (трейспоинты) для удобства его отладки в сложных местах где трудно сделать другие виды трассировки, улучшая т.н. observability системы.
Например, такая поддержка есть у некоторых языков (java, perl, php, python, ruby, tcl, nodejs, dotnet), приложений (mariadb, postgresql, couchdb, systemd-udev, sssd, ceph), библиотек (grpc, glibc, glib, zlib). У нас эти пакеты пока собраны без такой поддержки и требуют её включения.
Исторически эти трейспоинты восходят к Solaris Dtrace, а в Линукс впервые попали через SystemTap. Нужно отметить, что данная реализация USDT использует только хедер sys/sdt.h
предоставляемый SystemTap, но не использует прочий SystemTap функционал или инфраструктуру.
Сборка пакета с поддержкой usdt
Маинтайнеру зачастую достаточно сделать два изменения spec'а: 1) добавить
BuildRequires: systemtap-sdt-devel
который приносит необходимый Си хедер, и 2) добавить соответствующую опцию configure
, например (её название может отличаться):
%configure --enable-dtrace
Другие варианты: --with-dtrace
, --enable-systemtap
, --with-systemtap
.
В результате — в коде в точке трассировке добавляется один nop
не влияющий на производительность при отключенной трассировке, а в ELF бинарник в секцию .note.stapsdt
записывается описание каждого трейспоинта и его аргументов. Проверить их наличие можно командой eu-readelf --notes=.note.stapsdt путь-к-бинарнику
. Пример для трейспоинта с именем example:test (имеющим один аргумент) и находящимся в бинарнике ./example:
$ eu-readelf --notes=.note.stapsdt ./example Note section [30] '.note.stapsdt' of 68 bytes at offset 0x3174: Owner Data size Type stapsdt 45 Version: 3 PC: 0x1153, Base: 0x2004, Semaphore: 0 Provider: example, Name: test, Args: '8@%rax'
Доп. материалы
- https://leezhenghui.github.io/linux/2019/03/05/exploring-usdt-on-linux.html Exploring USDT Probes on Linux
- https://lwn.net/Articles/753601/ Using user-space tracepoints with BPF [2018]
- https://www.brendangregg.com/blog/2016-10-12/linux-bcc-nodejs-usdt.html Linux bcc/BPF Node.js USDT Tracing
- https://www.brendangregg.com/blog/2015-07-03/hacking-linux-usdt-ftrace.html Hacking Linux USDT with Ftrace
- https://www.brendangregg.com/perf.html#StaticUserTracing §6.5. Static User Tracing
- https://www.sourceware.org/systemtap/wiki/AddingUserSpaceProbingToApps Adding User Space Probing to an Application