summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2025-04-10 22:30:16 +0300
committerPaul Buetow <paul@buetow.org>2025-04-10 22:30:16 +0300
commit1eeae89f5b1fcff41694b311fe699a65788cef6b (patch)
tree28ef5d6702a58edbba92a41b957df897866f0e27
parent4eca989fa649538e78038999f5e4cc21acca1db9 (diff)
can generate flamegraphs
-rw-r--r--internal/flags/flags.go6
-rw-r--r--internal/flamegraph/counter.go21
-rw-r--r--internal/flamegraph/iordata.go10
-rw-r--r--internal/ior.go3
4 files changed, 30 insertions, 10 deletions
diff --git a/internal/flags/flags.go b/internal/flags/flags.go
index ab9a342..120d8fe 100644
--- a/internal/flags/flags.go
+++ b/internal/flags/flags.go
@@ -21,6 +21,9 @@ var validCollapsedFields = []string{
"tracepoint",
"pid",
"tid",
+}
+
+var validCollapsedCounts = []string{
"count",
"duration",
"durationToPrev",
@@ -51,6 +54,7 @@ type Flags struct {
// To convert ior data into collapsed format
IorDataFile string
CollapsedFields []string
+ CountField string
}
func Parse() {
@@ -79,6 +83,8 @@ func parse() {
flag.StringVar(&singleton.IorDataFile, "ior", "", "IOR data file to convert into collapsed format")
fields := flag.String("fields", "",
fmt.Sprintf("Comma separated list of fields to collapse, valid are: %v", validCollapsedFields))
+ flag.StringVar(&singleton.CountField, "count", "count",
+ fmt.Sprintf("Count field to collaps, valid are: %v", validCollapsedCounts))
flag.Parse()
singleton.TracepointsToAttach = extractTracepointFlags(*tracepointsToAttach)
diff --git a/internal/flamegraph/counter.go b/internal/flamegraph/counter.go
index 96cfe06..6105136 100644
--- a/internal/flamegraph/counter.go
+++ b/internal/flamegraph/counter.go
@@ -1,5 +1,9 @@
package flamegraph
+import (
+ "fmt"
+)
+
type Counter struct {
Count uint64
Duration uint64
@@ -12,5 +16,22 @@ func (c Counter) add(other Counter) Counter {
c.Duration += other.Duration
c.DurationToPrev += other.DurationToPrev
c.Bytes += other.Bytes
+
return c
}
+
+func (c Counter) ValueByName(name string) uint64 {
+ // Convert the numbers to strings here
+ switch name {
+ case "count":
+ return c.Count
+ case "duration":
+ return c.Duration
+ case "durationToPrev":
+ return c.DurationToPrev
+ case "bytes":
+ return c.Bytes
+ default:
+ panic(fmt.Sprintln("No", name, "in count record"))
+ }
+}
diff --git a/internal/flamegraph/iordata.go b/internal/flamegraph/iordata.go
index 6974329..cef01ff 100644
--- a/internal/flamegraph/iordata.go
+++ b/internal/flamegraph/iordata.go
@@ -198,7 +198,7 @@ type iterRecord struct {
func (ir iterRecord) StringByName(name string) string {
switch name {
case "path":
- return ir.path
+ return strings.Join(strings.Split(ir.path, "/"), ";/")
case "comm":
return ir.comm
case "tracepoint":
@@ -209,14 +209,6 @@ func (ir iterRecord) StringByName(name string) string {
return fmt.Sprint(ir.tid)
case "flags":
return ir.flags.String()
- case "count":
- return fmt.Sprint(ir.cnt.Count)
- case "duration":
- return fmt.Sprint(ir.cnt.Duration)
- case "durationToPrev":
- return fmt.Sprint(ir.cnt.DurationToPrev)
- case "bytes":
- return fmt.Sprint(ir.cnt.Bytes)
default:
panic(fmt.Sprintln("No", name, "in record"))
}
diff --git a/internal/ior.go b/internal/ior.go
index 2aff207..0e158e2 100644
--- a/internal/ior.go
+++ b/internal/ior.go
@@ -48,7 +48,8 @@ func Run() error {
iorFile := flags.Get().IorDataFile
if iorFile != "" {
- return flamegraph.NewCollapsed(iorFile, flags.Get().CollapsedFields).Generate(iorFile)
+ collapsed := flamegraph.NewCollapsed(iorFile, flags.Get().CollapsedFields, flags.Get().CountField)
+ return collapsed.Generate(iorFile)
}
return runTrace()