diff mbox

[2/3] trace: add tracetool simpletrace_stap format

Message ID 1401194159-30985-3-git-send-email-stefanha@redhat.com
State New
Headers show

Commit Message

Stefan Hajnoczi May 27, 2014, 12:35 p.m. UTC
This new tracetool "format" generates a SystemTap .stp file that outputs
simpletrace binary trace data.

In contrast to simpletrace or ftrace, SystemTap does not define its own
trace format.  All output from SystemTap is generated by .stp files.
This patch lets us generate a .stp file that outputs in the simpletrace
binary format.

This makes it possible to reuse simpletrace.py to analyze traces
recorded using SystemTap.  The simpletrace binary format is especially
useful for long-running traces like flight-recorder mode where string
formatting can be expensive.

Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
---
 scripts/tracetool/format/simpletrace_stap.py | 73 ++++++++++++++++++++++++++++
 1 file changed, 73 insertions(+)
 create mode 100644 scripts/tracetool/format/simpletrace_stap.py

Comments

Lluís Vilanova May 27, 2014, 1:10 p.m. UTC | #1
Stefan Hajnoczi writes:

> This new tracetool "format" generates a SystemTap .stp file that outputs
> simpletrace binary trace data.

> In contrast to simpletrace or ftrace, SystemTap does not define its own
> trace format.  All output from SystemTap is generated by .stp files.
> This patch lets us generate a .stp file that outputs in the simpletrace
> binary format.

> This makes it possible to reuse simpletrace.py to analyze traces
> recorded using SystemTap.  The simpletrace binary format is especially
> useful for long-running traces like flight-recorder mode where string
> formatting can be expensive.

> Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
> ---
>  scripts/tracetool/format/simpletrace_stap.py | 73 ++++++++++++++++++++++++++++
>  1 file changed, 73 insertions(+)
>  create mode 100644 scripts/tracetool/format/simpletrace_stap.py

> diff --git a/scripts/tracetool/format/simpletrace_stap.py b/scripts/tracetool/format/simpletrace_stap.py
> new file mode 100644
> index 0000000..4e7f7e7
> --- /dev/null
> +++ b/scripts/tracetool/format/simpletrace_stap.py
[...]

Should the build automatically generate a file using this format? (just for
convenience)

Also, it might be worth mentioning this file in the "SystemTap" section of
"docs/tracing.txt".


Thanks,
  Lluis
Stefan Hajnoczi May 28, 2014, 12:38 p.m. UTC | #2
On Tue, May 27, 2014 at 03:10:30PM +0200, Lluís Vilanova wrote:
> Stefan Hajnoczi writes:
> 
> > This new tracetool "format" generates a SystemTap .stp file that outputs
> > simpletrace binary trace data.
> 
> > In contrast to simpletrace or ftrace, SystemTap does not define its own
> > trace format.  All output from SystemTap is generated by .stp files.
> > This patch lets us generate a .stp file that outputs in the simpletrace
> > binary format.
> 
> > This makes it possible to reuse simpletrace.py to analyze traces
> > recorded using SystemTap.  The simpletrace binary format is especially
> > useful for long-running traces like flight-recorder mode where string
> > formatting can be expensive.
> 
> > Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
> > ---
> >  scripts/tracetool/format/simpletrace_stap.py | 73 ++++++++++++++++++++++++++++
> >  1 file changed, 73 insertions(+)
> >  create mode 100644 scripts/tracetool/format/simpletrace_stap.py
> 
> > diff --git a/scripts/tracetool/format/simpletrace_stap.py b/scripts/tracetool/format/simpletrace_stap.py
> > new file mode 100644
> > index 0000000..4e7f7e7
> > --- /dev/null
> > +++ b/scripts/tracetool/format/simpletrace_stap.py
> [...]
> 
> Should the build automatically generate a file using this format? (just for
> convenience)
> 
> Also, it might be worth mentioning this file in the "SystemTap" section of
> "docs/tracing.txt".

I'm still trying to figure out how to best distribute and integrate into
make install.  Will send a follow-up patch series to hook into the
build.

I wasn't sure whether to generate the simpletrace-stap file during build
or ask the user to customer trace-events to just the events they want to
trace.

Frank Ch. Eigler of SystemTap fame explained yesterday how to build the
simpletrace-stap file once but let the user configure a subset of
probes.  I think this is the cleanest approach and I am experimenting
with that today.

Stefan
diff mbox

Patch

diff --git a/scripts/tracetool/format/simpletrace_stap.py b/scripts/tracetool/format/simpletrace_stap.py
new file mode 100644
index 0000000..4e7f7e7
--- /dev/null
+++ b/scripts/tracetool/format/simpletrace_stap.py
@@ -0,0 +1,73 @@ 
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+"""
+Generate .stp file that outputs simpletrace binary traces (DTrace with SystemTAP only).
+"""
+
+__author__     = "Stefan Hajnoczi <redhat.com>"
+__copyright__  = "Copyright (C) 2014, Red Hat, Inc."
+__license__    = "GPL version 2 or (at your option) any later version"
+
+__maintainer__ = "Stefan Hajnoczi"
+__email__      = "stefanha@redhat.com"
+
+
+from tracetool import out
+from tracetool.backend.dtrace import binary, probeprefix
+from tracetool.backend.simple import is_string
+from tracetool.format.stap import stap_escape
+
+
+def generate(events, backend):
+    out('/* This file is autogenerated by tracetool, do not edit. */',
+        '')
+
+    for event_id, e in enumerate(events):
+        if 'disable' in e.properties:
+            continue
+
+        out('probe %(probeprefix)s.%(name)s ?',
+            '{',
+            probeprefix=probeprefix(),
+            name=e.name)
+
+        # Calculate record size
+        sizes = ['24'] # sizeof(TraceRecord)
+        for type_, name in e.args:
+            name = stap_escape(name)
+            if is_string(type_):
+                out('    try {',
+                    '        arg%(name)s_str = %(name)s ? user_string_n(%(name)s, 512) : ""',
+                    '    } catch {',
+                    '        arg%(name)s_str = "<fault>"',
+                    '    }',
+                    '    arg%(name)s_len = strlen(arg%(name)s_str)',
+                    name=name)
+                sizes.append('4 + arg%s_len' % name)
+            else:
+                sizes.append('8')
+        sizestr = ' + '.join(sizes)
+
+        # Generate format string and value pairs for record header and arguments
+        fields = [('8b', str(event_id)),
+                  ('8b', 'gettimeofday_ns()'),
+                  ('4b', sizestr),
+                  ('4b', 'pid()')]
+        for type_, name in e.args:
+            name = stap_escape(name)
+            if is_string(type_):
+                fields.extend([('4b', 'arg%s_len' % name),
+                               ('.*s', 'arg%s_len, arg%s_str' % (name, name))])
+            else:
+                fields.append(('8b', name))
+
+        # Emit the entire record in a single SystemTap printf()
+        fmt_str = '%'.join(fmt for fmt, _ in fields)
+        arg_str = ', '.join(arg for _, arg in fields)
+        out('    printf("%%%(fmt_str)s", %(arg_str)s)',
+            fmt_str=fmt_str, arg_str=arg_str)
+
+        out('}')
+
+    out()