diff --git a/retrieval/target.go b/retrieval/target.go
index abd767136c..b2875f4e02 100644
--- a/retrieval/target.go
+++ b/retrieval/target.go
@@ -98,6 +98,9 @@ type Target interface {
//
// Right now, this is used as the sorting key in TargetPool.
ScheduledFor() time.Time
+ // EstimatedTimeToExecute emits the amount of time until the next prospective
+ // scheduling opportunity for this target.
+ EstimatedTimeToExecute() time.Duration
// Return the last encountered scrape error, if any.
LastError() error
// The address to which the Target corresponds. Out of all of the available
@@ -257,6 +260,10 @@ func (t *target) ScheduledFor() time.Time {
return t.scheduler.ScheduledFor()
}
+func (t *target) EstimatedTimeToExecute() time.Duration {
+ return t.scheduler.ScheduledFor().Sub(time.Now())
+}
+
func (t *target) LastError() error {
return t.lastError
}
diff --git a/storage/metric/operation_test.go b/storage/metric/operation_test.go
index e39cbdeb09..6a44fd4eeb 100644
--- a/storage/metric/operation_test.go
+++ b/storage/metric/operation_test.go
@@ -1838,13 +1838,13 @@ func TestGetValueRangeAtIntervalOp(t *testing.T) {
var scenarios = []struct {
op getValueRangeAtIntervalOp
- in model.Values
- out model.Values
+ in Values
+ out Values
}{
// All values before the first range.
{
op: testOp,
- in: model.Values{
+ in: Values{
{
Timestamp: testInstant.Add(-4 * time.Minute),
Value: 1,
@@ -1854,12 +1854,12 @@ func TestGetValueRangeAtIntervalOp(t *testing.T) {
Value: 2,
},
},
- out: model.Values{},
+ out: Values{},
},
// Values starting before first range, ending after last.
{
op: testOp,
- in: model.Values{
+ in: Values{
{
Timestamp: testInstant.Add(-4 * time.Minute),
Value: 1,
@@ -1917,7 +1917,7 @@ func TestGetValueRangeAtIntervalOp(t *testing.T) {
Value: 14,
},
},
- out: model.Values{
+ out: Values{
{
Timestamp: testInstant.Add(-2 * time.Minute),
Value: 3,
@@ -1959,17 +1959,17 @@ func TestGetValueRangeAtIntervalOp(t *testing.T) {
// Values starting after last range.
{
op: testOp,
- in: model.Values{
+ in: Values{
{
Timestamp: testInstant.Add(21 * time.Minute),
Value: 14,
},
},
- out: model.Values{},
+ out: Values{},
},
}
for i, scenario := range scenarios {
- actual := model.Values{}
+ actual := Values{}
for !scenario.op.Consumed() {
actual = append(actual, scenario.op.ExtractSamples(scenario.in)...)
}
diff --git a/web/templates/status.html b/web/templates/status.html
index 7a408db0df..25656923f3 100644
--- a/web/templates/status.html
+++ b/web/templates/status.html
@@ -40,46 +40,43 @@
Targets
-
- {{range $job, $pool := .TargetPools}}
- - {{$job}}
-
-
-
- | Endpoint |
- State |
- Base Labels |
- Earliest Retrieval |
- Error |
-
-
-
- {{range $pool.Targets}}
-
- |
- {{.Address}}
- |
-
- {{.State}}
- |
-
- {{.BaseLabels}}
- |
-
- {{.ScheduledFor}}
- |
-
- {{if .LastError}}
- {{.LastError}}
- {{end}}
- |
-
- {{end}}
-
-
-
- {{end}}
-
+ {{range $job, $pool := .TargetPools}}
+
{{$job}}
+
+
+
+ | Endpoint |
+ State |
+ Base Labels |
+ Next Retrieval |
+ Error |
+
+
+
+ {{range $pool.Targets}}
+
+ |
+ {{.Address}}
+ |
+
+ {{.State}}
+ |
+
+ {{.BaseLabels}}
+ |
+
+ {{.EstimatedTimeToExecute}}
+ |
+
+ {{if .LastError}}
+ {{.LastError}}
+ {{end}}
+ |
+
+ {{end}}
+
+
+ {{end}}
Curation