[lttng-dev] porting LTTng to Go(lang)?

Mathieu Desnoyers mathieu.desnoyers at efficios.com
Sun Jun 4 16:05:19 UTC 2017


----- On Jun 3, 2017, at 3:45 PM, Philippe Proulx <eeppeliteloop at gmail.com> wrote: 

> On Fri, Jun 2, 2017 at 10:24 PM, craig harmer < [ mailto:charmster at gmail.com |
> charmster at gmail.com ] > wrote:

>> hi all,

>> the suggestion to write a pre-processor for LTTng tracepoints is interesting and
>> may be a good idea. however, i'm not sure that it will provide a general
>> purpose solution.

>> the problem i for see is that tracepoint invocations, at least, should be
>> written in the syntax of the language they're being used in (a programmer would
>> would expect the tracepoint() function call to look like any other function
>> call in the language).

>> so the tracepoint parser needs to understand the function invocation syntax of
>> each language. it also needs to understand at least some of the rest of the
>> syntax of the language -- in the case of Go it at least needs to be able
>> recognize "import" statements and import those files and it needs to understand
>> when something that looks like a tracepoint() is actually embedded in a comment
>> or string. it also needs to emit code that matches the syntax of the language.

>> so a general purpose lttng tracepoint parsing tool would need at least a limited
>> understanding of the syntax and grammar of each language for reading the source
>> file in and then writing the source file out. there could be code in the middle
>> that's common across languages, but probably not a lot. perhaps an lttng
>> tracepoint parsing tool could be better structured as a common framework for
>> language specific tracepoint parsers to be plugged in to.

>> but writing a parser that actually understands the grammar of a language is not
>> easy. if i was really going to do this, i'd be tempted to see if i could just
>> take this from gcc (which has front-ends that supports C, C++, Go, and other
>> languages (i think)).

>> and then there's the tracepoint definitions. they could be written using the
>> barectf() tool that Philippe mentions, but i'm not sure if that would be
>> satisfactory for most programmers, who would prefer to write tracepoint
>> definitions in the same language that they are programming in. they would also
>> need to support the data types of the language (i'm thinking Python here as an
>> example, where tracepoints would be expected to support most of the Python
>> basic data types).

> There's a little misunderstanding here.

> The idea is to have a universal tracepoint definition language (and what I
> suggested is that a subset of CTF 2, of which the syntax is JSON (or YAML which
> translates to JSON directly), could be used for this) which translates to
> functions, classes, macros, etc. in selected programming languages. Depending
> on the destination language, we can generate serialization functions directly
> or wrappers which use LTTng-UST behind the scenes. So in your case, this tool
> would generate Go source files which would contain public functions which
> correspond to tracepoints. We never considered parsing an existing programming
> language to infer tracepoints.

> Of course this requires the developer to define tracepoints in this universal
> language. That's an additional developing step needed to allow the developer to
> use tracepoints in his/her favorite language. But there are other advantages,
> like generating tracepoints in two different languages from the same tracepoint
> definitions. Like Mathieu wrote, it's the same spirit as Flex and Bison. With
> Bison, you don't use the C preprocessor to write your grammar rules: the tool
> reads a Bison input file and generates a parser source file. Just like barectf
> reads a YAML configuration file which defines stream and event classes and
> generates tracer source files.

The problem is that this is often not enough, and we sometimes need to have 
pre/post code run before/after the serialization to prepare the arguments. 
This happens for instance in lttng-modules with the LTTNG_TRACEPOINT_EVENT_CODE() 
macro. 

Ideally we should find a way to glue together this high-level description 
and language-native helper code. 

Thoughts ? 

Thanks, 

Mathieu 

> Phil

>> because Go seems to be similar to C i'm strongly tempted to just co-opt the C
>> pre-processor and existing LTTng tracepoint machinery and modify the LTTng
>> header files to generate valid Go code for a tracepoint definition. this does
>> add a LTTng tracepoint tool to the steps required to compile Go, except that
>> the tracepoint tool is called "cpp" (plus header files).

>> i don't really know Go yet and i hae not been assigned to get LTTng to work in
>> Go, so this is all quite preliminary. but i think the project i'm about to
>> start on really needs LTTng or LTTng-like tracepoint functionality so i'm
>> motivated to see if this can work.

>> i'm going to investigate some more.

>> --craig

>> On Fri, Jun 2, 2017 at 10:05 AM, Philippe Proulx < [
>> mailto:eeppeliteloop at gmail.com | eeppeliteloop at gmail.com ] > wrote:

>>> On Fri, Jun 2, 2017 at 11:58 AM, Mathieu Desnoyers < [
>>> mailto:mathieu.desnoyers at efficios.com | mathieu.desnoyers at efficios.com ] >
>>> wrote:

>>>> ----- On Jun 2, 2017, at 2:27 AM, craig harmer < [ mailto:charmster at gmail.com |
>>>> charmster at gmail.com ] > wrote:

