@@ -6,36 +6,83 @@ import "sync"
6
6
// * hot containers active
7
7
// * memory used / available
8
8
9
+ // global statistics
9
10
type stats struct {
10
- mu sync.Mutex
11
+ mu sync.Mutex
12
+ // statistics for all functions combined
13
+ queue uint64
14
+ running uint64
15
+ complete uint64
16
+ // statistics for individual functions, keyed by function path
17
+ functionStatsMap map [string ]* functionStats
18
+ }
19
+
20
+ // statistics for an individual function
21
+ type functionStats struct {
11
22
queue uint64
12
23
running uint64
13
24
complete uint64
14
25
}
15
26
16
27
type Stats struct {
28
+ // statistics for all functions combined
29
+ Queue uint64
30
+ Running uint64
31
+ Complete uint64
32
+ // statistics for individual functions, keyed by function path
33
+ FunctionStatsMap map [string ]* FunctionStats
34
+ }
35
+
36
+ // statistics for an individual function
37
+ type FunctionStats struct {
17
38
Queue uint64
18
39
Running uint64
19
40
Complete uint64
20
41
}
21
42
22
- func (s * stats ) Enqueue () {
43
+ func (s * stats ) getStatsForFunction (path string ) * functionStats {
44
+ if s .functionStatsMap == nil {
45
+ s .functionStatsMap = make (map [string ]* functionStats )
46
+ }
47
+ thisFunctionStats , found := s .functionStatsMap [path ]
48
+ if ! found {
49
+ thisFunctionStats = & functionStats {}
50
+ s .functionStatsMap [path ] = thisFunctionStats
51
+ }
52
+
53
+ return thisFunctionStats
54
+ }
55
+
56
+ func (s * stats ) Enqueue (path string ) {
23
57
s .mu .Lock ()
24
58
s .queue ++
59
+ s .getStatsForFunction (path ).queue ++
60
+ s .mu .Unlock ()
61
+ }
62
+
63
+ // Call when a function has been queued but cannot be started because of an error
64
+ func (s * stats ) Dequeue (path string ) {
65
+ s .mu .Lock ()
66
+ s .queue --
67
+ s .getStatsForFunction (path ).queue --
25
68
s .mu .Unlock ()
26
69
}
27
70
28
- func (s * stats ) Start () {
71
+ func (s * stats ) Start (path string ) {
29
72
s .mu .Lock ()
30
73
s .queue --
74
+ s .getStatsForFunction (path ).queue --
31
75
s .running ++
76
+ s .getStatsForFunction (path ).running ++
32
77
s .mu .Unlock ()
33
78
}
34
79
35
- func (s * stats ) Complete () {
80
+ func (s * stats ) Complete (path string ) {
36
81
s .mu .Lock ()
37
82
s .running --
83
+ s .getStatsForFunction (path ).running --
38
84
s .complete ++
85
+ s .getStatsForFunction (path ).complete ++
39
86
s .mu .Unlock ()
40
87
}
41
88
@@ -45,6 +92,11 @@ func (s *stats) Stats() Stats {
45
92
stats .Running = s .running
46
93
stats .Complete = s .complete
47
94
stats .Queue = s .queue
95
+ stats .FunctionStatsMap = make (map [string ]* FunctionStats )
96
+ for key , value := range s .functionStatsMap {
97
+ thisFunctionStats := & FunctionStats {Queue : value .queue , Running : value .running , Complete : value .complete }
98
+ stats .FunctionStatsMap [key ] = thisFunctionStats
99
+ }
48
100
s .mu .Unlock ()
49
101
return stats
50
102
}
0 commit comments