This page describes how to register a new trace provider in a Fuchsia system.
To participate in tracing, new trace providers must be registered with the
trace manager in the Fuchsia tracing system.
(However, drivers don't have to register as a trace provider since the devhost
process does it through libdriver.so
.)
To register a trace provider, the steps are:
Register a component with the trace manager
To register a component as a trace provider, you can use the libtrace-provider
library to provide an asynchronous loop in your component's code.
See the examples below:
C++
#include <lib/async-loop/cpp/loop.h>
#include <lib/async-loop/default.h>
#include <lib/trace-provider/provider.h>
// further includes
int main(int argc, const char** argv) {
// process argv
async::Loop loop(&kAsyncLoopConfigAttachToCurrentThread);
trace::TraceProviderWithFdio trace_provider(
loop.dispatcher(), "my_trace_provider");
// further setup
loop.Run();
return 0;
}
C
#include <lib/async-loop/cpp/loop.h>
#include <lib/async-loop/default.h>
#include <lib/trace-provider/provider.h>
int main(int argc, char** argv) {
zx_status_t status;
async_loop_t* loop;
trace_provider_t* trace_provider;
// Create a message loop.
status = async_loop_create(&kAsyncLoopConfigNoAttachToCurrentThread, &loop);
if (status != ZX_OK) exit(1);
// Start a thread for the loop to run on.
// Alternatively, use async_loop_run() to run on the current thread.
status = async_loop_start_thread(loop, "loop", NULL);
if (status != ZX_OK) exit(1);
// Create the trace provider.
async_dispatcher_t* dispatcher = async_loop_get_dispatcher(loop);
trace_provider = trace_provider_create(dispatcher);
if (!trace_provider) exit(1);
// Do something...
// Tear down.
trace_provider_destroy(trace_provider);
async_loop_shutdown(loop);
return 0;
}
Rust
fn main() {
fuchsia_trace_provider::trace_provider_create_with_fdio();
// ...
}
Set up capability routing
For your component to request the appropriate tracing capabilities,
include the following field in the component manifest (.cml
):
{
include: [
"trace/client.shard.cml",
],
...
}
This allows your component to communicate with the trace manager using the
fuchsia.tracing.provider.Registry
protocol as well as forward the offer to
its direct children. If your component is a child of another component, you'll
need to include the client.shard.cml
in each of the parents' cmls as well.
If your component uses a Chromium-based fuchsia.web
service and you want
to be able to collect trace data from it, both the
fuchsia.tracing.provider.Registry
and
fuchsia.tracing.perfetto.ProducerConnector
capabilities need to be provided
to your Context
. (To understand how capabilities are passed to the Context
,
see fuchsia.web/CreateContextParams.service_directory
.)
Once you have registered your component as a trace provider, you can enable tracing in your code. For more information, see the next Add tracing in your code page.