Skip to content

Commit

Permalink
feat BackTraceTracer
Browse files Browse the repository at this point in the history
  • Loading branch information
Mengyang He committed Apr 25, 2024
1 parent e6af90e commit 20c32df
Show file tree
Hide file tree
Showing 4 changed files with 138 additions and 3 deletions.
7 changes: 4 additions & 3 deletions go.mod
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
module github.com/sarchlab/akita/v4

require (
github.com/go-sql-driver/mysql v1.7.1
github.com/go-sql-driver/mysql v1.8.1
github.com/golang/mock v1.6.0
github.com/google/pprof v0.0.0-20240207164012-fb44976bdcd5
github.com/google/pprof v0.0.0-20240409012703-83162a5b38cd
github.com/gorilla/mux v1.8.1
github.com/mattn/go-sqlite3 v1.14.22
github.com/onsi/ginkgo/v2 v2.15.0
Expand All @@ -15,6 +15,7 @@ require (
)

require (
filippo.io/edwards25519 v1.1.0 // indirect
github.com/go-logr/logr v1.4.1 // indirect
github.com/go-ole/go-ole v1.3.0 // indirect
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect
Expand All @@ -24,7 +25,7 @@ require (
github.com/tklauser/numcpus v0.7.0 // indirect
github.com/yusufpapurcu/wmi v1.2.4 // indirect
golang.org/x/net v0.21.0 // indirect
golang.org/x/sys v0.17.0 // indirect
golang.org/x/sys v0.19.0 // indirect
golang.org/x/text v0.14.0 // indirect
golang.org/x/tools v0.18.0 // indirect
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 // indirect
Expand Down
8 changes: 8 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=
filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
Expand All @@ -8,6 +10,8 @@ github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE=
github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78=
github.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI=
github.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=
github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y=
github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg=
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI=
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls=
github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=
Expand All @@ -17,6 +21,8 @@ github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/pprof v0.0.0-20240207164012-fb44976bdcd5 h1:E/LAvt58di64hlYjx7AsNS6C/ysHWYo+2qPCZKTQhRo=
github.com/google/pprof v0.0.0-20240207164012-fb44976bdcd5/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik=
github.com/google/pprof v0.0.0-20240409012703-83162a5b38cd h1:gbpYu9NMq8jhDVbvlGkMFWCjLFlqqEZjEmObmhUy6Vo=
github.com/google/pprof v0.0.0-20240409012703-83162a5b38cd/go.mod h1:kf6iHlnVGwgKolg33glAes7Yg/8iWP8ukqeldJSO7jw=
github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY=
github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ=
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
Expand Down Expand Up @@ -70,6 +76,8 @@ golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBc
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y=
golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o=
golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
Expand Down
49 changes: 49 additions & 0 deletions tracing/backtracetracer.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package tracing

import (
"log"
"sync"
)

// BackTraceTracer can record tasks incomplete tasks
type BackTraceTracer struct {
tracingTasks map[string]Task
lock sync.Mutex
}

// NewBackTraceTracer creates a new BackTraceTracer
func NewBackTraceTracer() *BackTraceTracer {
t := &BackTraceTracer{
tracingTasks: make(map[string]Task),
}

return t
}

func (t *BackTraceTracer) StartTask(task Task) {
t.lock.Lock()
defer t.lock.Unlock()

t.tracingTasks[task.ID] = task
}

func (t *BackTraceTracer) StepTask(task Task) {
// Do Nothing
}

func (t *BackTraceTracer) EndTask(task Task) {
t.lock.Lock()
defer t.lock.Unlock()

delete(t.tracingTasks, task.ID)
}

func (t *BackTraceTracer) DumpBackTrace(task Task) {
log.Printf("Task %s", task.ID)

if task.ParentID == "" {
return
}

t.DumpBackTrace(t.tracingTasks[task.ParentID])
}
77 changes: 77 additions & 0 deletions tracing/backtracetracer_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
package tracing

import (
. "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega"
)

var _ = Describe("BackTraceTracer", func() {
var (
t *BackTraceTracer
)

BeforeEach(func() {
t = NewBackTraceTracer()
})

It("should trace a single task", func() {
t.StartTask(Task{ID: "1"})

Expect(len(t.tracingTasks)).To(Equal(1))
Expect(t.tracingTasks["1"].ParentID).To(Equal(""))
})

It("should trace two tasks", func() {
t.StartTask(Task{ID: "1"})
t.StartTask(Task{ID: "2", ParentID: "1"})

Expect(len(t.tracingTasks)).To(Equal(2))
Expect(t.tracingTasks["1"].ParentID).To(Equal(""))
Expect(t.tracingTasks["2"].ParentID).To(Equal("1"))
})

It("should trace three tasks", func() {
t.StartTask(Task{ID: "1"})
t.StartTask(Task{ID: "2", ParentID: "1"})
t.StartTask(Task{ID: "3", ParentID: "2"})

Expect(len(t.tracingTasks)).To(Equal(3))
Expect(t.tracingTasks["1"].ParentID).To(Equal(""))
Expect(t.tracingTasks["2"].ParentID).To(Equal("1"))
Expect(t.tracingTasks["3"].ParentID).To(Equal("2"))
})

It("should end a single task", func() {
t.StartTask(Task{ID: "1"})

t.EndTask(Task{ID: "1"})

Expect(len(t.tracingTasks)).To(Equal(0))
})

It("should end two tasks", func() {
t.StartTask(Task{ID: "1"})
t.StartTask(Task{ID: "2", ParentID: "1"})
t.StartTask(Task{ID: "3", ParentID: "2"})

t.EndTask(Task{ID: "3", ParentID: "2"})
t.EndTask(Task{ID: "2", ParentID: "1"})

Expect(len(t.tracingTasks)).To(Equal(1))
Expect(t.tracingTasks["1"].ParentID).To(Equal(""))
})

It("should print single tasks", func() {
t.StartTask(Task{ID: "1"})

t.DumpBackTrace(Task{ID: "1"})
})

It("should print three tasks", func() {
t.StartTask(Task{ID: "1"})
t.StartTask(Task{ID: "2", ParentID: "1"})
t.StartTask(Task{ID: "3", ParentID: "2"})

t.DumpBackTrace(Task{ID: "3", ParentID: "2"})
})
})

0 comments on commit 20c32df

Please sign in to comment.