1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
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
}
|