>>>>> hi all,

>>>>> has anyone looked at porting LTTng to [
>>>>> https://en.wikipedia.org/wiki/Go_%28programming_language%29 | Go ] (AKA [
>>>>> https://golang.org/ | Golang ] )?

>>>> Not yet ! I'm glad someone is looking into it. :)

>>>>> Go is a language very similar to C, but it has intrinsic support for concurrency
>>>>> and better memory protection (at the expense of including garbage collection).
>>>>> its from Google and is pretty hot these days for big data and "web scale"
>>>>> distributed systems. the similarity to C is not surprising since two of the
>>>>> three authors were also involved in the development of UNIX in at AT&T in the
>>>>> 1970's: Rob Pike and Ken Thompson (Robert Griesemer is the third author).

>>>>> Go is able to link with C object files, so implementing support for tracef(3)
>>>>> should not be very difficult.

>>>>> but i want to have full support for user-defined tracepoint() events. that looks
>>>>> to be much trickier since the LTTng tracepoint() functionality relies heavily
>>>>> on (some might say abuses

>>> "abuses" is appropriate ;-)

>>>>> ) the C pre-processor, and Go does not have an equivalent of the C
>>>>> pre-processor. however, i don't see an obvious reason why Go source files that
>>>>> contain tracepoints couldn't be run through the C pre-processor -- except that
>>>>> Go specific LTTng header files would be required.

>>>>> [ https://tour.golang.org/welcome/1 | here is an example of "hello, world" in Go
>>>>> ] . (note the use of "import" rather then "#include").

>>>>> i've spent more than a few hours looking at the C code generated by the C
>>>>> pre-processor trying to track down exactly why a tracepoint() definition is
>>>>> causing a compiler error, so i think i have an idea of just how hard it would
>>>>> be to development equivalent header files for Go + C pre-processor. it may be
>>>>> the case that the Go "header files", once developed, would be compiler
>>>>> specific, i.e only work with [ https://golang.org/doc/install/gccgo | gccgo ]
>>>>> (the gcc front-end for Go).

>>>>> anyway, i'm wondering if anybody has attempted this and/or what your thoughts
>>>>> would be.

>>>> In the case of C/C++ code, using the C preprocessor got the job done without
>>>> requiring any additional
>>>> dependency. Given the context you describe, perhaps it would be wise to consider
>>>> introducing a dedicated
>>>> "lttng probe description" parser. The idea here would be to parse the tracepoint
>>>> probe definitions and
>>>> translate those into native code for various languages (e.g. Golang).

>>>> This would create a new lttng utility that would be required to to produce the
>>>> language-specific files from
>>>> those descriptions. I would allow us to port the "tracepoint" concept to many
>>>> more languages easily, and
>>>> not be so much tied to the C preprocessor anymore.

>>>> So perhaps adding this new tool as a dependency that needs to be invoked prior
>>>> to compilation might
>>>> not be too much of an issue ? I see it as being slightly similar to the role
>>>> accomplished by Flex and
>>>> Bison: they are required to translate from source files to an intermediary
>>>> language, and then the
>>>> resulting files can be included into the distribution source packages, so only
>>>> those who aim at
>>>> changing the source descriptions need to have the translation tool installed.

>>>> Thoughts ?

>>> Good point and we thought about this before. In fact this is just what barectf <
>>> [ http://barectf.org/ | http://barectf.org/ ] > does, for example. What I see
>>> in the future is that a subset of (eventual) CTF 2's metadata language (JSON)
>>> could be used here (or an equivalent, human-friendly YAML, like barectf) to
>>> describe LTTng event and stream classes and translate them to what's needed to
>>> record such events for a given programming language. CTF 2's user attributes
>>> can be used to insert additional, language-specific properties, like parameter
>>> types and names, and other options.

>>> Phil

>>>> Thanks,

>>>> Mathieu

>>>>> --craig

>>>>> _______________________________________________
>>>>> lttng-dev mailing list
>>>>> [ mailto:lttng-dev at lists.lttng.org | lttng-dev at lists.lttng.org ]
>>>>> [ https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev |
>>>>> https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev ]

>>>> --
>>>> Mathieu Desnoyers
>>>> EfficiOS Inc.
>>>> [ http://www.efficios.com/ | http://www.efficios.com ]

>>>> _______________________________________________
>>>> lttng-dev mailing list
>>>> [ mailto:lttng-dev at lists.lttng.org | lttng-dev at lists.lttng.org ]
>>>> [ https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev |
>>>> https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev ]

-- 
Mathieu Desnoyers 
EfficiOS Inc. 
http://www.efficios.com 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.lttng.org/pipermail/lttng-dev/attachments/20170604/b84c3045/attachment-0001.html>


More information about the lttng-dev mailing list