mirror of
https://github.com/prometheus/prometheus
synced 2025-04-17 12:47:22 +00:00
Send target and metadata cache in context (again) (#10636)
* Send target and metadata cache in context (again) The previous attempt was rolled back in #10590 due to memory issues. `sl.parentCtx` and `sl.ctx` both had a copy of the cache and target info in the previous attempt and it was hard to pin-point where the context was being retained causing the memory increase. I've experimented a bunch in #10627 to figure out that this approach doesn't cause memory increase. Beyond that, just using this info in _any_ other context is causing a memory increase. The change fixed a bunch of long-standing in the OTel Collector that the community was waiting on and release is blocked on a few downstream distrubutions of OTel Collector waiting on a fix. I propose to merge this change in while I investigate what is happening. Signed-off-by: Goutham Veeramachaneni <gouthamve@gmail.com> * Gate the change behind a manager option Signed-off-by: Goutham Veeramachaneni <gouthamve@gmail.com>
This commit is contained in:
parent
dd5f9daab9
commit
2381d7be57
@ -124,6 +124,9 @@ func NewManager(o *Options, logger log.Logger, app storage.Appendable) *Manager
|
|||||||
// Options are the configuration parameters to the scrape manager.
|
// Options are the configuration parameters to the scrape manager.
|
||||||
type Options struct {
|
type Options struct {
|
||||||
ExtraMetrics bool
|
ExtraMetrics bool
|
||||||
|
// Option used by downstream scraper users like OpenTelemetry Collector
|
||||||
|
// to help lookup metric metadata. Should be false for Prometheus.
|
||||||
|
PassMetadataInContext bool
|
||||||
|
|
||||||
// Optional HTTP client options to use when scraping.
|
// Optional HTTP client options to use when scraping.
|
||||||
HTTPClientOptions []config_util.HTTPClientOption
|
HTTPClientOptions []config_util.HTTPClientOption
|
||||||
@ -195,7 +198,7 @@ func (m *Manager) reload() {
|
|||||||
level.Error(m.logger).Log("msg", "error reloading target set", "err", "invalid config id:"+setName)
|
level.Error(m.logger).Log("msg", "error reloading target set", "err", "invalid config id:"+setName)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
sp, err := newScrapePool(scrapeConfig, m.append, m.jitterSeed, log.With(m.logger, "scrape_pool", setName), m.opts.ExtraMetrics, m.opts.HTTPClientOptions)
|
sp, err := newScrapePool(scrapeConfig, m.append, m.jitterSeed, log.With(m.logger, "scrape_pool", setName), m.opts.ExtraMetrics, m.opts.PassMetadataInContext, m.opts.HTTPClientOptions)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
level.Error(m.logger).Log("msg", "error creating new scrape pool", "err", err, "scrape_pool", setName)
|
level.Error(m.logger).Log("msg", "error creating new scrape pool", "err", err, "scrape_pool", setName)
|
||||||
continue
|
continue
|
||||||
|
@ -264,7 +264,7 @@ const maxAheadTime = 10 * time.Minute
|
|||||||
|
|
||||||
type labelsMutator func(labels.Labels) labels.Labels
|
type labelsMutator func(labels.Labels) labels.Labels
|
||||||
|
|
||||||
func newScrapePool(cfg *config.ScrapeConfig, app storage.Appendable, jitterSeed uint64, logger log.Logger, reportExtraMetrics bool, httpOpts []config_util.HTTPClientOption) (*scrapePool, error) {
|
func newScrapePool(cfg *config.ScrapeConfig, app storage.Appendable, jitterSeed uint64, logger log.Logger, reportExtraMetrics, passMetadataInContext bool, httpOpts []config_util.HTTPClientOption) (*scrapePool, error) {
|
||||||
targetScrapePools.Inc()
|
targetScrapePools.Inc()
|
||||||
if logger == nil {
|
if logger == nil {
|
||||||
logger = log.NewNopLogger()
|
logger = log.NewNopLogger()
|
||||||
@ -315,6 +315,9 @@ func newScrapePool(cfg *config.ScrapeConfig, app storage.Appendable, jitterSeed
|
|||||||
opts.interval,
|
opts.interval,
|
||||||
opts.timeout,
|
opts.timeout,
|
||||||
reportExtraMetrics,
|
reportExtraMetrics,
|
||||||
|
opts.target,
|
||||||
|
cache,
|
||||||
|
passMetadataInContext,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -855,10 +858,11 @@ type scrapeLoop struct {
|
|||||||
sampleMutator labelsMutator
|
sampleMutator labelsMutator
|
||||||
reportSampleMutator labelsMutator
|
reportSampleMutator labelsMutator
|
||||||
|
|
||||||
parentCtx context.Context
|
parentCtx context.Context
|
||||||
ctx context.Context
|
appenderCtx context.Context
|
||||||
cancel func()
|
ctx context.Context
|
||||||
stopped chan struct{}
|
cancel func()
|
||||||
|
stopped chan struct{}
|
||||||
|
|
||||||
disabledEndOfRunStalenessMarkers bool
|
disabledEndOfRunStalenessMarkers bool
|
||||||
|
|
||||||
@ -1124,6 +1128,9 @@ func newScrapeLoop(ctx context.Context,
|
|||||||
interval time.Duration,
|
interval time.Duration,
|
||||||
timeout time.Duration,
|
timeout time.Duration,
|
||||||
reportExtraMetrics bool,
|
reportExtraMetrics bool,
|
||||||
|
target *Target,
|
||||||
|
metricMetadataStore MetricMetadataStore,
|
||||||
|
passMetadataInContext bool,
|
||||||
) *scrapeLoop {
|
) *scrapeLoop {
|
||||||
if l == nil {
|
if l == nil {
|
||||||
l = log.NewNopLogger()
|
l = log.NewNopLogger()
|
||||||
@ -1134,6 +1141,18 @@ func newScrapeLoop(ctx context.Context,
|
|||||||
if cache == nil {
|
if cache == nil {
|
||||||
cache = newScrapeCache()
|
cache = newScrapeCache()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
appenderCtx := ctx
|
||||||
|
|
||||||
|
if passMetadataInContext {
|
||||||
|
// Store the cache and target in the context. This is then used by downstream OTel Collector
|
||||||
|
// to lookup the metadata required to process the samples. Not used by Prometheus itself.
|
||||||
|
// TODO(gouthamve) We're using a dedicated context because using the parentCtx caused a memory
|
||||||
|
// leak. We should ideally fix the main leak. See: https://github.com/prometheus/prometheus/pull/10590
|
||||||
|
appenderCtx = ContextWithMetricMetadataStore(appenderCtx, cache)
|
||||||
|
appenderCtx = ContextWithTarget(appenderCtx, target)
|
||||||
|
}
|
||||||
|
|
||||||
sl := &scrapeLoop{
|
sl := &scrapeLoop{
|
||||||
scraper: sc,
|
scraper: sc,
|
||||||
buffers: buffers,
|
buffers: buffers,
|
||||||
@ -1145,6 +1164,7 @@ func newScrapeLoop(ctx context.Context,
|
|||||||
jitterSeed: jitterSeed,
|
jitterSeed: jitterSeed,
|
||||||
l: l,
|
l: l,
|
||||||
parentCtx: ctx,
|
parentCtx: ctx,
|
||||||
|
appenderCtx: appenderCtx,
|
||||||
honorTimestamps: honorTimestamps,
|
honorTimestamps: honorTimestamps,
|
||||||
sampleLimit: sampleLimit,
|
sampleLimit: sampleLimit,
|
||||||
labelLimits: labelLimits,
|
labelLimits: labelLimits,
|
||||||
@ -1223,7 +1243,7 @@ mainLoop:
|
|||||||
// scrapeAndReport performs a scrape and then appends the result to the storage
|
// scrapeAndReport performs a scrape and then appends the result to the storage
|
||||||
// together with reporting metrics, by using as few appenders as possible.
|
// together with reporting metrics, by using as few appenders as possible.
|
||||||
// In the happy scenario, a single appender is used.
|
// In the happy scenario, a single appender is used.
|
||||||
// This function uses sl.parentCtx instead of sl.ctx on purpose. A scrape should
|
// This function uses sl.appenderCtx instead of sl.ctx on purpose. A scrape should
|
||||||
// only be cancelled on shutdown, not on reloads.
|
// only be cancelled on shutdown, not on reloads.
|
||||||
func (sl *scrapeLoop) scrapeAndReport(last, appendTime time.Time, errc chan<- error) time.Time {
|
func (sl *scrapeLoop) scrapeAndReport(last, appendTime time.Time, errc chan<- error) time.Time {
|
||||||
start := time.Now()
|
start := time.Now()
|
||||||
@ -1242,7 +1262,7 @@ func (sl *scrapeLoop) scrapeAndReport(last, appendTime time.Time, errc chan<- er
|
|||||||
var total, added, seriesAdded, bytes int
|
var total, added, seriesAdded, bytes int
|
||||||
var err, appErr, scrapeErr error
|
var err, appErr, scrapeErr error
|
||||||
|
|
||||||
app := sl.appender(sl.parentCtx)
|
app := sl.appender(sl.appenderCtx)
|
||||||
defer func() {
|
defer func() {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
app.Rollback()
|
app.Rollback()
|
||||||
@ -1265,7 +1285,7 @@ func (sl *scrapeLoop) scrapeAndReport(last, appendTime time.Time, errc chan<- er
|
|||||||
// Add stale markers.
|
// Add stale markers.
|
||||||
if _, _, _, err := sl.append(app, []byte{}, "", appendTime); err != nil {
|
if _, _, _, err := sl.append(app, []byte{}, "", appendTime); err != nil {
|
||||||
app.Rollback()
|
app.Rollback()
|
||||||
app = sl.appender(sl.parentCtx)
|
app = sl.appender(sl.appenderCtx)
|
||||||
level.Warn(sl.l).Log("msg", "Append failed", "err", err)
|
level.Warn(sl.l).Log("msg", "Append failed", "err", err)
|
||||||
}
|
}
|
||||||
if errc != nil {
|
if errc != nil {
|
||||||
@ -1304,13 +1324,13 @@ func (sl *scrapeLoop) scrapeAndReport(last, appendTime time.Time, errc chan<- er
|
|||||||
total, added, seriesAdded, appErr = sl.append(app, b, contentType, appendTime)
|
total, added, seriesAdded, appErr = sl.append(app, b, contentType, appendTime)
|
||||||
if appErr != nil {
|
if appErr != nil {
|
||||||
app.Rollback()
|
app.Rollback()
|
||||||
app = sl.appender(sl.parentCtx)
|
app = sl.appender(sl.appenderCtx)
|
||||||
level.Debug(sl.l).Log("msg", "Append failed", "err", appErr)
|
level.Debug(sl.l).Log("msg", "Append failed", "err", appErr)
|
||||||
// The append failed, probably due to a parse error or sample limit.
|
// The append failed, probably due to a parse error or sample limit.
|
||||||
// Call sl.append again with an empty scrape to trigger stale markers.
|
// Call sl.append again with an empty scrape to trigger stale markers.
|
||||||
if _, _, _, err := sl.append(app, []byte{}, "", appendTime); err != nil {
|
if _, _, _, err := sl.append(app, []byte{}, "", appendTime); err != nil {
|
||||||
app.Rollback()
|
app.Rollback()
|
||||||
app = sl.appender(sl.parentCtx)
|
app = sl.appender(sl.appenderCtx)
|
||||||
level.Warn(sl.l).Log("msg", "Append failed", "err", err)
|
level.Warn(sl.l).Log("msg", "Append failed", "err", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1374,8 +1394,8 @@ func (sl *scrapeLoop) endOfRunStaleness(last time.Time, ticker *time.Ticker, int
|
|||||||
// Call sl.append again with an empty scrape to trigger stale markers.
|
// Call sl.append again with an empty scrape to trigger stale markers.
|
||||||
// If the target has since been recreated and scraped, the
|
// If the target has since been recreated and scraped, the
|
||||||
// stale markers will be out of order and ignored.
|
// stale markers will be out of order and ignored.
|
||||||
// sl.context would have been cancelled, hence using sl.parentCtx.
|
// sl.context would have been cancelled, hence using sl.appenderCtx.
|
||||||
app := sl.appender(sl.parentCtx)
|
app := sl.appender(sl.appenderCtx)
|
||||||
var err error
|
var err error
|
||||||
defer func() {
|
defer func() {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -1389,7 +1409,7 @@ func (sl *scrapeLoop) endOfRunStaleness(last time.Time, ticker *time.Ticker, int
|
|||||||
}()
|
}()
|
||||||
if _, _, _, err = sl.append(app, []byte{}, "", staleTime); err != nil {
|
if _, _, _, err = sl.append(app, []byte{}, "", staleTime); err != nil {
|
||||||
app.Rollback()
|
app.Rollback()
|
||||||
app = sl.appender(sl.parentCtx)
|
app = sl.appender(sl.appenderCtx)
|
||||||
level.Warn(sl.l).Log("msg", "Stale append failed", "err", err)
|
level.Warn(sl.l).Log("msg", "Stale append failed", "err", err)
|
||||||
}
|
}
|
||||||
if err = sl.reportStale(app, staleTime); err != nil {
|
if err = sl.reportStale(app, staleTime); err != nil {
|
||||||
@ -1791,3 +1811,31 @@ func reusableCache(r, l *config.ScrapeConfig) bool {
|
|||||||
}
|
}
|
||||||
return reflect.DeepEqual(zeroConfig(r), zeroConfig(l))
|
return reflect.DeepEqual(zeroConfig(r), zeroConfig(l))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// CtxKey is a dedicated type for keys of context-embedded values propagated
|
||||||
|
// with the scrape context.
|
||||||
|
type ctxKey int
|
||||||
|
|
||||||
|
// Valid CtxKey values.
|
||||||
|
const (
|
||||||
|
ctxKeyMetadata ctxKey = iota + 1
|
||||||
|
ctxKeyTarget
|
||||||
|
)
|
||||||
|
|
||||||
|
func ContextWithMetricMetadataStore(ctx context.Context, s MetricMetadataStore) context.Context {
|
||||||
|
return context.WithValue(ctx, ctxKeyMetadata, s)
|
||||||
|
}
|
||||||
|
|
||||||
|
func MetricMetadataStoreFromContext(ctx context.Context) (MetricMetadataStore, bool) {
|
||||||
|
s, ok := ctx.Value(ctxKeyMetadata).(MetricMetadataStore)
|
||||||
|
return s, ok
|
||||||
|
}
|
||||||
|
|
||||||
|
func ContextWithTarget(ctx context.Context, t *Target) context.Context {
|
||||||
|
return context.WithValue(ctx, ctxKeyTarget, t)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TargetFromContext(ctx context.Context) (*Target, bool) {
|
||||||
|
t, ok := ctx.Value(ctxKeyTarget).(*Target)
|
||||||
|
return t, ok
|
||||||
|
}
|
||||||
|
@ -56,7 +56,7 @@ func TestNewScrapePool(t *testing.T) {
|
|||||||
var (
|
var (
|
||||||
app = &nopAppendable{}
|
app = &nopAppendable{}
|
||||||
cfg = &config.ScrapeConfig{}
|
cfg = &config.ScrapeConfig{}
|
||||||
sp, _ = newScrapePool(cfg, app, 0, nil, false, nil)
|
sp, _ = newScrapePool(cfg, app, 0, nil, false, false, nil)
|
||||||
)
|
)
|
||||||
|
|
||||||
if a, ok := sp.appendable.(*nopAppendable); !ok || a != app {
|
if a, ok := sp.appendable.(*nopAppendable); !ok || a != app {
|
||||||
@ -91,7 +91,7 @@ func TestDroppedTargetsList(t *testing.T) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
sp, _ = newScrapePool(cfg, app, 0, nil, false, nil)
|
sp, _ = newScrapePool(cfg, app, 0, nil, false, false, nil)
|
||||||
expectedLabelSetString = "{__address__=\"127.0.0.1:9090\", __scrape_interval__=\"0s\", __scrape_timeout__=\"0s\", job=\"dropMe\"}"
|
expectedLabelSetString = "{__address__=\"127.0.0.1:9090\", __scrape_interval__=\"0s\", __scrape_timeout__=\"0s\", job=\"dropMe\"}"
|
||||||
expectedLength = 1
|
expectedLength = 1
|
||||||
)
|
)
|
||||||
@ -454,7 +454,7 @@ func TestScrapePoolTargetLimit(t *testing.T) {
|
|||||||
func TestScrapePoolAppender(t *testing.T) {
|
func TestScrapePoolAppender(t *testing.T) {
|
||||||
cfg := &config.ScrapeConfig{}
|
cfg := &config.ScrapeConfig{}
|
||||||
app := &nopAppendable{}
|
app := &nopAppendable{}
|
||||||
sp, _ := newScrapePool(cfg, app, 0, nil, false, nil)
|
sp, _ := newScrapePool(cfg, app, 0, nil, false, false, nil)
|
||||||
|
|
||||||
loop := sp.newLoop(scrapeLoopOptions{
|
loop := sp.newLoop(scrapeLoopOptions{
|
||||||
target: &Target{},
|
target: &Target{},
|
||||||
@ -496,7 +496,7 @@ func TestScrapePoolRaces(t *testing.T) {
|
|||||||
newConfig := func() *config.ScrapeConfig {
|
newConfig := func() *config.ScrapeConfig {
|
||||||
return &config.ScrapeConfig{ScrapeInterval: interval, ScrapeTimeout: timeout}
|
return &config.ScrapeConfig{ScrapeInterval: interval, ScrapeTimeout: timeout}
|
||||||
}
|
}
|
||||||
sp, _ := newScrapePool(newConfig(), &nopAppendable{}, 0, nil, false, nil)
|
sp, _ := newScrapePool(newConfig(), &nopAppendable{}, 0, nil, false, false, nil)
|
||||||
tgts := []*targetgroup.Group{
|
tgts := []*targetgroup.Group{
|
||||||
{
|
{
|
||||||
Targets: []model.LabelSet{
|
Targets: []model.LabelSet{
|
||||||
@ -590,6 +590,9 @@ func TestScrapeLoopStopBeforeRun(t *testing.T) {
|
|||||||
1,
|
1,
|
||||||
0,
|
0,
|
||||||
false,
|
false,
|
||||||
|
nil,
|
||||||
|
nil,
|
||||||
|
false,
|
||||||
)
|
)
|
||||||
|
|
||||||
// The scrape pool synchronizes on stopping scrape loops. However, new scrape
|
// The scrape pool synchronizes on stopping scrape loops. However, new scrape
|
||||||
@ -659,6 +662,9 @@ func TestScrapeLoopStop(t *testing.T) {
|
|||||||
10*time.Millisecond,
|
10*time.Millisecond,
|
||||||
time.Hour,
|
time.Hour,
|
||||||
false,
|
false,
|
||||||
|
nil,
|
||||||
|
nil,
|
||||||
|
false,
|
||||||
)
|
)
|
||||||
|
|
||||||
// Terminate loop after 2 scrapes.
|
// Terminate loop after 2 scrapes.
|
||||||
@ -731,6 +737,9 @@ func TestScrapeLoopRun(t *testing.T) {
|
|||||||
time.Second,
|
time.Second,
|
||||||
time.Hour,
|
time.Hour,
|
||||||
false,
|
false,
|
||||||
|
nil,
|
||||||
|
nil,
|
||||||
|
false,
|
||||||
)
|
)
|
||||||
|
|
||||||
// The loop must terminate during the initial offset if the context
|
// The loop must terminate during the initial offset if the context
|
||||||
@ -783,6 +792,9 @@ func TestScrapeLoopRun(t *testing.T) {
|
|||||||
time.Second,
|
time.Second,
|
||||||
100*time.Millisecond,
|
100*time.Millisecond,
|
||||||
false,
|
false,
|
||||||
|
nil,
|
||||||
|
nil,
|
||||||
|
false,
|
||||||
)
|
)
|
||||||
|
|
||||||
go func() {
|
go func() {
|
||||||
@ -839,6 +851,9 @@ func TestScrapeLoopForcedErr(t *testing.T) {
|
|||||||
time.Second,
|
time.Second,
|
||||||
time.Hour,
|
time.Hour,
|
||||||
false,
|
false,
|
||||||
|
nil,
|
||||||
|
nil,
|
||||||
|
false,
|
||||||
)
|
)
|
||||||
|
|
||||||
forcedErr := fmt.Errorf("forced err")
|
forcedErr := fmt.Errorf("forced err")
|
||||||
@ -894,6 +909,9 @@ func TestScrapeLoopMetadata(t *testing.T) {
|
|||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
false,
|
false,
|
||||||
|
nil,
|
||||||
|
nil,
|
||||||
|
false,
|
||||||
)
|
)
|
||||||
defer cancel()
|
defer cancel()
|
||||||
|
|
||||||
@ -948,6 +966,9 @@ func simpleTestScrapeLoop(t testing.TB) (context.Context, *scrapeLoop) {
|
|||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
false,
|
false,
|
||||||
|
nil,
|
||||||
|
nil,
|
||||||
|
false,
|
||||||
)
|
)
|
||||||
t.Cleanup(func() { cancel() })
|
t.Cleanup(func() { cancel() })
|
||||||
|
|
||||||
@ -1038,6 +1059,9 @@ func TestScrapeLoopRunCreatesStaleMarkersOnFailedScrape(t *testing.T) {
|
|||||||
10*time.Millisecond,
|
10*time.Millisecond,
|
||||||
time.Hour,
|
time.Hour,
|
||||||
false,
|
false,
|
||||||
|
nil,
|
||||||
|
nil,
|
||||||
|
false,
|
||||||
)
|
)
|
||||||
// Succeed once, several failures, then stop.
|
// Succeed once, several failures, then stop.
|
||||||
numScrapes := 0
|
numScrapes := 0
|
||||||
@ -1097,6 +1121,9 @@ func TestScrapeLoopRunCreatesStaleMarkersOnParseFailure(t *testing.T) {
|
|||||||
10*time.Millisecond,
|
10*time.Millisecond,
|
||||||
time.Hour,
|
time.Hour,
|
||||||
false,
|
false,
|
||||||
|
nil,
|
||||||
|
nil,
|
||||||
|
false,
|
||||||
)
|
)
|
||||||
|
|
||||||
// Succeed once, several failures, then stop.
|
// Succeed once, several failures, then stop.
|
||||||
@ -1160,6 +1187,9 @@ func TestScrapeLoopCache(t *testing.T) {
|
|||||||
10*time.Millisecond,
|
10*time.Millisecond,
|
||||||
time.Hour,
|
time.Hour,
|
||||||
false,
|
false,
|
||||||
|
nil,
|
||||||
|
nil,
|
||||||
|
false,
|
||||||
)
|
)
|
||||||
|
|
||||||
numScrapes := 0
|
numScrapes := 0
|
||||||
@ -1239,6 +1269,9 @@ func TestScrapeLoopCacheMemoryExhaustionProtection(t *testing.T) {
|
|||||||
10*time.Millisecond,
|
10*time.Millisecond,
|
||||||
time.Hour,
|
time.Hour,
|
||||||
false,
|
false,
|
||||||
|
nil,
|
||||||
|
nil,
|
||||||
|
false,
|
||||||
)
|
)
|
||||||
|
|
||||||
numScrapes := 0
|
numScrapes := 0
|
||||||
@ -1350,6 +1383,9 @@ func TestScrapeLoopAppend(t *testing.T) {
|
|||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
false,
|
false,
|
||||||
|
nil,
|
||||||
|
nil,
|
||||||
|
false,
|
||||||
)
|
)
|
||||||
|
|
||||||
now := time.Now()
|
now := time.Now()
|
||||||
@ -1437,7 +1473,7 @@ func TestScrapeLoopAppendForConflictingPrefixedLabels(t *testing.T) {
|
|||||||
return mutateSampleLabels(l, &Target{labels: labels.FromStrings(tc.targetLabels...)}, false, nil)
|
return mutateSampleLabels(l, &Target{labels: labels.FromStrings(tc.targetLabels...)}, false, nil)
|
||||||
},
|
},
|
||||||
nil,
|
nil,
|
||||||
func(ctx context.Context) storage.Appender { return app }, nil, 0, true, 0, nil, 0, 0, false,
|
func(ctx context.Context) storage.Appender { return app }, nil, 0, true, 0, nil, 0, 0, false, nil, nil, false,
|
||||||
)
|
)
|
||||||
slApp := sl.appender(context.Background())
|
slApp := sl.appender(context.Background())
|
||||||
_, _, _, err := sl.append(slApp, []byte(tc.exposedLabels), "", time.Date(2000, 1, 1, 1, 0, 0, 0, time.UTC))
|
_, _, _, err := sl.append(slApp, []byte(tc.exposedLabels), "", time.Date(2000, 1, 1, 1, 0, 0, 0, time.UTC))
|
||||||
@ -1473,6 +1509,9 @@ func TestScrapeLoopAppendCacheEntryButErrNotFound(t *testing.T) {
|
|||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
false,
|
false,
|
||||||
|
nil,
|
||||||
|
nil,
|
||||||
|
false,
|
||||||
)
|
)
|
||||||
|
|
||||||
fakeRef := storage.SeriesRef(1)
|
fakeRef := storage.SeriesRef(1)
|
||||||
@ -1528,6 +1567,9 @@ func TestScrapeLoopAppendSampleLimit(t *testing.T) {
|
|||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
false,
|
false,
|
||||||
|
nil,
|
||||||
|
nil,
|
||||||
|
false,
|
||||||
)
|
)
|
||||||
|
|
||||||
// Get the value of the Counter before performing the append.
|
// Get the value of the Counter before performing the append.
|
||||||
@ -1602,6 +1644,9 @@ func TestScrapeLoop_ChangingMetricString(t *testing.T) {
|
|||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
false,
|
false,
|
||||||
|
nil,
|
||||||
|
nil,
|
||||||
|
false,
|
||||||
)
|
)
|
||||||
|
|
||||||
now := time.Now()
|
now := time.Now()
|
||||||
@ -1647,6 +1692,9 @@ func TestScrapeLoopAppendStaleness(t *testing.T) {
|
|||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
false,
|
false,
|
||||||
|
nil,
|
||||||
|
nil,
|
||||||
|
false,
|
||||||
)
|
)
|
||||||
|
|
||||||
now := time.Now()
|
now := time.Now()
|
||||||
@ -1695,6 +1743,9 @@ func TestScrapeLoopAppendNoStalenessIfTimestamp(t *testing.T) {
|
|||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
false,
|
false,
|
||||||
|
nil,
|
||||||
|
nil,
|
||||||
|
false,
|
||||||
)
|
)
|
||||||
|
|
||||||
now := time.Now()
|
now := time.Now()
|
||||||
@ -1803,6 +1854,9 @@ metric_total{n="2"} 2 # {t="2"} 2.0 20000
|
|||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
false,
|
false,
|
||||||
|
nil,
|
||||||
|
nil,
|
||||||
|
false,
|
||||||
)
|
)
|
||||||
|
|
||||||
now := time.Now()
|
now := time.Now()
|
||||||
@ -1865,6 +1919,9 @@ func TestScrapeLoopAppendExemplarSeries(t *testing.T) {
|
|||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
false,
|
false,
|
||||||
|
nil,
|
||||||
|
nil,
|
||||||
|
false,
|
||||||
)
|
)
|
||||||
|
|
||||||
now := time.Now()
|
now := time.Now()
|
||||||
@ -1914,6 +1971,9 @@ func TestScrapeLoopRunReportsTargetDownOnScrapeError(t *testing.T) {
|
|||||||
10*time.Millisecond,
|
10*time.Millisecond,
|
||||||
time.Hour,
|
time.Hour,
|
||||||
false,
|
false,
|
||||||
|
nil,
|
||||||
|
nil,
|
||||||
|
false,
|
||||||
)
|
)
|
||||||
|
|
||||||
scraper.scrapeFunc = func(ctx context.Context, w io.Writer) error {
|
scraper.scrapeFunc = func(ctx context.Context, w io.Writer) error {
|
||||||
@ -1947,6 +2007,9 @@ func TestScrapeLoopRunReportsTargetDownOnInvalidUTF8(t *testing.T) {
|
|||||||
10*time.Millisecond,
|
10*time.Millisecond,
|
||||||
time.Hour,
|
time.Hour,
|
||||||
false,
|
false,
|
||||||
|
nil,
|
||||||
|
nil,
|
||||||
|
false,
|
||||||
)
|
)
|
||||||
|
|
||||||
scraper.scrapeFunc = func(ctx context.Context, w io.Writer) error {
|
scraper.scrapeFunc = func(ctx context.Context, w io.Writer) error {
|
||||||
@ -1993,6 +2056,9 @@ func TestScrapeLoopAppendGracefullyIfAmendOrOutOfOrderOrOutOfBounds(t *testing.T
|
|||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
false,
|
false,
|
||||||
|
nil,
|
||||||
|
nil,
|
||||||
|
false,
|
||||||
)
|
)
|
||||||
|
|
||||||
now := time.Unix(1, 0)
|
now := time.Unix(1, 0)
|
||||||
@ -2035,6 +2101,9 @@ func TestScrapeLoopOutOfBoundsTimeError(t *testing.T) {
|
|||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
false,
|
false,
|
||||||
|
nil,
|
||||||
|
nil,
|
||||||
|
false,
|
||||||
)
|
)
|
||||||
|
|
||||||
now := time.Now().Add(20 * time.Minute)
|
now := time.Now().Add(20 * time.Minute)
|
||||||
@ -2289,6 +2358,9 @@ func TestScrapeLoop_RespectTimestamps(t *testing.T) {
|
|||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
false,
|
false,
|
||||||
|
nil,
|
||||||
|
nil,
|
||||||
|
false,
|
||||||
)
|
)
|
||||||
|
|
||||||
now := time.Now()
|
now := time.Now()
|
||||||
@ -2327,6 +2399,9 @@ func TestScrapeLoop_DiscardTimestamps(t *testing.T) {
|
|||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
false,
|
false,
|
||||||
|
nil,
|
||||||
|
nil,
|
||||||
|
false,
|
||||||
)
|
)
|
||||||
|
|
||||||
now := time.Now()
|
now := time.Now()
|
||||||
@ -2364,6 +2439,9 @@ func TestScrapeLoopDiscardDuplicateLabels(t *testing.T) {
|
|||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
false,
|
false,
|
||||||
|
nil,
|
||||||
|
nil,
|
||||||
|
false,
|
||||||
)
|
)
|
||||||
defer cancel()
|
defer cancel()
|
||||||
|
|
||||||
@ -2419,6 +2497,9 @@ func TestScrapeLoopDiscardUnnamedMetrics(t *testing.T) {
|
|||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
false,
|
false,
|
||||||
|
nil,
|
||||||
|
nil,
|
||||||
|
false,
|
||||||
)
|
)
|
||||||
defer cancel()
|
defer cancel()
|
||||||
|
|
||||||
@ -2511,7 +2592,7 @@ func TestReuseScrapeCache(t *testing.T) {
|
|||||||
ScrapeInterval: model.Duration(5 * time.Second),
|
ScrapeInterval: model.Duration(5 * time.Second),
|
||||||
MetricsPath: "/metrics",
|
MetricsPath: "/metrics",
|
||||||
}
|
}
|
||||||
sp, _ = newScrapePool(cfg, app, 0, nil, false, nil)
|
sp, _ = newScrapePool(cfg, app, 0, nil, false, false, nil)
|
||||||
t1 = &Target{
|
t1 = &Target{
|
||||||
discoveredLabels: labels.Labels{
|
discoveredLabels: labels.Labels{
|
||||||
labels.Label{
|
labels.Label{
|
||||||
@ -2692,6 +2773,9 @@ func TestScrapeAddFast(t *testing.T) {
|
|||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
false,
|
false,
|
||||||
|
nil,
|
||||||
|
nil,
|
||||||
|
false,
|
||||||
)
|
)
|
||||||
defer cancel()
|
defer cancel()
|
||||||
|
|
||||||
@ -2721,7 +2805,7 @@ func TestReuseCacheRace(t *testing.T) {
|
|||||||
ScrapeInterval: model.Duration(5 * time.Second),
|
ScrapeInterval: model.Duration(5 * time.Second),
|
||||||
MetricsPath: "/metrics",
|
MetricsPath: "/metrics",
|
||||||
}
|
}
|
||||||
sp, _ = newScrapePool(cfg, app, 0, nil, false, nil)
|
sp, _ = newScrapePool(cfg, app, 0, nil, false, false, nil)
|
||||||
t1 = &Target{
|
t1 = &Target{
|
||||||
discoveredLabels: labels.Labels{
|
discoveredLabels: labels.Labels{
|
||||||
labels.Label{
|
labels.Label{
|
||||||
@ -2780,6 +2864,9 @@ func TestScrapeReportSingleAppender(t *testing.T) {
|
|||||||
10*time.Millisecond,
|
10*time.Millisecond,
|
||||||
time.Hour,
|
time.Hour,
|
||||||
false,
|
false,
|
||||||
|
nil,
|
||||||
|
nil,
|
||||||
|
false,
|
||||||
)
|
)
|
||||||
|
|
||||||
numScrapes := 0
|
numScrapes := 0
|
||||||
@ -2850,7 +2937,7 @@ func TestScrapeReportLimit(t *testing.T) {
|
|||||||
}))
|
}))
|
||||||
defer ts.Close()
|
defer ts.Close()
|
||||||
|
|
||||||
sp, err := newScrapePool(cfg, s, 0, nil, false, nil)
|
sp, err := newScrapePool(cfg, s, 0, nil, false, false, nil)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
defer sp.stop()
|
defer sp.stop()
|
||||||
|
|
||||||
@ -2979,6 +3066,9 @@ func TestScrapeLoopLabelLimit(t *testing.T) {
|
|||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
false,
|
false,
|
||||||
|
nil,
|
||||||
|
nil,
|
||||||
|
false,
|
||||||
)
|
)
|
||||||
|
|
||||||
slApp := sl.appender(context.Background())
|
slApp := sl.appender(context.Background())
|
||||||
@ -3017,7 +3107,7 @@ func TestTargetScrapeIntervalAndTimeoutRelabel(t *testing.T) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
sp, _ := newScrapePool(config, &nopAppendable{}, 0, nil, false, nil)
|
sp, _ := newScrapePool(config, &nopAppendable{}, 0, nil, false, false, nil)
|
||||||
tgts := []*targetgroup.Group{
|
tgts := []*targetgroup.Group{
|
||||||
{
|
{
|
||||||
Targets: []model.LabelSet{{model.AddressLabel: "127.0.0.1:9090"}},
|
Targets: []model.LabelSet{{model.AddressLabel: "127.0.0.1:9090"}},
|
||||||
|
Loading…
Reference in New Issue
Block a user