Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
wants to merge 2 commits into
base: main
Choose a base branch
from

Conversation

alan-maguire
Copy link

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

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
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
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.

None yet

1 participant