diff options
| author | Paul Buetow <paul@buetow.org> | 2026-02-24 21:19:09 +0200 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2026-02-24 21:19:09 +0200 |
| commit | 6ea8920dac3b7e3868707a84e58a5d7e10ebbbf3 (patch) | |
| tree | 63138d32b6197522855a0b69e3c09068a0e1df41 /internal/flamegraph/tool.go | |
| parent | 93d587a6f5ae453907de3d5556866b60bac405cb (diff) | |
flamegraph: remove external tool path and document native generation
Diffstat (limited to 'internal/flamegraph/tool.go')
| -rw-r--r-- | internal/flamegraph/tool.go | 114 |
1 files changed, 0 insertions, 114 deletions
diff --git a/internal/flamegraph/tool.go b/internal/flamegraph/tool.go deleted file mode 100644 index a83c44f..0000000 --- a/internal/flamegraph/tool.go +++ /dev/null @@ -1,114 +0,0 @@ -package flamegraph - -import ( - "fmt" - "io" - "ior/internal/flags" - "os" - "os/exec" - "strings" - - "github.com/DataDog/zstd" -) - -// Tool represents a utility for generating flamegraphs. -// It contains the path to the flamegraph tool, the arguments to be passed to it, -// and the output file where the generated flamegraph will be stored. -type Tool struct { - flamegraphTool string // Path to the flamegraph tool executable. - args []string // Arguments to be passed to the flamegraph tool. - outFile string // Path to the output file where the flamegraph will be saved. -} - -func NewTool(collapsedFile string) (Tool, error) { - if strings.HasSuffix(collapsedFile, ".zst") { - var err error - collapsedFile, err = decompress(collapsedFile) - if err != nil { - return Tool{}, err - } - } - - t := Tool{ - flamegraphTool: flags.Get().FlamegraphTool, - args: []string{collapsedFile, "--hash"}, - outFile: strings.TrimSuffix(collapsedFile, ".collapsed") + ".svg", - } - - t.args = append(t.args, "--title") - t.args = append(t.args, fmt.Sprintf("I/O Traces (%s by %s)", - strings.Join(flags.Get().CollapsedFields, ","), flags.Get().CountField, - )) - - return t, nil -} - -func (t Tool) WriteSVG() error { - defer deleteFileIfEmpty(t.outFile) - - if _, err := os.Stat(t.outFile); err == nil { - fmt.Println(t.outFile, "already exists!") - return nil - } - cmd := exec.Command(t.flamegraphTool, t.args...) - fmt.Println("Running", cmd) - - outFd, err := os.Create(t.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 -} - -func (t Tool) OutFile() string { - return t.outFile -} - -func decompress(compressedFile string) (string, error) { - decompressedFile := strings.TrimSuffix(compressedFile, ".zst") - - file, err := os.Open(compressedFile) - if err != nil { - return decompressedFile, err - } - defer file.Close() - - decoder := zstd.NewReader(file) - defer decoder.Close() - - decompressedFd, err := os.Create(decompressedFile) - if err != nil { - return decompressedFile, err - } - defer decompressedFd.Close() - - _, err = io.Copy(decompressedFd, decoder) - if err != nil { - return decompressedFile, err - } - - return decompressedFile, nil -} - -func deleteFileIfEmpty(file string) error { - if _, err := os.Stat(file); err == nil { - fileInfo, err := os.Stat(file) - if err != nil { - return err - } - if fileInfo.Size() == 0 { - fmt.Println("Deleting", file, "as it is empty") - return os.Remove(file) - } - } - return nil -} |
