Skip to content

displaying blocking (causal) events (from Go traces) #37

@aktau

Description

@aktau

Go outputs a custom trace format. go tool trace transforms this into JSON understood by the (deprecated though I can't find an official reference) Catapult viewer.

The trace format is not hard to translate to Spall. But, doing so loses a couple of interesting features:

  • Blocking relationships: goroutines can unblock one another (channel sends, mutex unlock, time fire, ...). See the attached screenshot below. Generated using go run traceexample.go ; go tool pprof --http=0.0.0.0:1113 ./trace.out, see traceexample.go.
  • Extra metric displayed as graphs: live heap, allocated. See https://go.dev/blog/execution-traces-2024 for what this looks like.
  • Stacks (see e.g. https://lrita.github.io/images/posts/go/Rhys-Hiltner-go-tool-trace-GopherCon-2017.pdf page 33). I'm not sure how to translate this properly. A goroutine can run for 1s, but a stack isn't taken whenever a function call is made. Rather, it happens on certain important events. So while we could translate a stack to the entire range, it's not super accurate.

Image

Image

Side note, https://github.com/dominikh/gotraceui is another alternative trace frontend for Go traces, which is faster and more modern. But, it's not a web frontend, which is a big strength of spall-web.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions