Skip to content

Support systemwide probe firing, more tracers by adding a USDT probe to libstapsdt for probe firing#32

Open
alan-maguire wants to merge 2 commits into
linux-usdt:mainfrom
alan-maguire:systemwide
Open

Support systemwide probe firing, more tracers by adding a USDT probe to libstapsdt for probe firing#32
alan-maguire wants to merge 2 commits into
linux-usdt:mainfrom
alan-maguire:systemwide

Conversation

@alan-maguire

@alan-maguire alan-maguire commented Feb 6, 2024

Copy link
Copy Markdown

By adding a USDT probe for probe firing to libstapsdt itself, we allow all tracers (which do not already know how to get access to the memfd-based dynamic libraries that libstapsdt creates) that have USDT support to trace dynamic probe firings originating from libstapsdt.so. By tracing stapsdt/probe in libstapsdt.so, such tracers can see dynamic probe firings and critically also see them systemwide. The probe is an 8-argument USDT probe; first two args are provider/probe name, remainder are arguments (zeroed out if unset). A consumer looking for a particular probe firing can use the provider/probe names to distinguish it.

Patch 1 adds the support in stapsdt-probe.c. Is-enabled support is via the stapsdt probe semaphore, which manages
reference count for us.

Patch 2 adds to the README describing the probe and how to trace with it.

By adding a USDT probe for stapsdt-created probe firings, we can
enable tools and tracers that understand USDT but do not support
tracing in the dynamically-created shared library, allowing them
to catch dynamic probe firings.  For example, using libbpf, we could
write a BPF program as follows:

SEC("usdt//usr/lib/libstapsdt.so:stapsdt:probe")
int BPF_USDT(args, const char *provider, const char *probename,
	     const char *str, int val)
{
  __bpf_printk("%s/%s fired\n", provider, probename);
  __bpf_printk("got %s, %d args\n", str, val);
  return 0;
}

When attached to the stapsdt:probe in /usr/lib/libstapsdt.so
as above, we can trace events system-wide.

For example, with the above BPF program attached - and running
the example.py from python stapsdt, we see:

 $ cat /sys/kernel/debug/tracing/trace_pipe
         python3-496195  [003] ...11 345760.365976: bpf_trace_printk: pythonapp/firstProbe fired

         python3-496195  [003] ...11 345760.365979: bpf_trace_printk: got My little probe, 42 args

And we will see firings across all processes that utilize
libstapsdt.

Is-enabled support is added via a semaphore for the stapsdt
probe - if the semaphore has a value > 0, it is being traced
and all probes should be considered enabled.

Signed-off-by: Alan Maguire <alan.maguire@oracle.com>
...and provide a BPF C example of tracing using it.

Signed-off-by: Alan Maguire <alan.maguire@oracle.com>
@alan-maguire

Copy link
Copy Markdown
Author

@mmarchini sorry not sure if I should tag specific folks to request review of the above? I'm not seeing a way to edit the PR to add reviewers.

@alan-maguire

Copy link
Copy Markdown
Author

@dalehamel @mmarchini hi folks, wondering if anyone has any suggestions on the above? the wider aim is to make libstapsdt-based probes available to more tracers, and to libbpf-based BPF programs. thanks!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant