2020-05-17 13:30:52 +00:00
|
|
|
package merger
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
|
|
|
"io"
|
|
|
|
"net/http"
|
|
|
|
"sync"
|
|
|
|
"time"
|
|
|
|
|
|
|
|
prom "github.com/prometheus/client_model/go"
|
|
|
|
)
|
|
|
|
|
|
|
|
type Merger interface {
|
|
|
|
Merge(w io.Writer) error
|
|
|
|
AddSource(url string, labels []*prom.LabelPair)
|
|
|
|
}
|
|
|
|
|
|
|
|
type merger struct {
|
2020-05-17 15:34:32 +00:00
|
|
|
mu sync.Mutex
|
|
|
|
scrapeTimeout time.Duration
|
|
|
|
client *http.Client
|
|
|
|
sources []*source
|
2020-05-17 13:30:52 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
type source struct {
|
|
|
|
url string
|
|
|
|
labels []*prom.LabelPair
|
|
|
|
}
|
|
|
|
|
2020-05-17 15:34:32 +00:00
|
|
|
func New(scrapeTimeout time.Duration) Merger {
|
2020-05-17 13:30:52 +00:00
|
|
|
client := &http.Client{
|
|
|
|
Transport: &http.Transport{
|
|
|
|
DisableKeepAlives: false,
|
|
|
|
DisableCompression: false,
|
|
|
|
MaxIdleConns: 1,
|
|
|
|
MaxIdleConnsPerHost: 1,
|
|
|
|
MaxConnsPerHost: 10,
|
|
|
|
IdleConnTimeout: 5 * time.Minute,
|
|
|
|
},
|
2020-05-17 15:34:32 +00:00
|
|
|
Timeout: scrapeTimeout,
|
2020-05-17 13:30:52 +00:00
|
|
|
}
|
|
|
|
return &merger{
|
2020-05-17 15:34:32 +00:00
|
|
|
scrapeTimeout: scrapeTimeout,
|
|
|
|
client: client,
|
2020-05-17 13:30:52 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// AddSource new source
|
|
|
|
func (m *merger) AddSource(url string, labels []*prom.LabelPair) {
|
|
|
|
m.mu.Lock()
|
|
|
|
defer m.mu.Unlock()
|
|
|
|
m.sources = append(m.sources, &source{url: url, labels: labels})
|
|
|
|
}
|
|
|
|
|
|
|
|
// Merge sources
|
|
|
|
func (m *merger) Merge(w io.Writer) error {
|
|
|
|
m.mu.Lock()
|
|
|
|
defer m.mu.Unlock()
|
2020-05-17 15:34:32 +00:00
|
|
|
ctx, cancel := context.WithTimeout(context.Background(), m.scrapeTimeout)
|
2020-05-17 13:30:52 +00:00
|
|
|
defer cancel()
|
|
|
|
return m.merge(ctx, w)
|
|
|
|
}
|