2121package debug
2222
2323import (
24+ "encoding/json"
2425 "fmt"
26+ "sync"
2527
2628 "go.uber.org/atomic"
2729)
@@ -36,8 +38,57 @@ type (
3638 stopperImpl struct {
3739 pollerTracker * pollerTrackerImpl
3840 }
41+
42+ // activityTrackerImpl implements the ActivityTracker interface
43+ activityTrackerImpl struct {
44+ sync.RWMutex
45+ activityCount map [ActivityInfo ]int64
46+ }
47+
48+ // activityStopperImpl implements the Stopper interface
49+ activityStopperImpl struct {
50+ sync.Once
51+ info ActivityInfo
52+ tracker * activityTrackerImpl
53+ }
3954)
4055
56+ var _ ActivityTracker = & activityTrackerImpl {}
57+ var _ Stopper = & activityStopperImpl {}
58+
59+ func (ati * activityTrackerImpl ) Start (info ActivityInfo ) Stopper {
60+ ati .Lock ()
61+ defer ati .Unlock ()
62+ ati .activityCount [info ]++
63+ return & activityStopperImpl {info : info , tracker : ati }
64+ }
65+
66+ func (ati * activityTrackerImpl ) Stats () Activities {
67+ var activities Activities
68+ ati .RLock ()
69+ defer ati .RUnlock ()
70+ for a , count := range ati .activityCount {
71+ if count > 0 {
72+ activities = append (activities , struct {
73+ Info ActivityInfo
74+ Count int64
75+ }{Info : a , Count : count })
76+ }
77+ }
78+ return activities
79+ }
80+
81+ func (asi * activityStopperImpl ) Stop () {
82+ asi .Do (func () {
83+ asi .tracker .Lock ()
84+ defer asi .tracker .Unlock ()
85+ asi .tracker .activityCount [asi .info ]--
86+ if asi .tracker .activityCount [asi .info ] == 0 {
87+ delete (asi .tracker .activityCount , asi .info )
88+ }
89+ })
90+ }
91+
4192func (p * pollerTrackerImpl ) Start () Stopper {
4293 p .pollerCount .Inc ()
4394 return & stopperImpl {
@@ -58,24 +109,78 @@ func Example() {
58109 pollerTracker = & pollerTrackerImpl {}
59110
60111 // Initially, poller count should be 0
61- fmt .Println (fmt .Sprintf ("stats: %d" , pollerTracker .Stats ()))
112+ fmt .Println (fmt .Sprintf ("poller stats: %d" , pollerTracker .Stats ()))
62113
63114 // Start a poller and verify that the count increments
64115 stopper1 := pollerTracker .Start ()
65- fmt .Println (fmt .Sprintf ("stats: %d" , pollerTracker .Stats ()))
116+ fmt .Println (fmt .Sprintf ("poller stats: %d" , pollerTracker .Stats ()))
66117
67118 // Start another poller and verify that the count increments again
68119 stopper2 := pollerTracker .Start ()
69- fmt .Println (fmt .Sprintf ("stats: %d" , pollerTracker .Stats ()))
120+ fmt .Println (fmt .Sprintf ("poller stats: %d" , pollerTracker .Stats ()))
70121
71122 // Stop the pollers and verify the counter
72123 stopper1 .Stop ()
73124 stopper2 .Stop ()
74- fmt .Println (fmt .Sprintf ("stats: %d" , pollerTracker .Stats ()))
125+ fmt .Println (fmt .Sprintf ("poller stats: %d" , pollerTracker .Stats ()))
126+
127+ var activityTracker ActivityTracker
128+ activityTracker = & activityTrackerImpl {activityCount : make (map [ActivityInfo ]int64 )}
129+
130+ info1 := ActivityInfo {
131+ TaskList : "task-list" ,
132+ ActivityType : "activity1" ,
133+ }
134+
135+ info2 := ActivityInfo {
136+ TaskList : "task-list" ,
137+ ActivityType : "activity2" ,
138+ }
139+
140+ stopper1 = activityTracker .Start (info1 )
141+ stopper2 = activityTracker .Start (info2 )
142+ jsonActivities , _ := json .MarshalIndent (activityTracker .Stats (), "" , " " )
143+ fmt .Println (string (jsonActivities ))
144+
145+ stopper1 .Stop ()
146+ stopper1 .Stop ()
147+ jsonActivities , _ = json .MarshalIndent (activityTracker .Stats (), "" , " " )
148+
149+ fmt .Println (string (jsonActivities ))
150+ stopper2 .Stop ()
151+
152+ jsonActivities , _ = json .MarshalIndent (activityTracker .Stats (), "" , " " )
153+ fmt .Println (string (jsonActivities ))
75154
76155 // Output:
77- // stats: 0
78- // stats: 1
79- // stats: 2
80- // stats: 0
156+ // poller stats: 0
157+ // poller stats: 1
158+ // poller stats: 2
159+ // poller stats: 0
160+ // [
161+ // {
162+ // "Info": {
163+ // "TaskList": "task-list",
164+ // "ActivityType": "activity1"
165+ // },
166+ // "Count": 1
167+ // },
168+ // {
169+ // "Info": {
170+ // "TaskList": "task-list",
171+ // "ActivityType": "activity2"
172+ // },
173+ // "Count": 1
174+ // }
175+ // ]
176+ // [
177+ // {
178+ // "Info": {
179+ // "TaskList": "task-list",
180+ // "ActivityType": "activity2"
181+ // },
182+ // "Count": 1
183+ // }
184+ // ]
185+ // null
81186}
0 commit comments