diff options
| author | Paul Buetow <paul@buetow.org> | 2025-03-11 22:42:57 +0200 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2025-03-11 22:42:57 +0200 |
| commit | 2cf6f74135b830885bad25e4f6aba3e0e31581b8 (patch) | |
| tree | 4bb0249a01cd78ca4385e865f0ecd0c2d1601156 /internal/tree/tree.go | |
| parent | 41e2d2661faa4d72ab6f03e7f1ba702593754d97 (diff) | |
more on tree
Diffstat (limited to 'internal/tree/tree.go')
| -rw-r--r-- | internal/tree/tree.go | 82 |
1 files changed, 79 insertions, 3 deletions
diff --git a/internal/tree/tree.go b/internal/tree/tree.go index 462ba19..a7c5c20 100644 --- a/internal/tree/tree.go +++ b/internal/tree/tree.go @@ -1,12 +1,88 @@ package tree +import ( + "fmt" + "ior/internal/event" + "ior/internal/generated/types" + "os" + "path" + "strings" +) + +type counter struct { + count uint64 + duration uint64 +} + +// It's a "flat tree" stored in a map, one key per directory type Tree struct { + // Collapsed flamegraph stats collector + collapsed map[string]map[types.TraceId]counter + inCh chan *event.Pair + Finished chan struct{} } func New() Tree { - return Tree{} + return Tree{ + collapsed: make(map[string]map[types.TraceId]counter), + inCh: make(chan *event.Pair, 4096), + Finished: make(chan struct{}), + } +} + +func (t Tree) Add(ev *event.Pair) { + t.inCh <- ev +} + +func (t Tree) Start() { + go func() { + for ev := range t.inCh { + pathname := path.Dir(ev.File.Name()) + pathMap, ok := t.collapsed[pathname] + if !ok { + pathMap = make(map[types.TraceId]counter) + } + + traceId := ev.EnterEv.GetTraceId() + cnt := pathMap[traceId] + cnt.count++ + cnt.duration += ev.Duration + pathMap[traceId] = cnt + + t.collapsed[pathname] = pathMap + ev.RecyclePrev() + } + fmt.Println("Tree processed last event") + t.mustDump("ior.collapsed") + close(t.Finished) + fmt.Println("DEBUG") + }() } -// func (t Tree) Add(ev *) { +// TODO: By count and by duration +// TODO: Reverse by syscall vs path +// TODO: Allow full path? +func (t Tree) mustDump(outfile string) { + fmt.Println("Writing", outfile) + file, err := os.Create(outfile) + if err != nil { + panic(err) + } + defer file.Close() -// } + for path, value := range t.collapsed { + var sb strings.Builder + + for _, part := range strings.Split(path, "/") { + sb.WriteString("/") + sb.WriteString(part) + } + + for traceId, cnt := range value { + _, err := fmt.Fprintf(file, "%s;%s %v\n", sb.String(), traceId, cnt.count) + if err != nil { + panic(err) + } + } + } +} |
