4 The LTTng project aims at providing highly efficient tracing tools for Linux.
5 It's tracers help tracking down performance issues and debugging problems involving
6 multiple concurrent processes and threads. Tracing across multiple systems is also possible."
9 %module(docstring=DOCSTRING) lttng
15 #define SWIG_FILE_WITH_INIT
16 #include <lttng/lttng.h>
20 #if PY_MAJOR_VERSION >= 3
21 // The PyInt and PyLong types were unified as of Python 3
22 // This makes the typemap code useable with both Python 2 and 3.
23 #define PyInt_AsSsize_t PyLong_AsSsize_t
27 typedef unsigned int uint32_t;
29 typedef unsigned long long uint64_t;
33 // =============================================
35 // These are directly taken from lttng.h.
36 // Any change to these enums must also be
38 // =============================================
40 %rename("DOMAIN_KERNEL") LTTNG_DOMAIN_KERNEL;
41 %rename("DOMAIN_UST") LTTNG_DOMAIN_UST;
42 enum lttng_domain_type {
43 LTTNG_DOMAIN_KERNEL = 1,
47 %rename("BUFFER_PER_PID") LTTNG_BUFFER_PER_PID;
48 %rename("BUFFER_PER_UID") LTTNG_BUFFER_PER_UID;
49 %rename("BUFFER_GLOBAL") LTTNG_BUFFER_GLOBAL;
50 enum lttng_buffer_type {
56 %rename("EVENT_ALL") LTTNG_EVENT_ALL;
57 %rename("EVENT_TRACEPOINT") LTTNG_EVENT_TRACEPOINT;
58 %rename("EVENT_PROBE") LTTNG_EVENT_PROBE;
59 %rename("EVENT_FUNCTION")LTTNG_EVENT_FUNCTION;
60 %rename("EVENT_FUNCTION_ENTRY") LTTNG_EVENT_FUNCTION_ENTRY;
61 %rename("EVENT_NOOP") LTTNG_EVENT_NOOP;
62 %rename("EVENT_SYSCALL") LTTNG_EVENT_SYSCALL;
63 enum lttng_event_type {
65 LTTNG_EVENT_TRACEPOINT = 0,
66 LTTNG_EVENT_PROBE = 1,
67 LTTNG_EVENT_FUNCTION = 2,
68 LTTNG_EVENT_FUNCTION_ENTRY = 3,
70 LTTNG_EVENT_SYSCALL = 5,
73 %rename("EVENT_LOGLEVEL_ALL") LTTNG_EVENT_LOGLEVEL_ALL;
74 %rename("EVENT_LOGLEVEL_RANGE") LTTNG_EVENT_LOGLEVEL_RANGE;
75 %rename("EVENT_LOGLEVEL_SINGLE") LTTNG_EVENT_LOGLEVEL_SINGLE;
76 enum lttng_loglevel_type {
77 LTTNG_EVENT_LOGLEVEL_ALL = 0,
78 LTTNG_EVENT_LOGLEVEL_RANGE = 1,
79 LTTNG_EVENT_LOGLEVEL_SINGLE = 2,
82 %rename("LOGLEVEL_EMERG") LTTNG_LOGLEVEL_EMERG;
83 %rename("LOGLEVEL_ALERT") LTTNG_LOGLEVEL_ALERT;
84 %rename("LOGLEVEL_CRIT") LTTNG_LOGLEVEL_CRIT;
85 %rename("LOGLEVEL_ERR") LTTNG_LOGLEVEL_ERR;
86 %rename("LOGLEVEL_WARNING") LTTNG_LOGLEVEL_WARNING;
87 %rename("LOGLEVEL_NOTICE") LTTNG_LOGLEVEL_NOTICE;
88 %rename("LOGLEVEL_INFO") LTTNG_LOGLEVEL_INFO;
89 %rename("LOGLEVEL_DEBUG_SYSTEM") LTTNG_LOGLEVEL_DEBUG_SYSTEM;
90 %rename("LOGLEVEL_DEBUG_PROGRAM") LTTNG_LOGLEVEL_DEBUG_PROGRAM;
91 %rename("LOGLEVEL_DEBUG_PROCESS") LTTNG_LOGLEVEL_DEBUG_PROCESS;
92 %rename("LOGLEVEL_DEBUG_MODULE") LTTNG_LOGLEVEL_DEBUG_MODULE;
93 %rename("LOGLEVEL_DEBUG_UNIT") LTTNG_LOGLEVEL_DEBUG_UNIT;
94 %rename("LOGLEVEL_DEBUG_FUNCTION") LTTNG_LOGLEVEL_DEBUG_FUNCTION;
95 %rename("LOGLEVEL_DEBUG_LINE") LTTNG_LOGLEVEL_DEBUG_LINE;
96 %rename("LOGLEVEL_DEBUG") LTTNG_LOGLEVEL_DEBUG;
98 LTTNG_LOGLEVEL_EMERG = 0,
99 LTTNG_LOGLEVEL_ALERT = 1,
100 LTTNG_LOGLEVEL_CRIT = 2,
101 LTTNG_LOGLEVEL_ERR = 3,
102 LTTNG_LOGLEVEL_WARNING = 4,
103 LTTNG_LOGLEVEL_NOTICE = 5,
104 LTTNG_LOGLEVEL_INFO = 6,
105 LTTNG_LOGLEVEL_DEBUG_SYSTEM = 7,
106 LTTNG_LOGLEVEL_DEBUG_PROGRAM = 8,
107 LTTNG_LOGLEVEL_DEBUG_PROCESS = 9,
108 LTTNG_LOGLEVEL_DEBUG_MODULE = 10,
109 LTTNG_LOGLEVEL_DEBUG_UNIT = 11,
110 LTTNG_LOGLEVEL_DEBUG_FUNCTION = 12,
111 LTTNG_LOGLEVEL_DEBUG_LINE = 13,
112 LTTNG_LOGLEVEL_DEBUG = 14,
115 %rename("EVENT_SPLICE") LTTNG_EVENT_SPLICE;
116 %rename("EVENT_MMAP") LTTNG_EVENT_MMAP;
117 enum lttng_event_output {
118 LTTNG_EVENT_SPLICE = 0,
119 LTTNG_EVENT_MMAP = 1,
122 %rename("EVENT_CONTEXT_PID") LTTNG_EVENT_CONTEXT_PID;
123 %rename("EVENT_CONTEXT_PERF_COUNTER") LTTNG_EVENT_CONTEXT_PERF_COUNTER;
124 %rename("EVENT_CONTEXT_PROCNAME") LTTNG_EVENT_CONTEXT_PROCNAME;
125 %rename("EVENT_CONTEXT_PRIO") LTTNG_EVENT_CONTEXT_PRIO;
126 %rename("EVENT_CONTEXT_NICE") LTTNG_EVENT_CONTEXT_NICE;
127 %rename("EVENT_CONTEXT_VPID") LTTNG_EVENT_CONTEXT_VPID;
128 %rename("EVENT_CONTEXT_TID") LTTNG_EVENT_CONTEXT_TID;
129 %rename("EVENT_CONTEXT_VTID") LTTNG_EVENT_CONTEXT_VTID;
130 %rename("EVENT_CONTEXT_PPID") LTTNG_EVENT_CONTEXT_PPID;
131 %rename("EVENT_CONTEXT_VPPID") LTTNG_EVENT_CONTEXT_VPPID;
132 %rename("EVENT_CONTEXT_PTHREAD_ID") LTTNG_EVENT_CONTEXT_PTHREAD_ID;
133 %rename("EVENT_CONTEXT_HOSTNAME") LTTNG_EVENT_CONTEXT_HOSTNAME;
134 %rename("EVENT_CONTEXT_IP") LTTNG_EVENT_CONTEXT_IP;
135 %rename("EVENT_CONTEXT_PERF_CPU_COUNTER") LTTNG_EVENT_CONTEXT_PERF_CPU_COUNTER;
136 %rename("EVENT_CONTEXT_PERF_THREAD_COUNTER") LTTNG_EVENT_CONTEXT_PERF_THREAD_COUNTER;
137 %rename("EVENT_CONTEXT_APP_CONTEXT") LTTNG_EVENT_CONTEXT_APP_CONTEXT;
138 %rename("EVENT_CONTEXT_INTERRUPTIBLE") LTTNG_EVENT_CONTEXT_INTERRUPTIBLE;
139 %rename("EVENT_CONTEXT_PREEMPTIBLE") LTTNG_EVENT_CONTEXT_PREEMPTIBLE;
140 %rename("EVENT_CONTEXT_NEED_RESCHEDULE") LTTNG_EVENT_CONTEXT_NEED_RESCHEDULE;
141 %rename("EVENT_CONTEXT_MIGRATABLE") LTTNG_EVENT_CONTEXT_MIGRATABLE;
142 enum lttng_event_context_type {
143 LTTNG_EVENT_CONTEXT_PID = 0,
144 LTTNG_EVENT_CONTEXT_PERF_COUNTER = 1,
145 LTTNG_EVENT_CONTEXT_PROCNAME = 2,
146 LTTNG_EVENT_CONTEXT_PRIO = 3,
147 LTTNG_EVENT_CONTEXT_NICE = 4,
148 LTTNG_EVENT_CONTEXT_VPID = 5,
149 LTTNG_EVENT_CONTEXT_TID = 6,
150 LTTNG_EVENT_CONTEXT_VTID = 7,
151 LTTNG_EVENT_CONTEXT_PPID = 8,
152 LTTNG_EVENT_CONTEXT_VPPID = 9,
153 LTTNG_EVENT_CONTEXT_PTHREAD_ID = 10,
154 LTTNG_EVENT_CONTEXT_HOSTNAME = 11,
155 LTTNG_EVENT_CONTEXT_IP = 12,
156 LTTNG_EVENT_CONTEXT_PERF_CPU_COUNTER = 13,
157 LTTNG_EVENT_CONTEXT_PERF_THREAD_COUNTER = 14,
158 LTTNG_EVENT_CONTEXT_APP_CONTEXT = 15,
159 LTTNG_EVENT_CONTEXT_INTERRUPTIBLE = 16,
160 LTTNG_EVENT_CONTEXT_PREEMPTIBLE = 17,
161 LTTNG_EVENT_CONTEXT_NEED_RESCHEDULE = 18,
162 LTTNG_EVENT_CONTEXT_MIGRATABLE = 19,
168 // =============================================
170 // =============================================
173 %typemap(argout) struct lttng_session **sessions{
175 int l = PyInt_AsSsize_t($result);
178 PyObject *sessions = PyList_New(0);
182 PyObject *tmp = PyTuple_New(4);
183 PyObject *name = PyString_FromString((*$1)[i].name);
184 PyObject *path = PyString_FromString((*$1)[i].path);
185 PyObject *enabled = PyInt_FromSize_t((*$1)[i].enabled);
186 PyObject *padding = PyString_FromString((*$1)[i].padding);
188 PyTuple_SetItem(tmp, 0, name);
189 PyTuple_SetItem(tmp, 1, path);
190 PyTuple_SetItem(tmp, 2, enabled);
191 PyTuple_SetItem(tmp, 3, padding);
192 PyList_Append(sessions, tmp);
197 %typemap(in,numinputs=0) struct lttng_session **sessions (struct lttng_session *temp){
202 %typemap(argout) struct lttng_domain **domains{
204 int l = PyInt_AsSsize_t($result);
207 PyObject *dom = PyList_New(0);
211 PyObject *tmp = PyTuple_New(6);
212 PyObject *type = PyInt_FromSize_t((*$1)[i].type);
213 PyObject *buf_type = PyInt_FromSize_t((*$1)[i].buf_type);
214 PyObject *execname = PyString_FromString((*$1)[i].attr.exec_name);
215 PyObject *pid = PyInt_FromSize_t((*$1)[i].attr.pid);
216 PyObject *padding = PyString_FromString((*$1)[i].padding);
217 PyObject *attrpadding = PyString_FromString((*$1)[i].attr.padding);
219 PyTuple_SetItem(tmp, 0, type);
220 PyTuple_SetItem(tmp, 1, buf_type);
221 PyTuple_SetItem(tmp, 2, padding);
222 PyTuple_SetItem(tmp, 3, pid);
223 PyTuple_SetItem(tmp, 4, execname);
224 PyTuple_SetItem(tmp, 5, attrpadding);
225 PyList_Append(dom, tmp);
230 %typemap(in,numinputs=0) struct lttng_domain **domains (struct lttng_domain *temp){
235 %typemap(argout) struct lttng_channel **channels{
237 int l = PyInt_AsSsize_t($result);
240 PyObject *chan = PyList_New(0);
244 PyObject *tmp = PyTuple_New(4);
245 PyObject *name = PyString_FromString((*$1)[i].name);
246 PyObject *enabled = PyInt_FromSize_t((*$1)[i].enabled);
247 PyObject *padding = PyString_FromString((*$1)[i].padding);
249 PyObject *attrtmp = PyTuple_New(7);
250 PyObject *overwrite = PyInt_FromLong((*$1)[i].attr.overwrite);
251 PyObject *subbuf = PyInt_FromSize_t((*$1)[i].attr.subbuf_size);
252 PyObject *num = PyInt_FromSize_t((*$1)[i].attr.num_subbuf);
253 PyObject *switchtimer = PyInt_FromSize_t((*$1)[i].attr.switch_timer_interval);
254 PyObject *readtimer = PyInt_FromSize_t((*$1)[i].attr.read_timer_interval);
255 PyObject *output = PyInt_FromSize_t((*$1)[i].attr.output);
256 PyObject *attrpad = PyString_FromString((*$1)[i].attr.padding);
258 PyTuple_SetItem(attrtmp, 0, overwrite);
259 PyTuple_SetItem(attrtmp, 1, subbuf);
260 PyTuple_SetItem(attrtmp, 2, num);
261 PyTuple_SetItem(attrtmp, 3, switchtimer);
262 PyTuple_SetItem(attrtmp, 4, readtimer);
263 PyTuple_SetItem(attrtmp, 5, output);
264 PyTuple_SetItem(attrtmp, 6, attrpad);
266 PyTuple_SetItem(tmp, 0, name);
267 PyTuple_SetItem(tmp, 1, enabled);
268 PyTuple_SetItem(tmp, 2, padding);
269 PyTuple_SetItem(tmp, 3, attrtmp);
270 PyList_Append(chan, tmp);
275 %typemap(in,numinputs=0) struct lttng_channel **channels (struct lttng_channel *temp){
279 //list_events & list_tracepoints
280 %typemap(argout) struct lttng_event **events{
282 int l = PyInt_AsSsize_t($result);
285 PyObject *events = PyList_New(0);
289 PyObject *tmp = PyTuple_New(10);
290 PyObject *name = PyString_FromString((*$1)[i].name);
291 PyObject *type = PyInt_FromSize_t((*$1)[i].type);
292 PyObject *logleveltype = PyInt_FromSize_t((*$1)[i].loglevel_type);
293 PyObject *loglevel = PyInt_FromLong((*$1)[i].loglevel);
294 PyObject *enabled = PyInt_FromLong((*$1)[i].enabled);
295 PyObject *pid = PyInt_FromSize_t((*$1)[i].pid);
296 PyObject *padding = PyString_FromString((*$1)[i].padding);
297 PyObject *attrpadding = PyString_FromString((*$1)[i].attr.padding);
299 PyObject *probe = PyTuple_New(4);
300 PyObject *addr = PyInt_FromSize_t((*$1)[i].attr.probe.addr);
301 PyObject *offset = PyInt_FromSize_t((*$1)[i].attr.probe.offset);
302 PyObject *symbolname = PyString_FromString((*$1)[i].attr.probe.symbol_name);
303 PyObject *probepad = PyString_FromString((*$1)[i].attr.probe.padding);
305 PyObject *function = PyTuple_New(2);
306 PyObject *f_symbolname = PyString_FromString((*$1)[i].attr.ftrace.symbol_name);
307 PyObject *f_pad = PyString_FromString((*$1)[i].attr.ftrace.padding);
309 PyTuple_SetItem(function, 0, f_symbolname);
310 PyTuple_SetItem(function, 1, f_pad);
312 PyTuple_SetItem(probe, 0, addr);
313 PyTuple_SetItem(probe, 1, offset);
314 PyTuple_SetItem(probe, 2, symbolname);
315 PyTuple_SetItem(probe, 3, probepad);
317 PyTuple_SetItem(tmp, 0, name);
318 PyTuple_SetItem(tmp, 1, type);
319 PyTuple_SetItem(tmp, 2, logleveltype);
320 PyTuple_SetItem(tmp, 3, loglevel);
321 PyTuple_SetItem(tmp, 4, enabled);
322 PyTuple_SetItem(tmp, 5, pid);
323 PyTuple_SetItem(tmp, 6, padding);
324 PyTuple_SetItem(tmp, 7, probe);
325 PyTuple_SetItem(tmp, 8, function);
326 PyTuple_SetItem(tmp, 9, attrpadding);
327 PyList_Append(events, tmp);
332 %typemap(in,numinputs=0) struct lttng_event **events (struct lttng_event *temp){
338 // =============================================
340 // =============================================
342 %rename("create") lttng_create_session(const char *name, const char *path);
343 %rename("create_snapshot") lttng_create_session_snapshot(const char *name, const char *snapshot_url);
344 %rename("destroy") lttng_destroy_session(const char *name);
345 %rename("_lttng_create_handle") lttng_create_handle(const char *session_name, struct lttng_domain *domain);
346 %rename("_lttng_destroy_handle") lttng_destroy_handle(struct lttng_handle *handle);
347 %rename("_lttng_list_sessions") lttng_list_sessions(struct lttng_session **sessions);
348 %rename("_lttng_list_domains") lttng_list_domains(const char *session_name, struct lttng_domain **domains);
349 %rename("_lttng_list_channels") lttng_list_channels(struct lttng_handle *handle,struct lttng_channel **channels);
350 %rename("_lttng_list_events") lttng_list_events(struct lttng_handle *handle, const char *channel_name, struct lttng_event **events);
351 %rename("_lttng_list_tracepoints") lttng_list_tracepoints(struct lttng_handle *handle, struct lttng_event **events);
352 %rename("session_daemon_alive") lttng_session_daemon_alive(void);
353 %rename("set_tracing_group") lttng_set_tracing_group(const char *name);
354 %rename("strerror") lttng_strerror(int code);
355 %rename("_lttng_register_consumer") lttng_register_consumer(struct lttng_handle *handle, const char *socket_path);
356 %rename("start") lttng_start_tracing(const char *session_name);
357 %rename("stop") lttng_stop_tracing(const char *session_name);
358 %rename("_lttng_add_context") lttng_add_context(struct lttng_handle *handle, struct lttng_event_context *ctx, const char *event_name, const char *channel_name);
359 %rename("_lttng_enable_event") lttng_enable_event(struct lttng_handle *handle, struct lttng_event *ev, const char *channel_name);
360 %rename("_lttng_enable_channel") lttng_enable_channel(struct lttng_handle *handle, struct lttng_channel *chan);
361 %rename("_lttng_disable_event") lttng_disable_event(struct lttng_handle *handle, const char *name, const char *channel_name);
362 %rename("_lttng_disable_channel") lttng_disable_channel(struct lttng_handle *handle, const char *name);
363 %rename("channel_set_default_attr") lttng_channel_set_default_attr(struct lttng_domain *domain, struct lttng_channel_attr *attr);
365 //Redefined functions
366 struct lttng_handle *lttng_create_handle(const char *session_name,
367 struct lttng_domain *domain);
368 void lttng_destroy_handle(struct lttng_handle *handle);
369 int lttng_list_channels(struct lttng_handle *handle,struct lttng_channel **channels);
370 int lttng_list_events(struct lttng_handle *handle,
371 const char *channel_name, struct lttng_event **events);
372 int lttng_list_tracepoints(struct lttng_handle *handle, struct lttng_event **events);
373 int lttng_add_context(struct lttng_handle *handle, struct lttng_event_context *ctx,
374 const char *event_name, const char *channel_name);
375 int lttng_enable_event(struct lttng_handle *handle,
376 struct lttng_event *ev, const char *channel_name);
377 int lttng_enable_channel(struct lttng_handle *handle, struct lttng_channel *chan);
378 int lttng_disable_event(struct lttng_handle *handle,
379 const char *name, const char *channel_name);
380 int lttng_disable_channel(struct lttng_handle *handle, const char *name);
381 int lttng_register_consumer(struct lttng_handle *handle, const char *socket_path);
382 int lttng_list_sessions(struct lttng_session **sessions);
383 int lttng_list_domains(const char *session_name, struct lttng_domain **domains);
385 //Functions not needing redefinition
386 %feature("docstring")"create(str name, str path) -> int
388 Create a new tracing session using name and path.
389 Returns 0 on success or a negative error code."
390 int lttng_create_session(const char *name, const char *path);
392 %feature("docstring")"create_snapshot(str name, str snapshot_url) -> int
394 Create a new tracing session using name and snapshot_url in snapshot
395 mode (flight recorder).
396 Returns 0 on success or a negative error code."
397 int lttng_create_session_snapshot(const char *name, const char *path);
399 %feature("docstring")"destroy(str name) -> int
401 Tear down tracing session using name.
402 Returns 0 on success or a negative error code."
403 int lttng_destroy_session(const char *name);
406 %feature("docstring")"session_daemon_alive() -> int
408 Check if session daemon is alive.
409 Return 1 if alive or 0 if not.
410 On error returns a negative value."
411 int lttng_session_daemon_alive(void);
414 %feature("docstring")"set_tracing_group(str name) -> int
416 Sets the tracing_group variable with name.
417 This function allocates memory pointed to by tracing_group.
418 On success, returns 0, on error, returns -1 (null name) or -ENOMEM."
419 int lttng_set_tracing_group(const char *name);
422 %feature("docstring")"strerror(int code) -> char
424 Returns a human readable string describing
425 the error code (a negative value)."
426 const char *lttng_strerror(int code);
429 %feature("docstring")"start(str session_name) -> int
431 Start tracing for all traces of the session.
432 Returns size of returned session payload data or a negative error code."
433 int lttng_start_tracing(const char *session_name);
436 %feature("docstring")"stop(str session_name) -> int
438 Stop tracing for all traces of the session.
439 Returns size of returned session payload data or a negative error code."
440 int lttng_stop_tracing(const char *session_name);
443 %feature("docstring")"channel_set_default_attr(Domain domain, ChannelAttr attr)
445 Set default channel attributes.
446 If either or both of the arguments are null, attr content is zeroe'd."
447 void lttng_channel_set_default_attr(struct lttng_domain *domain, struct lttng_channel_attr *attr);
450 // =============================================
451 // Python redefinition of some functions
452 // (List and Handle-related)
453 // =============================================
455 %feature("docstring")""
460 list_sessions() -> dict
462 Ask the session daemon for all available sessions.
463 Returns a dict of Session instances, the key is the name;
464 on error, returns a negative value.
467 ses_list = _lttng_list_sessions()
468 if type(ses_list) is int:
473 for ses_elements in ses_list:
475 ses.name = ses_elements[0]
476 ses.path = ses_elements[1]
477 ses.enabled = ses_elements[2]
478 ses.padding = ses_elements[3]
480 sessions[ses.name] = ses
485 def list_domains(session_name):
487 list_domains(str session_name) -> list
489 Ask the session daemon for all available domains of a session.
490 Returns a list of Domain instances;
491 on error, returns a negative value.
494 dom_list = _lttng_list_domains(session_name)
495 if type(dom_list) is int:
500 for dom_elements in dom_list:
502 dom.type = dom_elements[0]
503 dom.buf_type = dom_elements[1]
504 dom.paddinf = dom_elements[2]
505 dom.attr.pid = dom_elements[3]
506 dom.attr.exec_name = dom_elements[4]
507 dom.attr.padding = dom_elements[5]
514 def list_channels(handle):
516 list_channels(Handle handle) -> dict
518 Ask the session daemon for all available channels of a session.
519 Returns a dict of Channel instances, the key is the name;
520 on error, returns a negative value.
524 chan_list = _lttng_list_channels(handle._h)
525 except AttributeError:
526 raise TypeError("in method 'list_channels', argument 1 must be a Handle instance")
528 if type(chan_list) is int:
533 for channel_elements in chan_list:
535 chan.name = channel_elements[0]
536 chan.enabled = channel_elements[1]
537 chan.padding = channel_elements[2]
538 chan.attr.overwrite = channel_elements[3][0]
539 chan.attr.subbuf_size = channel_elements[3][1]
540 chan.attr.num_subbuf = channel_elements[3][2]
541 chan.attr.switch_timer_interval = channel_elements[3][3]
542 chan.attr.read_timer_interval = channel_elements[3][4]
543 chan.attr.output = channel_elements[3][5]
544 chan.attr.padding = channel_elements[3][6]
546 channels[chan.name] = chan
551 def list_events(handle, channel_name):
553 list_events(Handle handle, str channel_name) -> dict
555 Ask the session daemon for all available events of a session channel.
556 Returns a dict of Event instances, the key is the name;
557 on error, returns a negative value.
561 ev_list = _lttng_list_events(handle._h, channel_name)
562 except AttributeError:
563 raise TypeError("in method 'list_events', argument 1 must be a Handle instance")
565 if type(ev_list) is int:
570 for ev_elements in ev_list:
572 ev.name = ev_elements[0]
573 ev.type = ev_elements[1]
574 ev.loglevel_type = ev_elements[2]
575 ev.loglevel = ev_elements[3]
576 ev.enabled = ev_elements[4]
577 ev.pid = ev_elements[5]
578 ev.attr.padding = ev_elements[6]
579 ev.attr.probe.addr = ev_elements[7][0]
580 ev.attr.probe.offset = ev_elements[7][1]
581 ev.attr.probe.symbol_name = ev_elements[7][2]
582 ev.attr.probe.padding = ev_elements[7][3]
583 ev.attr.ftrace.symbol_name = ev_elements[8][0]
584 ev.attr.ftrace.padding = ev_elements[8][1]
585 ev.attr.padding = ev_elements[9]
592 def list_tracepoints(handle):
594 list_tracepoints(Handle handle) -> dict
596 Returns a dict of Event instances, the key is the name;
597 on error, returns a negative value.
601 ev_list = _lttng_list_tracepoints(handle._h)
602 except AttributeError:
603 raise TypeError("in method 'list_tracepoints', argument 1 must be a Handle instance")
605 if type(ev_list) is int:
610 for ev_elements in ev_list:
612 ev.name = ev_elements[0]
613 ev.type = ev_elements[1]
614 ev.loglevel_type = ev_elements[2]
615 ev.loglevel = ev_elements[3]
616 ev.enabled = ev_elements[4]
617 ev.pid = ev_elements[5]
618 ev.attr.padding = ev_elements[6]
619 ev.attr.probe.addr = ev_elements[7][0]
620 ev.attr.probe.offset = ev_elements[7][1]
621 ev.attr.probe.symbol_name = ev_elements[7][2]
622 ev.attr.probe.padding = ev_elements[7][3]
623 ev.attr.ftrace.symbol_name = ev_elements[8][0]
624 ev.attr.ftrace.padding = ev_elements[8][1]
625 ev.attr.padding = ev_elements[9]
632 def register_consumer(handle, socket_path):
634 register_consumer(Handle handle, str socket_path) -> int
636 Register an outside consumer.
637 Returns size of returned session payload data or a negative error code.
641 return _lttng_register_consumer(handle._h, socket_path)
642 except AttributeError:
643 raise TypeError("in method 'register_consumer', argument 1 must be a Handle instance")
646 def add_context(handle, event_context, event_name, channel_name):
648 add_context(Handle handle, EventContext ctx,
649 str event_name, str channel_name) -> int
651 Add context to event and/or channel.
652 If event_name is None, the context is applied to all events of the channel.
653 If channel_name is None, a lookup of the event's channel is done.
654 If both are None, the context is applied to all events of all channels.
655 Returns the size of the returned payload data or a negative error code.
659 return _lttng_add_context(handle._h, event_context, event_name, channel_name)
660 except AttributeError:
661 raise TypeError("in method 'add_context', argument 1 must be a Handle instance")
664 def enable_event(handle, event, channel_name):
666 enable_event(Handle handle, Event event,
667 str channel_name) -> int
669 Enable event(s) for a channel.
670 If no event name is specified, all events are enabled.
671 If no channel name is specified, the default 'channel0' is used.
672 Returns size of returned session payload data or a negative error code.
676 return _lttng_enable_event(handle._h, event, channel_name)
677 except AttributeError:
678 raise TypeError("in method 'enable_event', argument 1 must be a Handle instance")
681 def enable_channel(handle, channel):
683 enable_channel(Handle handle, Channel channel -> int
685 Enable channel per domain
686 Returns size of returned session payload data or a negative error code.
690 return _lttng_enable_channel(handle._h, channel)
691 except AttributeError:
692 raise TypeError("in method 'enable_channel', argument 1 must be a Handle instance")
695 def disable_event(handle, name, channel_name):
697 disable_event(Handle handle, str name, str channel_name) -> int
699 Disable event(s) of a channel and domain.
700 If no event name is specified, all events are disabled.
701 If no channel name is specified, the default 'channel0' is used.
702 Returns size of returned session payload data or a negative error code
706 return _lttng_disable_event(handle._h, name, channel_name)
707 except AttributeError:
708 raise TypeError("in method 'disable_event', argument 1 must be a Handle instance")
711 def disable_channel(handle, name):
713 disable_channel(Handle handle, str name) -> int
715 All tracing will be stopped for registered events of the channel.
716 Returns size of returned session payload data or a negative error code.
720 return _lttng_disable_channel(handle._h, name)
721 except AttributeError:
722 raise TypeError("in method 'disable_channel', argument 1 must be a Handle instance")
726 // =============================================
728 // Used to prevent freeing unallocated memory
729 // =============================================
731 %feature("docstring")""
732 %feature("autodoc", "1");
738 Takes two arguments: (str session_name, Domain domain)
743 def __init__(self, session_name, domain):
744 if type(session_name) is not str:
745 raise TypeError("in method '__init__', argument 2 of type 'str'")
746 if type(domain) is not Domain and domain is not None:
747 raise TypeError("in method '__init__', argument 3 of type 'lttng.Domain'")
749 self._sname = session_name
753 self._domtype = domain.type
754 self._h = _lttng_create_handle(session_name, domain)
758 _lttng_destroy_handle(self._h)
761 if self._domtype == 1:
762 domstr = "DOMAIN_KERNEL"
763 elif self._domtype == 2:
764 domstr = "DOMAIN_UST"
766 domstr = self._domtype
768 return "lttng.Handle; session('{}'), domain.type({})".format(
771 def __setattr__(self, attr, val):
773 raise NotImplementedError("cannot modify attributes")
775 self.__dict__[attr] = val
779 // =============================================
781 // These are directly taken from lttng.h.
782 // Any change to these structures must also be
784 // =============================================
786 %rename("Domain") lttng_domain;
787 %rename("EventContext") lttng_event_context;
788 %rename("Event") lttng_event;
789 %rename("ChannelAttr") lttng_channel_attr;
790 %rename("Channel") lttng_channel;
791 %rename("Session") lttng_session;
794 enum lttng_domain_type type;
795 enum lttng_buffer_type buf_type;
796 char padding[LTTNG_DOMAIN_PADDING1];
800 char exec_name[NAME_MAX];
801 char padding[LTTNG_DOMAIN_PADDING2];
806 static char temp[256];
807 static char domain_type[25];
808 static char buffer_type[25];
809 switch ( $self->type ) {
811 sprintf(domain_type, "type(DOMAIN_KERNEL)");
814 sprintf(domain_type, "type(DOMAIN_UST)");
817 sprintf(domain_type, "type(%i)", $self->type);
821 switch ( $self->buf_type ) {
822 case LTTNG_BUFFER_PER_UID:
823 sprintf(buffer_type, "buf_type(BUFFER_PER_UID)");
825 case LTTNG_BUFFER_PER_PID:
826 sprintf(buffer_type, "buf_type(BUFFER_PER_PID)");
828 case LTTNG_BUFFER_GLOBAL:
829 sprintf(buffer_type, "buf_type(BUFFER_GLOBAL)");
832 sprintf(buffer_type, "buf_type(%i)", $self->buf_type);
836 sprintf(temp, "lttng.Domain; %s, %s",
845 struct lttng_event_context {
846 enum lttng_event_context_type ctx;
847 char padding[LTTNG_EVENT_CONTEXT_PADDING1];
850 struct lttng_event_perf_counter_ctx perf_counter;
851 char padding[LTTNG_EVENT_CONTEXT_PADDING2];
856 static char temp[256];
857 switch ( $self->ctx ) {
859 sprintf(temp, "lttng.EventContext; ctx(EVENT_CONTEXT_PID)");
862 sprintf(temp, "lttng.EventContext; ctx(EVENT_CONTEXT_PERF_COUNTER)");
865 sprintf(temp, "lttng.EventContext; ctx(EVENT_CONTEXT_PROCNAME)");
868 sprintf(temp, "lttng.EventContext; ctx(EVENT_CONTEXT_PRIO)");
871 sprintf(temp, "lttng.EventContext; ctx(EVENT_CONTEXT_NICE)");
874 sprintf(temp, "lttng.EventContext; ctx(EVENT_CONTEXT_VPID)");
877 sprintf(temp, "lttng.EventContext; ctx(EVENT_CONTEXT_TID)");
880 sprintf(temp, "lttng.EventContext; ctx(EVENT_CONTEXT_VTID)");
883 sprintf(temp, "lttng.EventContext; ctx(EVENT_CONTEXT_PPID)");
886 sprintf(temp, "lttng.EventContext; ctx(EVENT_CONTEXT_VPPID)");
889 sprintf(temp, "lttng.EventContext; ctx(EVENT_CONTEXT_PTHREAD_ID)");
892 sprintf(temp, "lttng.EventContext; ctx(EVENT_CONTEXT_HOSTNAME)");
895 sprintf(temp, "lttng.EventContext; ctx(EVENT_CONTEXT_IP)");
898 sprintf(temp, "lttng.EventContext; ctx(EVENT_CONTEXT_PERF_CPU_COUNTER)");
901 sprintf(temp, "lttng.EventContext; ctx(EVENT_CONTEXT_PERF_THREAD_COUNTER)");
904 sprintf(temp, "lttng.EventContext; ctx(EVENT_CONTEXT_APP_CONTEXT)");
907 sprintf(temp, "lttng.EventContext; ctx(EVENT_CONTEXT_INTERRUPTIBLE)");
910 sprintf(temp, "lttng.EventContext; ctx(EVENT_CONTEXT_PREEMPTIBLE)");
913 sprintf(temp, "lttng.EventContext; ctx(EVENT_CONTEXT_NEED_RESCHEDULE)");
916 sprintf(temp, "lttng.EventContext; ctx(EVENT_CONTEXT_MIGRATABLE)");
919 sprintf(temp, "lttng.EventContext; type(%i)", $self->ctx);
927 struct lttng_event_probe_attr {
930 char symbol_name[LTTNG_SYMBOL_NAME_LEN];
931 char padding[LTTNG_EVENT_PROBE_PADDING1];
934 struct lttng_event_function_attr {
935 char symbol_name[LTTNG_SYMBOL_NAME_LEN];
936 char padding[LTTNG_EVENT_FUNCTION_PADDING1];
940 enum lttng_event_type type;
941 char name[LTTNG_SYMBOL_NAME_LEN];
943 enum lttng_loglevel_type loglevel_type;
949 char padding[LTTNG_EVENT_PADDING1];
952 struct lttng_event_probe_attr probe;
953 struct lttng_event_function_attr ftrace;
955 char padding[LTTNG_EVENT_PADDING2];
960 static char temp[512];
964 switch ( $self->type ) {
966 sprintf(evtype, "EVENT_ALL");
969 sprintf(evtype, "EVENT_TRACEPOINT");
972 sprintf(evtype, "EVENT_PROBE");
975 sprintf(evtype, "EVENT_FUNCTION");
978 sprintf(evtype, "EVENT_FUNCTION_ENTRY");
981 sprintf(evtype, "EVENT_NOOP");
984 sprintf(evtype, "EVENT_SYSCALL");
987 sprintf(evtype, "%i", $self->type);
991 switch ( $self->loglevel_type ) {
993 sprintf(logtype, "EVENT_LOGLEVEL_ALL");
996 sprintf(logtype, "EVENT_LOGLEVEL_RANGE");
999 sprintf(logtype, "EVENT_LOGLEVEL_SINGLE");
1002 sprintf(logtype, "%i", $self->loglevel_type);
1006 sprintf(temp, "lttng.Event; name('%s'), type(%s), "
1007 "loglevel_type(%s), loglevel(%i), "
1008 "enabled(%s), pid(%i)",
1009 $self->name, evtype, logtype, $self->loglevel,
1010 $self->enabled ? "True" : "False", $self->pid);
1016 struct lttng_channel_attr {
1018 uint64_t subbuf_size;
1019 uint64_t num_subbuf;
1020 unsigned int switch_timer_interval;
1021 unsigned int read_timer_interval;
1022 enum lttng_event_output output;
1024 char padding[LTTNG_CHANNEL_ATTR_PADDING1];
1028 static char temp[256];
1031 switch ( $self->output ) {
1033 sprintf(evout, "EVENT_SPLICE");
1036 sprintf(evout, "EVENT_MMAP");
1039 sprintf(evout, "%i", $self->output);
1042 sprintf(temp, "lttng.ChannelAttr; overwrite(%i), subbuf_size(%"PRIu64"), "
1043 "num_subbuf(%"PRIu64"), switch_timer_interval(%u), "
1044 "read_timer_interval(%u), output(%s)",
1045 $self->overwrite, $self->subbuf_size, $self->num_subbuf,
1046 $self->switch_timer_interval, $self->read_timer_interval,
1053 struct lttng_channel {
1054 char name[LTTNG_SYMBOL_NAME_LEN];
1056 struct lttng_channel_attr attr;
1057 char padding[LTTNG_CHANNEL_PADDING1];
1061 static char temp[512];
1062 snprintf(temp, sizeof(temp), "lttng.Channel; name('%s'), enabled(%s)",
1063 $self->name, $self->enabled ? "True" : "False");
1069 struct lttng_session {
1070 char name[NAME_MAX];
1071 char path[PATH_MAX];
1073 char padding[LTTNG_SESSION_PADDING1];
1077 static char temp[PATH_MAX + NAME_MAX + 512];
1078 snprintf(temp, sizeof(temp), "lttng.Session; name('%s'), path('%s'), enabled(%s)",
1079 $self->name, $self->path,
1080 $self->enabled ? "True" : "False");