Skip to content

Commit dfccf08

Browse files
author
glightfoot
committed
add sleeps before getting metrics for e2e tests, move collector to package
Signed-off-by: glightfoot <[email protected]>
1 parent f6262ec commit dfccf08

File tree

6 files changed

+166
-124
lines changed

6 files changed

+166
-124
lines changed

e2e/e2e_test.go

+3-1
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ func TestIssue61(t *testing.T) {
4646
}
4747
defer exporter.Process.Kill()
4848

49-
for i := 0; i < 10; i++ {
49+
for i := 0; i < 20; i++ {
5050
if i > 0 {
5151
time.Sleep(1 * time.Second)
5252
}
@@ -93,6 +93,8 @@ rspamd.spam_count 3 NOW`
9393
t.Fatalf("write error: %v", err)
9494
}
9595

96+
time.Sleep(5 * time.Second)
97+
9698
resp, err := http.Get("http://" + path.Join(webAddr, "metrics"))
9799
if err != nil {
98100
t.Fatalf("get error: %v", err)

e2e/issue90_test.go

+2
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,8 @@ func TestIssue90(t *testing.T) {
8383
conn.Close()
8484
}
8585

86+
time.Sleep(5 * time.Second)
87+
8688
resp, err := http.Get("http://" + path.Join(webAddr, "metrics"))
8789
if err != nil {
8890
t.Fatalf("get error: %v", err)

main.go

+8-115
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,10 @@ import (
1717
"bufio"
1818
"bytes"
1919
"fmt"
20-
"io"
2120
"net"
2221
"net/http"
2322
_ "net/http/pprof"
2423
"os"
25-
"sync"
26-
"time"
2724

2825
"github.com/go-kit/kit/log"
2926
"github.com/go-kit/kit/log/level"
@@ -35,9 +32,7 @@ import (
3532
"github.com/prometheus/statsd_exporter/pkg/mapper"
3633
"gopkg.in/alecthomas/kingpin.v2"
3734

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"
4136
)
4237

4338
var (
@@ -77,108 +72,6 @@ var (
7772
)
7873
)
7974

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-
18275
func init() {
18376
prometheus.MustRegister(version.NewCollector("graphite_exporter"))
18477
}
@@ -223,24 +116,24 @@ func main() {
223116

224117
http.Handle(*metricsPath, promhttp.Handler())
225118

226-
c := newGraphiteCollector(logger)
119+
c := collector.NewGraphiteCollector(logger, *strictMatch, *sampleExpiry, tagErrors, lastProcessed, sampleExpiryMetric, invalidMetrics)
227120
prometheus.MustRegister(c)
228121

229-
c.mapper = &mapper.MetricMapper{}
122+
c.Mapper = &mapper.MetricMapper{}
230123
cacheOption := mapper.WithCacheType(*cacheType)
231124

232125
if *mappingConfig != "" {
233-
err := c.mapper.InitFromFile(*mappingConfig, *cacheSize, cacheOption)
126+
err := c.Mapper.InitFromFile(*mappingConfig, *cacheSize, cacheOption)
234127
if err != nil {
235128
level.Error(logger).Log("msg", "Error loading metric mapping config", "err", err)
236129
os.Exit(1)
237130
}
238131
} else {
239-
c.mapper.InitCache(*cacheSize, cacheOption)
132+
c.Mapper.InitCache(*cacheSize, cacheOption)
240133
}
241134

242135
if *dumpFSMPath != "" {
243-
err := dumpFSM(c.mapper.(*mapper.MetricMapper), *dumpFSMPath, logger)
136+
err := dumpFSM(c.Mapper.(*mapper.MetricMapper), *dumpFSMPath, logger)
244137
if err != nil {
245138
level.Error(logger).Log("msg", "Error dumping FSM", "err", err)
246139
os.Exit(1)
@@ -263,7 +156,7 @@ func main() {
263156

264157
go func() {
265158
defer conn.Close()
266-
c.processReader(conn)
159+
c.ProcessReader(conn)
267160
}()
268161
}
269162
}()
@@ -292,7 +185,7 @@ func main() {
292185
continue
293186
}
294187

295-
go c.processReader(bytes.NewReader(buf[0:chars]))
188+
go c.ProcessReader(bytes.NewReader(buf[0:chars]))
296189
}
297190
}()
298191

main_test.go

+10-7
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,14 @@ package main
1616
import (
1717
"strings"
1818
"testing"
19+
"time"
1920

2021
"github.com/go-kit/kit/log"
2122
"github.com/prometheus/client_golang/prometheus"
2223
"github.com/prometheus/statsd_exporter/pkg/mapper"
2324
"github.com/stretchr/testify/assert"
2425

26+
"github.com/prometheus/graphite_exporter/pkg/collector"
2527
"github.com/prometheus/graphite_exporter/pkg/line"
2628
)
2729

@@ -145,31 +147,32 @@ func TestProcessLine(t *testing.T) {
145147
},
146148
}
147149

148-
c := newGraphiteCollector(log.NewNopLogger())
150+
// func NewGraphiteCollector(logger log.Logger, strictMatch bool, sampleExpiry time.Duration, tagErrors prometheus.Counter, lastProcessed prometheus.Gauge, sampleExpiryMetric prometheus.Gauge, invalidMetrics prometheus.Counter) *graphiteCollector {
151+
c := collector.NewGraphiteCollector(log.NewNopLogger(), false, 5*time.Minute, tagErrors, lastProcessed, sampleExpiryMetric, invalidMetrics)
149152

150153
for _, testCase := range testCases {
151154
if testCase.mappingPresent {
152-
c.mapper = &mockMapper{
155+
c.Mapper = &mockMapper{
153156
name: testCase.name,
154157
labels: testCase.mappingLabels,
155158
action: testCase.action,
156159
present: testCase.mappingPresent,
157160
}
158161
} else {
159-
c.mapper = &mockMapper{
162+
c.Mapper = &mockMapper{
160163
present: testCase.mappingPresent,
161164
}
162165
}
163166

164-
c.strictMatch = testCase.strict
165-
line.ProcessLine(testCase.line, c.mapper, c.sampleCh, c.strictMatch, tagErrors, lastProcessed, invalidMetrics, c.logger)
167+
c.StrictMatch = testCase.strict
168+
line.ProcessLine(testCase.line, c.Mapper, c.SampleCh, c.StrictMatch, tagErrors, lastProcessed, invalidMetrics, c.Logger)
166169
}
167170

168-
c.sampleCh <- nil
171+
c.SampleCh <- nil
169172

170173
for _, k := range testCases {
171174
originalName := strings.Split(k.line, " ")[0]
172-
sample := c.samples[originalName]
175+
sample := c.Samples[originalName]
173176

174177
if k.willFail {
175178
assert.Nil(t, sample, "Found %s", k.name)

0 commit comments

Comments
 (0)