Es un lenguaje de rastreo de alto nivel para el Filtro de Paquetes Berkeley [Enhanced Berkeley Packet Filter - eBPF]. Permite escribir scripts concisos y expresivos para observar eventos tanto en el kernel como en el espacio de usuario, facilitando la depuración, la optimización del rendimiento y la observabilidad. Incluye las aplicaciones bpftrace-aotrt, bashreadline.bt, biolatency.bt, biosnoop.bt, biostacks.bt, bitesize.bt, capable.bt, cpuwalk.bt, dcsnoop.bt, execsnoop.bt, gethostlatency.bt, killsnoop.bt, loads.bt, mdflush.bt, naptime.bt, oomkill.bt, opensnoop.bt, pidpersec.bt, runqlat.bt, runqlen.bt, setuids.bt, ssllatency.bt, sslsnoop.bt, statsnoop.bt, swapin.bt, syncsnoop.bt, syscount.bt, tcpaccept.bt, tcpconnect.bt, tcpdrop.bt, tcplife.bt, tcpretrans.bt, tcpsynbl.bt, threadsnoop.bt, undump.bt, vfscount.bt, vfsstat.bt, writeback.bt y xfsdist.bt.
# bpftrace -e 'BEGIN { printf("Hello, World!\n"); }'
# bpftrace -e 'kprobe:do_nanosleep { printf("%d durmiendo\n", pid); }'
# bpftrace -e 'tracepoint:raw_syscalls:sys_enter { @[comm] = count(); }'
tracepoint:raw_syscalls:sys_enter --> Un tracepoint que se activa en cada entrada de llamada al sistema.
@[comm] = count(); --> Utiliza un mapa [@] con el nombre del comando [comm] como clave para contar las ocurrencias.
# bpftrace -e 'tracepoint:syscalls:sys_enter_openat { printf("%s %s\n", comm, str(args->filename)); }'
tracepoint:syscalls:sys_enter_openat --> Tracepoint para la entrada de la llamada al sistema openat.
str(args->filename) --> Convierte el argumento filename [que es un puntero] a una cadena legible.
# bpftrace -e 'kprobe:vfs_read { @start[tid] = nsecs; } kretprobe:vfs_read /@start[tid]/ { @ns[comm] = hist(nsecs - @start[tid]); delete(@start[tid]); }'
kprobe:vfs_read --> En la entrada de vfs_read, guarda el timestamp actual en un mapa @start usando el ID del hilo [tid] como clave.
kretprobe:vfs_read --> En la salida de vfs_read.
/@start[tid]/ --> Una condición que asegura que solo procesamos las kretprobe si tenemos un timestamp de inicio correspondiente, evitando errores si el hilo ha terminado o si el rastreo se inició a mitad de una operación.
@ns[comm] = hist(nsecs - @start[tid]); --> Calcula la duración [nsecs - @start[tid]] y la agrega a un histograma [hist] en un mapa @ns, agrupado por el nombre del proceso [comm].
delete(@start[tid]); --> Elimina la entrada del mapa @start para liberar memoria.
# bpftrace -e 'uprobe:/bin/bash:readline { printf("Bash leyendo entrada: %s\n", comm); }'
uprobe:/bin/bash:readline --> Se adjunta a la entrada de la función readline en el ejecutable /bin/bash.
Nota.- bpftrace incluye una colección de herramientas y scripts predefinidos, normalmente en /usr/share/bpftrace/tools o similar, que facilitan el rastreo de problemas comunes.
# bpftrace /usr/share/bpftrace/tools/biolatency.bt
# bpftrace /usr/share/bpftrace/tools/bashreadline.bt
# bpftrace /usr/share/bpftrace/tools/biolatency.bt
# bpftrace /usr/share/bpftrace/tools/biosnoop.bt
# bpftrace /usr/share/bpftrace/tools/execsnoop.bt (muestra cada nueva ejecución de programa
# bpftrace /usr/share/bpftrace/tools/opensnoop.bt (muestra cada llamada a `open()` y `openat
# bpftrace /usr/share/bpftrace/tools/tcpconnect.bt
# bpftrace /usr/share/bpftrace/tools/tcplife.bt
# bpftrace /usr/share/bpftrace/tools/ext4slower.bt