@@ -16,16 +16,19 @@ type Daemon struct {
16
16
wg * sync.WaitGroup
17
17
quit chan bool
18
18
indexers []indexers.Indexer
19
+
20
+ prevStats map [indexers.Indexer ]indexers.Stats
19
21
}
20
22
21
23
// NewDaemon creates a new daemon to run the given indexers
22
24
func NewDaemon (cfg * Config , db * sql.DB , ixs []indexers.Indexer ) * Daemon {
23
25
return & Daemon {
24
- cfg : cfg ,
25
- db : db ,
26
- wg : & sync.WaitGroup {},
27
- quit : make (chan bool ),
28
- indexers : ixs ,
26
+ cfg : cfg ,
27
+ db : db ,
28
+ wg : & sync.WaitGroup {},
29
+ quit : make (chan bool ),
30
+ indexers : ixs ,
31
+ prevStats : make (map [indexers.Indexer ]indexers.Stats , len (ixs )),
29
32
}
30
33
}
31
34
@@ -40,14 +43,18 @@ func (d *Daemon) Start() {
40
43
for _ , i := range d .indexers {
41
44
d .startIndexer (i , time .Second * 5 )
42
45
}
46
+
47
+ d .startStatsReporter (time .Minute )
43
48
}
44
49
45
50
func (d * Daemon ) startIndexer (indexer indexers.Indexer , interval time.Duration ) {
46
51
d .wg .Add (1 ) // add ourselves to the wait group
47
52
53
+ log := logrus .WithField ("indexer" , indexer .Name ())
54
+
48
55
go func () {
49
56
defer func () {
50
- logrus . WithField ( "indexer" , indexer . Name ()) .Info ("indexer exiting" )
57
+ log .Info ("indexer exiting" )
51
58
d .wg .Done ()
52
59
}()
53
60
@@ -58,13 +65,56 @@ func (d *Daemon) startIndexer(indexer indexers.Indexer, interval time.Duration)
58
65
case <- time .After (interval ):
59
66
_ , err := indexer .Index (d .db , d .cfg .Rebuild , d .cfg .Cleanup )
60
67
if err != nil {
61
- logrus . WithField ( "index" , d . cfg . Index ) .WithError (err ).Error ("error during indexing" )
68
+ log .WithError (err ).Error ("error during indexing" )
62
69
}
63
70
}
64
71
}
65
72
}()
66
73
}
67
74
75
+ func (d * Daemon ) startStatsReporter (interval time.Duration ) {
76
+ d .wg .Add (1 ) // add ourselves to the wait group
77
+
78
+ go func () {
79
+ defer func () {
80
+ logrus .Info ("analytics exiting" )
81
+ d .wg .Done ()
82
+ }()
83
+
84
+ for {
85
+ select {
86
+ case <- d .quit :
87
+ return
88
+ case <- time .After (interval ):
89
+ d .reportStats ()
90
+ }
91
+ }
92
+ }()
93
+ }
94
+
95
+ func (d * Daemon ) reportStats () {
96
+ metrics := make (map [string ]float64 , len (d .indexers )* 2 )
97
+
98
+ for _ , ix := range d .indexers {
99
+ stats := ix .Stats ()
100
+ prev := d .prevStats [ix ]
101
+
102
+ metrics [ix .Name ()+ "_indexed" ] = float64 (stats .Indexed - prev .Indexed )
103
+ metrics [ix .Name ()+ "_deleted" ] = float64 (stats .Deleted - prev .Deleted )
104
+
105
+ d .prevStats [ix ] = stats
106
+ }
107
+
108
+ log := logrus .NewEntry (logrus .StandardLogger ())
109
+
110
+ for k , v := range metrics {
111
+ librato .Gauge ("indexer." + k , v )
112
+ log = log .WithField (k , v )
113
+ }
114
+
115
+ log .Info ("stats reported" )
116
+ }
117
+
68
118
// Stop stops this daemon
69
119
func (d * Daemon ) Stop () {
70
120
logrus .Info ("daemon stopping" )
0 commit comments