99 lines
2.3 KiB
Go
99 lines
2.3 KiB
Go
package gather
|
|
|
|
import (
|
|
"context"
|
|
"net/http/httptest"
|
|
"os"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/google/go-cmp/cmp"
|
|
"github.com/influxdata/influxdb/v2"
|
|
influxlogger "github.com/influxdata/influxdb/v2/logger"
|
|
"github.com/influxdata/influxdb/v2/mock"
|
|
influxdbtesting "github.com/influxdata/influxdb/v2/testing"
|
|
)
|
|
|
|
func TestScheduler(t *testing.T) {
|
|
publisher, subscriber := mock.NewNats()
|
|
totalGatherJobs := 3
|
|
|
|
// Create top level logger
|
|
logger := influxlogger.New(os.Stdout)
|
|
ts := httptest.NewServer(&mockHTTPHandler{
|
|
responseMap: map[string]string{
|
|
"/metrics": sampleRespSmall,
|
|
},
|
|
})
|
|
ctx, cancel := context.WithCancel(context.Background())
|
|
defer cancel()
|
|
|
|
storage := &mockStorage{
|
|
Metrics: make(map[time.Time]Metrics),
|
|
Targets: []influxdb.ScraperTarget{
|
|
{
|
|
ID: influxdbtesting.MustIDBase16("3a0d0a6365646120"),
|
|
Type: influxdb.PrometheusScraperType,
|
|
URL: ts.URL + "/metrics",
|
|
OrgID: *orgID,
|
|
BucketID: *bucketID,
|
|
},
|
|
},
|
|
TotalGatherJobs: make(chan struct{}, totalGatherJobs),
|
|
}
|
|
|
|
subscriber.Subscribe(MetricsSubject, "", &RecorderHandler{
|
|
log: logger,
|
|
Recorder: storage,
|
|
})
|
|
|
|
scheduler, err := NewScheduler(logger, 10, storage, publisher, subscriber, time.Millisecond, time.Microsecond)
|
|
|
|
go func() {
|
|
err = scheduler.run(ctx)
|
|
if err != nil {
|
|
t.Error(err)
|
|
}
|
|
}()
|
|
|
|
go func(scheduler *Scheduler) {
|
|
// let scheduler gather #{totalGatherJobs} metrics.
|
|
for i := 0; i < totalGatherJobs; i++ {
|
|
// make sure timestamp don't overwrite each other
|
|
time.Sleep(time.Millisecond * 10)
|
|
scheduler.gather <- struct{}{}
|
|
}
|
|
}(scheduler)
|
|
|
|
// make sure all jobs are done
|
|
for i := 0; i < totalGatherJobs; i++ {
|
|
<-storage.TotalGatherJobs
|
|
}
|
|
|
|
want := Metrics{
|
|
Name: "go_goroutines",
|
|
Type: MetricTypeGauge,
|
|
Tags: map[string]string{},
|
|
Fields: map[string]interface{}{
|
|
"gauge": float64(36),
|
|
},
|
|
}
|
|
|
|
if len(storage.Metrics) < totalGatherJobs {
|
|
t.Fatalf("metrics stored less than expected, got len %d", len(storage.Metrics))
|
|
}
|
|
|
|
for _, v := range storage.Metrics {
|
|
if diff := cmp.Diff(v, want, metricsCmpOption); diff != "" {
|
|
t.Fatalf("scraper parse metrics want %v, got %v", want, v)
|
|
}
|
|
}
|
|
ts.Close()
|
|
}
|
|
|
|
const sampleRespSmall = `
|
|
# HELP go_goroutines Number of goroutines that currently exist.
|
|
# TYPE go_goroutines gauge
|
|
go_goroutines 36
|
|
`
|