X-Git-Url: http://git.efficios.com/?p=babeltrace.git;a=blobdiff_plain;f=doc%2Fapi%2Flibbabeltrace2%2Fdox%2Fexamples.dox;fp=doc%2Fapi%2Flibbabeltrace2%2Fdox%2Fexamples.dox;h=507b6e4b71c484b7255ab7fe93858105be7026c0;hp=0000000000000000000000000000000000000000;hb=43c59509042845f8d42c3e99ec74d45fa2dc0908;hpb=1cda4ff4025e4b3f7bd2a861baa51d2113c4cbf9 diff --git a/doc/api/libbabeltrace2/dox/examples.dox b/doc/api/libbabeltrace2/dox/examples.dox new file mode 100644 index 00000000..507b6e4b --- /dev/null +++ b/doc/api/libbabeltrace2/dox/examples.dox @@ -0,0 +1,233 @@ +/*! +@page examples Examples + +The examples of this section apply the different parts of the +libbabeltrace2 API to accomplish real tasks. + +The available examples are: + +- \subpage example-simple-plugin-def-file +- \subpage example-simple-src-cmp-cls +- \subpage example-simple-flt-cmp-cls +- \subpage example-simple-sink-cmp-cls + +@page example-simple-plugin-def-file Simple shared object plugin definition C file + +This example shows a basic \bt_name +\ref api-plugin-dev "shared object plugin" definition C file. + +The shared object plugin's name is vestige. Therefore +the \c input and \c output \bt_p_comp_cls would be identified in the +\bt_cli command-line tool as \c source.vestige.input and +sink.vestige.output. + +Assume that \c vestige.c contains the actual source and sink component +classes's code, and that \c vestige.h contains its declarations. + +vestige-plugin.c: + +@include vestige-plugin.c + +See \ref guide-comp-link-plugin-so to learn how you could compile and +link those files as a \bt_name shared object plugin. + +@page example-simple-src-cmp-cls Simple source component class + +This example shows a basic \bt_src_comp_cls packaged as a +\ref api-plugin-dev "shared object plugin". + +The name of the plugin is dust and the name of the source +component class is input. Therefore the +component class is identified in the \bt_cli +command-line tool as source.dust.input. + +A source.dust.input \bt_comp reads a text file having this +fictitious format: + +@verbinclude dust + +That is: + +- Each line represents an event record. +- For a given line: + - The first token is the + Unix timestamp + (seconds since the Unix epoch) of the record. + - The second token is a number of microseconds to add to the Unix + timestamp. + - The third token is the event record's name: only \c send-msg and + \c recv-msg are possible. + - The remaining characters form the event record's message (payload). + +A source.dust.input component accepts a single +\ref api-comp-cls-dev-meth-init "initialization parameter", +path, which is the path of the file to open and read. + +A source.dust.input component creates a single +\bt_oport named out. + +For each line of the input file, a source.dust.input +component's \bt_msg_iter emits an \bt_ev_msg. + +To simplify this example, a source.dust.input component is +not resilient and needs a valid input and valid initialization +parameters. The code also doesn't check the return status codes of API +functions for simplicity, but you must check them in production code. + +The source component class implementation and the shared object plugin +macros are in the same file, dust.c: + +@include dust.c + +As per the \ref guide-comp-link-plugin-so guide, you can build the +shared object plugin as such: + +@code{.unparsed} +$ cc dust.c -fPIC -c $(pkg-config --cflags babeltrace2) +$ ld dust.o -o dust.so -shared $(pkg-config --libs babeltrace2) +@endcode + +With the \bt_cli tool, assuming you have a valid input file named +dust, you can view the event messages that a +source.dust.input message iterator emits: + +@code{.unparsed} +$ babeltrace2 --plugin-path=. --component=source.dust.input --params='path="dust"' +@endcode + +The output is similar to: + +@code{.unparsed} +[17:10:37.154215000] (+?.?????????) send-msg: { msg = "Jowl pig filet mignon, turducken capicola." } +[17:10:37.200774000] (+0.046559000) recv-msg: { msg = "Pork belly pig burgdoggen venison bacon." } +[17:10:41.001831000] (+3.801057000) send-msg: { msg = "Bacon ipsum dolor amet strip steak." } +[17:10:41.944187000] (+0.942356000) send-msg: { msg = "Spare ribs filet mignon boudin bresaola." } +[17:10:45.115406000] (+3.171219000) recv-msg: { msg = "Rump cow t-bone hamburger short tenderloin." } +@endcode + +You can also view more details with + +@code{.unparsed} +$ babeltrace2 --plugin-path=. --component=source.dust.input --params='path="dust"' \ + --component=sink.text.details +@endcode + +@page example-simple-flt-cmp-cls Simple filter component class + +This example shows a basic \bt_flt_comp_cls packaged as a +\ref api-plugin-dev "shared object plugin". + +The name of the plugin is distill and the name of the +filter component class is theone. Therefore the +component class is identified in the \bt_cli +command-line tool as filter.distill.theone. + +A filter.distill.theone \bt_comp removes specific +\bt_p_ev_msg from a \bt_stream based on their \bt_ev_cls's name. + +A filter.distill.theone component accepts a single +\ref api-comp-cls-dev-meth-init "initialization parameter", +names, which is an \bt_array_val of string values. The +array value contains the names of the classes of the events to discard. + +A filter.distill.theone component creates a single +\bt_iport named in and a single \bt_oport named +out. + +To simplify this example, a filter.distill.theone component +is not resilient and needs a valid input and valid initialization +parameters. The code also doesn't check the return status codes of API +functions for simplicity, but you must check them in production code. + +The filter component class implementation and the shared object plugin +macros are in the same file, distill.c: + +@include distill.c + +As per the \ref guide-comp-link-plugin-so guide, you can build the +shared object plugin as such: + +@code{.unparsed} +$ cc distill.c -fPIC -c $(pkg-config --cflags babeltrace2) +$ ld distill.o -o distill.so -shared $(pkg-config --libs babeltrace2) +@endcode + +With the \bt_cli tool, you can use a +filter.distill.theone component, reading a +CTF trace +(see \bt_man{babeltrace2-source.ctf.fs,7}) for example: + +@code{.unparsed} +$ babeltrace2 --plugin-path=. /path/to/ctf/trace \ + --component=filter.distill.theone \ + --params='names=["sched_switch", "rcu_utilization", "kmem_kfree"]' +@endcode + +@page example-simple-sink-cmp-cls Simple sink component class + +This example shows a basic \bt_sink_comp_cls packaged as a +\ref api-plugin-dev "shared object plugin". + +The name of the plugin is epitome and the name of the +sink component class is output. Therefore the component +class is identified in the \bt_cli +command-line tool as sink.epitome.output. + +A sink.epitome.output \bt_comp prints one text line to +the standard output for each \bt_ev_msg it consumes, for +example: + +@code{.unparsed} +#1: kmem_kmalloc (5 payload members) +#2: kmem_kfree (2 payload members) +#3: sched_waking (4 payload members) +#4: sched_migrate_task (5 payload members) +#5: sched_stat_runtime (4 payload members) +#6: sched_wakeup (4 payload members) +#7: rcu_utilization (1 payload member) +#8: rcu_utilization (1 payload member) +#9: sched_switch (7 payload members) +#10: syscall_entry_write (3 payload members) +... +@endcode + +For each line, there is: + +- The event message's index (simple counter). +- The event message's \bt_ev_cls \ref api-tir-ev-cls-prop-name "name". +- The number of members in the event message's \bt_ev's + \ref api-tir-ev-prop-payload "payload field". + +A sink.epitome.output component does not need any +\ref api-comp-cls-dev-meth-init "initialization parameter": it just +prints to the standard output. + +A sink.epitome.output component creates a single +\bt_iport named in. + +To simplify this example, a sink.epitome.output component +doesn't check the return status codes of API functions, +but you must check them in production code. + +The sink component class implementation and the shared object plugin +macros are in the same file, epitome.c: + +@include epitome.c + +As per the \ref guide-comp-link-plugin-so guide, you can build the +shared object plugin as such: + +@code{.unparsed} +$ cc epitome.c -fPIC -c $(pkg-config --cflags babeltrace2) +$ ld epitome.o -o epitome.so -shared $(pkg-config --libs babeltrace2) +@endcode + +With the \bt_cli tool, you can use a +sink.epitome.output component, reading a +CTF trace +(see \bt_man{babeltrace2-source.ctf.fs,7}) for example: + +@code{.unparsed} +$ babeltrace2 --plugin-path=. /path/to/ctf/trace --component=sink.epitome.output +@endcode +*/