@@ -17,13 +17,10 @@ import (
17
17
"bufio"
18
18
"bytes"
19
19
"fmt"
20
- "io"
21
20
"net"
22
21
"net/http"
23
22
_ "net/http/pprof"
24
23
"os"
25
- "sync"
26
- "time"
27
24
28
25
"github.com/go-kit/kit/log"
29
26
"github.com/go-kit/kit/log/level"
@@ -35,9 +32,7 @@ import (
35
32
"github.com/prometheus/statsd_exporter/pkg/mapper"
36
33
"gopkg.in/alecthomas/kingpin.v2"
37
34
38
- "github.com/prometheus/graphite_exporter/pkg/graphitesample"
39
- "github.com/prometheus/graphite_exporter/pkg/line"
40
- "github.com/prometheus/graphite_exporter/pkg/metricmapper"
35
+ "github.com/prometheus/graphite_exporter/pkg/collector"
41
36
)
42
37
43
38
var (
@@ -77,108 +72,6 @@ var (
77
72
)
78
73
)
79
74
80
- type graphiteCollector struct {
81
- samples map [string ]* graphitesample.GraphiteSample
82
- mu * sync.Mutex
83
- mapper metricmapper.MetricMapper
84
- sampleCh chan * graphitesample.GraphiteSample
85
- lineCh chan string
86
- strictMatch bool
87
- logger log.Logger
88
- }
89
-
90
- func newGraphiteCollector (logger log.Logger ) * graphiteCollector {
91
- c := & graphiteCollector {
92
- sampleCh : make (chan * graphitesample.GraphiteSample ),
93
- lineCh : make (chan string ),
94
- mu : & sync.Mutex {},
95
- samples : map [string ]* graphitesample.GraphiteSample {},
96
- strictMatch : * strictMatch ,
97
- logger : logger ,
98
- }
99
-
100
- go c .processSamples ()
101
- go c .processLines ()
102
-
103
- return c
104
- }
105
-
106
- func (c * graphiteCollector ) processReader (reader io.Reader ) {
107
- lineScanner := bufio .NewScanner (reader )
108
-
109
- for {
110
- if ok := lineScanner .Scan (); ! ok {
111
- break
112
- }
113
- c .lineCh <- lineScanner .Text ()
114
- }
115
- }
116
-
117
- func (c * graphiteCollector ) processLines () {
118
- for l := range c .lineCh {
119
- line .ProcessLine (l , c .mapper , c .sampleCh , c .strictMatch , tagErrors , lastProcessed , invalidMetrics , c .logger )
120
- }
121
- }
122
-
123
- func (c * graphiteCollector ) processSamples () {
124
- ticker := time .NewTicker (time .Minute ).C
125
-
126
- for {
127
- select {
128
- case sample , ok := <- c .sampleCh :
129
- if sample == nil || ! ok {
130
- return
131
- }
132
-
133
- c .mu .Lock ()
134
- c .samples [sample .OriginalName ] = sample
135
- c .mu .Unlock ()
136
- case <- ticker :
137
- // Garbage collect expired samples.
138
- ageLimit := time .Now ().Add (- * sampleExpiry )
139
-
140
- c .mu .Lock ()
141
- for k , sample := range c .samples {
142
- if ageLimit .After (sample .Timestamp ) {
143
- delete (c .samples , k )
144
- }
145
- }
146
- c .mu .Unlock ()
147
- }
148
- }
149
- }
150
-
151
- // Collect implements prometheus.Collector.
152
- func (c graphiteCollector ) Collect (ch chan <- prometheus.Metric ) {
153
- ch <- lastProcessed
154
-
155
- c .mu .Lock ()
156
- samples := make ([]* graphitesample.GraphiteSample , 0 , len (c .samples ))
157
-
158
- for _ , sample := range c .samples {
159
- samples = append (samples , sample )
160
- }
161
- c .mu .Unlock ()
162
-
163
- ageLimit := time .Now ().Add (- * sampleExpiry )
164
-
165
- for _ , sample := range samples {
166
- if ageLimit .After (sample .Timestamp ) {
167
- continue
168
- }
169
- ch <- prometheus .MustNewConstMetric (
170
- prometheus .NewDesc (sample .Name , sample .Help , []string {}, sample .Labels ),
171
- sample .Type ,
172
- sample .Value ,
173
- )
174
- }
175
- }
176
-
177
- // Describe implements prometheus.Collector.
178
- func (c graphiteCollector ) Describe (ch chan <- * prometheus.Desc ) {
179
- ch <- lastProcessed .Desc ()
180
- }
181
-
182
75
func init () {
183
76
prometheus .MustRegister (version .NewCollector ("graphite_exporter" ))
184
77
}
@@ -223,24 +116,24 @@ func main() {
223
116
224
117
http .Handle (* metricsPath , promhttp .Handler ())
225
118
226
- c := newGraphiteCollector (logger )
119
+ c := collector . NewGraphiteCollector (logger , * strictMatch , * sampleExpiry , tagErrors , lastProcessed , sampleExpiryMetric , invalidMetrics )
227
120
prometheus .MustRegister (c )
228
121
229
- c .mapper = & mapper.MetricMapper {}
122
+ c .Mapper = & mapper.MetricMapper {}
230
123
cacheOption := mapper .WithCacheType (* cacheType )
231
124
232
125
if * mappingConfig != "" {
233
- err := c .mapper .InitFromFile (* mappingConfig , * cacheSize , cacheOption )
126
+ err := c .Mapper .InitFromFile (* mappingConfig , * cacheSize , cacheOption )
234
127
if err != nil {
235
128
level .Error (logger ).Log ("msg" , "Error loading metric mapping config" , "err" , err )
236
129
os .Exit (1 )
237
130
}
238
131
} else {
239
- c .mapper .InitCache (* cacheSize , cacheOption )
132
+ c .Mapper .InitCache (* cacheSize , cacheOption )
240
133
}
241
134
242
135
if * dumpFSMPath != "" {
243
- err := dumpFSM (c .mapper .(* mapper.MetricMapper ), * dumpFSMPath , logger )
136
+ err := dumpFSM (c .Mapper .(* mapper.MetricMapper ), * dumpFSMPath , logger )
244
137
if err != nil {
245
138
level .Error (logger ).Log ("msg" , "Error dumping FSM" , "err" , err )
246
139
os .Exit (1 )
@@ -263,7 +156,7 @@ func main() {
263
156
264
157
go func () {
265
158
defer conn .Close ()
266
- c .processReader (conn )
159
+ c .ProcessReader (conn )
267
160
}()
268
161
}
269
162
}()
@@ -292,7 +185,7 @@ func main() {
292
185
continue
293
186
}
294
187
295
- go c .processReader (bytes .NewReader (buf [0 :chars ]))
188
+ go c .ProcessReader (bytes .NewReader (buf [0 :chars ]))
296
189
}
297
190
}()
298
191
0 commit comments