diff options
| -rw-r--r-- | internal/flamegraph/tool.go | 53 | ||||
| -rw-r--r-- | internal/ior.go | 12 |
2 files changed, 64 insertions, 1 deletions
diff --git a/internal/flamegraph/tool.go b/internal/flamegraph/tool.go new file mode 100644 index 0000000..8d95cde --- /dev/null +++ b/internal/flamegraph/tool.go @@ -0,0 +1,53 @@ +package flamegraph + +import ( + "fmt" + "ior/internal/flags" + "os" + "os/exec" + "strings" +) + +type Tool struct { + collapsedFile string + inverted bool +} + +func NewTool(collapsedFile string) Tool { + return Tool{ + collapsedFile: collapsedFile, + } +} + +func (t Tool) WriteSVG() error { + // TODO: Dynamically fill + // args := []string{t.collapsedFile, "--nametype", "Path", "--hash"} + args := []string{t.collapsedFile, "--hash"} + + if t.inverted { + args = append(args, "--inverted") + } + + args = append(args, "--title") + args = append(args, fmt.Sprintf("I/O Traces (%s by %s)", + strings.Join(flags.Get().CollapsedFields, ","), flags.Get().CountField, + )) + + cmd := exec.Command(flags.Get().FlamegraphTool, args...) + + outFile := strings.TrimSuffix(t.collapsedFile, ".collapsed") + ".svg" + outFd, err := os.Create(outFile) + if err != nil { + return err + } + defer outFd.Close() + + cmd.Stdout = outFd + cmd.Stderr = os.Stderr + + if err := cmd.Run(); err != nil { + return err + } + + return nil +} diff --git a/internal/ior.go b/internal/ior.go index 4f2bf89..4c485ea 100644 --- a/internal/ior.go +++ b/internal/ior.go @@ -46,12 +46,22 @@ func attachTracepoints(bpfModule *bpf.Module) error { func Run() error { iorFile := flags.Get().IorDataFile + var noTraceRun bool if iorFile != "" { + noTraceRun = true collapsed := flamegraph.NewCollapsed(iorFile, flags.Get().CollapsedFields, flags.Get().CountField) - return collapsed.Write(iorFile) + collapsedFile, err := collapsed.Write(iorFile) + if err != nil { + return err + } + + flamegraph.NewTool(collapsedFile) } + if noTraceRun { + return nil + } return runTrace() } |
