From e8dfecb3f1d735bd47281579e2af9b8eded8686d Mon Sep 17 00:00:00 2001
From: Aliaksandr Valialkin <valyala@victoriametrics.com>
Date: Wed, 6 Dec 2023 22:24:24 +0200
Subject: [PATCH] lib/promscrape: show `never scraped` message for never
 scraped targets at /targets page

---
 lib/promscrape/targetstatus.go      |    8 +-
 lib/promscrape/targetstatus.qtpl    |   11 +-
 lib/promscrape/targetstatus.qtpl.go | 1020 +++++++++++++--------------
 3 files changed, 512 insertions(+), 527 deletions(-)

diff --git a/lib/promscrape/targetstatus.go b/lib/promscrape/targetstatus.go
index a4051bdccd..3433be9ba8 100644
--- a/lib/promscrape/targetstatus.go
+++ b/lib/promscrape/targetstatus.go
@@ -304,8 +304,12 @@ type targetStatus struct {
 	err            error
 }
 
-func (ts *targetStatus) getDurationFromLastScrape() time.Duration {
-	return time.Since(time.Unix(ts.scrapeTime/1000, (ts.scrapeTime%1000)*1e6))
+func (ts *targetStatus) getDurationFromLastScrape() string {
+	if ts.scrapeTime <= 0 {
+		return "never scraped"
+	}
+	d := time.Since(time.Unix(ts.scrapeTime/1000, (ts.scrapeTime%1000)*1e6))
+	return fmt.Sprintf("%.3fs ago", d.Seconds())
 }
 
 type droppedTargets struct {
diff --git a/lib/promscrape/targetstatus.qtpl b/lib/promscrape/targetstatus.qtpl
index 0c767103a4..c07f8cc760 100644
--- a/lib/promscrape/targetstatus.qtpl
+++ b/lib/promscrape/targetstatus.qtpl
@@ -1,6 +1,5 @@
 {% import (
 	"net/url"
-	"time"
 
 	"github.com/VictoriaMetrics/VictoriaMetrics/lib/htmlcomponents"
 	"github.com/VictoriaMetrics/VictoriaMetrics/lib/promutils"
@@ -26,7 +25,7 @@
 		{% if filter.showOriginalLabels %}originalLabels={%s= ts.sw.Config.OriginalLabels.String() %},{% space %}{% endif %}
 		scrapes_total={%d ts.scrapesTotal %},{% space %}
 		scrapes_failed={%d ts.scrapesFailed %},{% space %}
-		last_scrape={%d int(ts.getDurationFromLastScrape().Milliseconds()) %}ms ago,{% space %}
+		last_scrape={%s ts.getDurationFromLastScrape() %},{% space %}
 		scrape_duration={%d int(ts.scrapeDuration) %}ms,{% space %}
 		samples_scraped={%d ts.samplesScraped %},{% space %}
 		error={% if ts.err != nil %}{%s= ts.err.Error() %}{% endif %}
@@ -228,7 +227,6 @@
 
                         // The target is uniquely identified by a pointer to its original labels.
                         targetID := getLabelsID(originalLabels)
-                        lastScrapeDuration := ts.getDurationFromLastScrape()
                     %}
                         <tr {% if !ts.up %}{%space%}class="alert alert-danger" role="alert" {% endif %}>
                             <td class="endpoint">
@@ -269,12 +267,7 @@
                             {% endif %}
                             <td>{%d ts.scrapesTotal %}</td>
                             <td>{%d ts.scrapesFailed %}</td>
-                            <td>
-                                {% if lastScrapeDuration < 365*24*time.Hour %}
-                                    {%d int(lastScrapeDuration.Milliseconds()) %}ms ago
-                                {% else %}
-                                    none
-                                {% endif %}
+                            <td>{%s ts.getDurationFromLastScrape() %}
                             <td>{%d int(ts.scrapeDuration) %}ms</td>
                             <td>{%d ts.samplesScraped %}</td>
                             <td>{% if ts.err != nil %}{%s ts.err.Error() %}{% endif %}</td>
diff --git a/lib/promscrape/targetstatus.qtpl.go b/lib/promscrape/targetstatus.qtpl.go
index cf96e116db..e6821965bc 100644
--- a/lib/promscrape/targetstatus.qtpl.go
+++ b/lib/promscrape/targetstatus.qtpl.go
@@ -7,977 +7,965 @@ package promscrape
 //line lib/promscrape/targetstatus.qtpl:1
 import (
 	"net/url"
-	"time"
 
 	"github.com/VictoriaMetrics/VictoriaMetrics/lib/htmlcomponents"
 	"github.com/VictoriaMetrics/VictoriaMetrics/lib/promutils"
 )
 
-//line lib/promscrape/targetstatus.qtpl:11
+//line lib/promscrape/targetstatus.qtpl:10
 import (
 	qtio422016 "io"
 
 	qt422016 "github.com/valyala/quicktemplate"
 )
 
-//line lib/promscrape/targetstatus.qtpl:11
+//line lib/promscrape/targetstatus.qtpl:10
 var (
 	_ = qtio422016.Copy
 	_ = qt422016.AcquireByteBuffer
 )
 
-//line lib/promscrape/targetstatus.qtpl:11
+//line lib/promscrape/targetstatus.qtpl:10
 func StreamTargetsResponsePlain(qw422016 *qt422016.Writer, tsr *targetsStatusResult, filter *requestFilter) {
-//line lib/promscrape/targetstatus.qtpl:13
+//line lib/promscrape/targetstatus.qtpl:12
 	if tsr.err != nil {
-//line lib/promscrape/targetstatus.qtpl:14
+//line lib/promscrape/targetstatus.qtpl:13
 		qw422016.N().S(tsr.err.Error())
-//line lib/promscrape/targetstatus.qtpl:15
+//line lib/promscrape/targetstatus.qtpl:14
 		return
-//line lib/promscrape/targetstatus.qtpl:16
+//line lib/promscrape/targetstatus.qtpl:15
 	}
-//line lib/promscrape/targetstatus.qtpl:18
+//line lib/promscrape/targetstatus.qtpl:17
 	for _, jts := range tsr.jobTargetsStatuses {
-//line lib/promscrape/targetstatus.qtpl:18
+//line lib/promscrape/targetstatus.qtpl:17
 		qw422016.N().S(`job=`)
-//line lib/promscrape/targetstatus.qtpl:19
+//line lib/promscrape/targetstatus.qtpl:18
 		qw422016.N().S(jts.jobName)
-//line lib/promscrape/targetstatus.qtpl:19
+//line lib/promscrape/targetstatus.qtpl:18
 		qw422016.N().S(` `)
-//line lib/promscrape/targetstatus.qtpl:19
+//line lib/promscrape/targetstatus.qtpl:18
 		qw422016.N().S(`(`)
-//line lib/promscrape/targetstatus.qtpl:19
+//line lib/promscrape/targetstatus.qtpl:18
 		qw422016.N().D(jts.upCount)
-//line lib/promscrape/targetstatus.qtpl:19
+//line lib/promscrape/targetstatus.qtpl:18
 		qw422016.N().S(`/`)
-//line lib/promscrape/targetstatus.qtpl:19
+//line lib/promscrape/targetstatus.qtpl:18
 		qw422016.N().D(jts.targetsTotal)
-//line lib/promscrape/targetstatus.qtpl:19
+//line lib/promscrape/targetstatus.qtpl:18
 		qw422016.N().S(` `)
-//line lib/promscrape/targetstatus.qtpl:19
+//line lib/promscrape/targetstatus.qtpl:18
 		qw422016.N().S(`up)`)
-//line lib/promscrape/targetstatus.qtpl:20
+//line lib/promscrape/targetstatus.qtpl:19
 		qw422016.N().S(`
 `)
-//line lib/promscrape/targetstatus.qtpl:21
+//line lib/promscrape/targetstatus.qtpl:20
 		for _, ts := range jts.targetsStatus {
-//line lib/promscrape/targetstatus.qtpl:22
+//line lib/promscrape/targetstatus.qtpl:21
 			qw422016.N().S("\t")
-//line lib/promscrape/targetstatus.qtpl:22
+//line lib/promscrape/targetstatus.qtpl:21
 			qw422016.N().S(`state=`)
-//line lib/promscrape/targetstatus.qtpl:23
+//line lib/promscrape/targetstatus.qtpl:22
 			if ts.up {
-//line lib/promscrape/targetstatus.qtpl:23
+//line lib/promscrape/targetstatus.qtpl:22
 				qw422016.N().S(`up`)
-//line lib/promscrape/targetstatus.qtpl:23
+//line lib/promscrape/targetstatus.qtpl:22
 			} else {
-//line lib/promscrape/targetstatus.qtpl:23
+//line lib/promscrape/targetstatus.qtpl:22
 				qw422016.N().S(`down`)
-//line lib/promscrape/targetstatus.qtpl:23
+//line lib/promscrape/targetstatus.qtpl:22
 			}
-//line lib/promscrape/targetstatus.qtpl:23
+//line lib/promscrape/targetstatus.qtpl:22
 			qw422016.N().S(`,`)
-//line lib/promscrape/targetstatus.qtpl:23
+//line lib/promscrape/targetstatus.qtpl:22
 			qw422016.N().S(` `)
-//line lib/promscrape/targetstatus.qtpl:23
+//line lib/promscrape/targetstatus.qtpl:22
 			qw422016.N().S(`endpoint=`)
-//line lib/promscrape/targetstatus.qtpl:24
+//line lib/promscrape/targetstatus.qtpl:23
 			qw422016.N().S(ts.sw.Config.ScrapeURL)
-//line lib/promscrape/targetstatus.qtpl:24
+//line lib/promscrape/targetstatus.qtpl:23
 			qw422016.N().S(`,`)
-//line lib/promscrape/targetstatus.qtpl:24
+//line lib/promscrape/targetstatus.qtpl:23
 			qw422016.N().S(` `)
-//line lib/promscrape/targetstatus.qtpl:24
+//line lib/promscrape/targetstatus.qtpl:23
 			qw422016.N().S(`labels=`)
-//line lib/promscrape/targetstatus.qtpl:25
+//line lib/promscrape/targetstatus.qtpl:24
 			qw422016.N().S(ts.sw.Config.Labels.String())
-//line lib/promscrape/targetstatus.qtpl:25
+//line lib/promscrape/targetstatus.qtpl:24
 			qw422016.N().S(`,`)
-//line lib/promscrape/targetstatus.qtpl:25
+//line lib/promscrape/targetstatus.qtpl:24
 			qw422016.N().S(` `)
-//line lib/promscrape/targetstatus.qtpl:26
+//line lib/promscrape/targetstatus.qtpl:25
 			if filter.showOriginalLabels {
-//line lib/promscrape/targetstatus.qtpl:26
+//line lib/promscrape/targetstatus.qtpl:25
 				qw422016.N().S(`originalLabels=`)
-//line lib/promscrape/targetstatus.qtpl:26
+//line lib/promscrape/targetstatus.qtpl:25
 				qw422016.N().S(ts.sw.Config.OriginalLabels.String())
-//line lib/promscrape/targetstatus.qtpl:26
+//line lib/promscrape/targetstatus.qtpl:25
 				qw422016.N().S(`,`)
-//line lib/promscrape/targetstatus.qtpl:26
+//line lib/promscrape/targetstatus.qtpl:25
 				qw422016.N().S(` `)
-//line lib/promscrape/targetstatus.qtpl:26
+//line lib/promscrape/targetstatus.qtpl:25
 			}
-//line lib/promscrape/targetstatus.qtpl:26
+//line lib/promscrape/targetstatus.qtpl:25
 			qw422016.N().S(`scrapes_total=`)
-//line lib/promscrape/targetstatus.qtpl:27
+//line lib/promscrape/targetstatus.qtpl:26
 			qw422016.N().D(ts.scrapesTotal)
-//line lib/promscrape/targetstatus.qtpl:27
+//line lib/promscrape/targetstatus.qtpl:26
 			qw422016.N().S(`,`)
-//line lib/promscrape/targetstatus.qtpl:27
+//line lib/promscrape/targetstatus.qtpl:26
 			qw422016.N().S(` `)
-//line lib/promscrape/targetstatus.qtpl:27
+//line lib/promscrape/targetstatus.qtpl:26
 			qw422016.N().S(`scrapes_failed=`)
-//line lib/promscrape/targetstatus.qtpl:28
+//line lib/promscrape/targetstatus.qtpl:27
 			qw422016.N().D(ts.scrapesFailed)
-//line lib/promscrape/targetstatus.qtpl:28
+//line lib/promscrape/targetstatus.qtpl:27
 			qw422016.N().S(`,`)
-//line lib/promscrape/targetstatus.qtpl:28
+//line lib/promscrape/targetstatus.qtpl:27
 			qw422016.N().S(` `)
-//line lib/promscrape/targetstatus.qtpl:28
+//line lib/promscrape/targetstatus.qtpl:27
 			qw422016.N().S(`last_scrape=`)
-//line lib/promscrape/targetstatus.qtpl:29
-			qw422016.N().D(int(ts.getDurationFromLastScrape().Milliseconds()))
-//line lib/promscrape/targetstatus.qtpl:29
-			qw422016.N().S(`ms ago,`)
-//line lib/promscrape/targetstatus.qtpl:29
-			qw422016.N().S(` `)
-//line lib/promscrape/targetstatus.qtpl:29
-			qw422016.N().S(`scrape_duration=`)
-//line lib/promscrape/targetstatus.qtpl:30
-			qw422016.N().D(int(ts.scrapeDuration))
-//line lib/promscrape/targetstatus.qtpl:30
-			qw422016.N().S(`ms,`)
-//line lib/promscrape/targetstatus.qtpl:30
-			qw422016.N().S(` `)
-//line lib/promscrape/targetstatus.qtpl:30
-			qw422016.N().S(`samples_scraped=`)
-//line lib/promscrape/targetstatus.qtpl:31
-			qw422016.N().D(ts.samplesScraped)
-//line lib/promscrape/targetstatus.qtpl:31
+//line lib/promscrape/targetstatus.qtpl:28
+			qw422016.E().S(ts.getDurationFromLastScrape())
+//line lib/promscrape/targetstatus.qtpl:28
 			qw422016.N().S(`,`)
-//line lib/promscrape/targetstatus.qtpl:31
+//line lib/promscrape/targetstatus.qtpl:28
 			qw422016.N().S(` `)
-//line lib/promscrape/targetstatus.qtpl:31
+//line lib/promscrape/targetstatus.qtpl:28
+			qw422016.N().S(`scrape_duration=`)
+//line lib/promscrape/targetstatus.qtpl:29
+			qw422016.N().D(int(ts.scrapeDuration))
+//line lib/promscrape/targetstatus.qtpl:29
+			qw422016.N().S(`ms,`)
+//line lib/promscrape/targetstatus.qtpl:29
+			qw422016.N().S(` `)
+//line lib/promscrape/targetstatus.qtpl:29
+			qw422016.N().S(`samples_scraped=`)
+//line lib/promscrape/targetstatus.qtpl:30
+			qw422016.N().D(ts.samplesScraped)
+//line lib/promscrape/targetstatus.qtpl:30
+			qw422016.N().S(`,`)
+//line lib/promscrape/targetstatus.qtpl:30
+			qw422016.N().S(` `)
+//line lib/promscrape/targetstatus.qtpl:30
 			qw422016.N().S(`error=`)
-//line lib/promscrape/targetstatus.qtpl:32
+//line lib/promscrape/targetstatus.qtpl:31
 			if ts.err != nil {
-//line lib/promscrape/targetstatus.qtpl:32
+//line lib/promscrape/targetstatus.qtpl:31
 				qw422016.N().S(ts.err.Error())
-//line lib/promscrape/targetstatus.qtpl:32
+//line lib/promscrape/targetstatus.qtpl:31
 			}
-//line lib/promscrape/targetstatus.qtpl:33
+//line lib/promscrape/targetstatus.qtpl:32
 			qw422016.N().S(`
 `)
-//line lib/promscrape/targetstatus.qtpl:34
+//line lib/promscrape/targetstatus.qtpl:33
 		}
-//line lib/promscrape/targetstatus.qtpl:35
+//line lib/promscrape/targetstatus.qtpl:34
 	}
-//line lib/promscrape/targetstatus.qtpl:37
+//line lib/promscrape/targetstatus.qtpl:36
 	for _, jobName := range tsr.emptyJobs {
-//line lib/promscrape/targetstatus.qtpl:37
+//line lib/promscrape/targetstatus.qtpl:36
 		qw422016.N().S(`job=`)
-//line lib/promscrape/targetstatus.qtpl:38
+//line lib/promscrape/targetstatus.qtpl:37
 		qw422016.N().S(jobName)
-//line lib/promscrape/targetstatus.qtpl:38
+//line lib/promscrape/targetstatus.qtpl:37
 		qw422016.N().S(` `)
-//line lib/promscrape/targetstatus.qtpl:38
+//line lib/promscrape/targetstatus.qtpl:37
 		qw422016.N().S(`(0/0 up)`)
-//line lib/promscrape/targetstatus.qtpl:39
+//line lib/promscrape/targetstatus.qtpl:38
 		qw422016.N().S(`
 `)
-//line lib/promscrape/targetstatus.qtpl:40
+//line lib/promscrape/targetstatus.qtpl:39
 	}
-//line lib/promscrape/targetstatus.qtpl:42
+//line lib/promscrape/targetstatus.qtpl:41
 }
 
-//line lib/promscrape/targetstatus.qtpl:42
+//line lib/promscrape/targetstatus.qtpl:41
 func WriteTargetsResponsePlain(qq422016 qtio422016.Writer, tsr *targetsStatusResult, filter *requestFilter) {
-//line lib/promscrape/targetstatus.qtpl:42
+//line lib/promscrape/targetstatus.qtpl:41
 	qw422016 := qt422016.AcquireWriter(qq422016)
-//line lib/promscrape/targetstatus.qtpl:42
+//line lib/promscrape/targetstatus.qtpl:41
 	StreamTargetsResponsePlain(qw422016, tsr, filter)
-//line lib/promscrape/targetstatus.qtpl:42
+//line lib/promscrape/targetstatus.qtpl:41
 	qt422016.ReleaseWriter(qw422016)
-//line lib/promscrape/targetstatus.qtpl:42
+//line lib/promscrape/targetstatus.qtpl:41
 }
 
-//line lib/promscrape/targetstatus.qtpl:42
+//line lib/promscrape/targetstatus.qtpl:41
 func TargetsResponsePlain(tsr *targetsStatusResult, filter *requestFilter) string {
-//line lib/promscrape/targetstatus.qtpl:42
+//line lib/promscrape/targetstatus.qtpl:41
 	qb422016 := qt422016.AcquireByteBuffer()
-//line lib/promscrape/targetstatus.qtpl:42
+//line lib/promscrape/targetstatus.qtpl:41
 	WriteTargetsResponsePlain(qb422016, tsr, filter)
-//line lib/promscrape/targetstatus.qtpl:42
+//line lib/promscrape/targetstatus.qtpl:41
 	qs422016 := string(qb422016.B)
-//line lib/promscrape/targetstatus.qtpl:42
+//line lib/promscrape/targetstatus.qtpl:41
 	qt422016.ReleaseByteBuffer(qb422016)
-//line lib/promscrape/targetstatus.qtpl:42
+//line lib/promscrape/targetstatus.qtpl:41
 	return qs422016
-//line lib/promscrape/targetstatus.qtpl:42
+//line lib/promscrape/targetstatus.qtpl:41
 }
 
-//line lib/promscrape/targetstatus.qtpl:44
+//line lib/promscrape/targetstatus.qtpl:43
 func StreamTargetsResponseHTML(qw422016 *qt422016.Writer, tsr *targetsStatusResult, filter *requestFilter) {
-//line lib/promscrape/targetstatus.qtpl:44
+//line lib/promscrape/targetstatus.qtpl:43
 	qw422016.N().S(`<!DOCTYPE html><html lang="en"><head>`)
-//line lib/promscrape/targetstatus.qtpl:48
+//line lib/promscrape/targetstatus.qtpl:47
 	htmlcomponents.StreamCommonHeader(qw422016)
-//line lib/promscrape/targetstatus.qtpl:48
+//line lib/promscrape/targetstatus.qtpl:47
 	qw422016.N().S(`<title>Active Targets</title></head><body>`)
-//line lib/promscrape/targetstatus.qtpl:52
+//line lib/promscrape/targetstatus.qtpl:51
 	htmlcomponents.StreamNavbar(qw422016)
-//line lib/promscrape/targetstatus.qtpl:52
+//line lib/promscrape/targetstatus.qtpl:51
 	qw422016.N().S(`<div class="container-fluid">`)
+//line lib/promscrape/targetstatus.qtpl:53
+	if tsr.err != nil {
 //line lib/promscrape/targetstatus.qtpl:54
-	if tsr.err != nil {
+		htmlcomponents.StreamErrorNotification(qw422016, tsr.err)
 //line lib/promscrape/targetstatus.qtpl:55
-		htmlcomponents.StreamErrorNotification(qw422016, tsr.err)
-//line lib/promscrape/targetstatus.qtpl:56
 	}
-//line lib/promscrape/targetstatus.qtpl:56
+//line lib/promscrape/targetstatus.qtpl:55
 	qw422016.N().S(`<div class="row"><main class="col-12"><h1>Active Targets</h1><hr />`)
-//line lib/promscrape/targetstatus.qtpl:61
+//line lib/promscrape/targetstatus.qtpl:60
 	streamfiltersForm(qw422016, filter)
-//line lib/promscrape/targetstatus.qtpl:61
+//line lib/promscrape/targetstatus.qtpl:60
 	qw422016.N().S(`<hr />`)
-//line lib/promscrape/targetstatus.qtpl:63
+//line lib/promscrape/targetstatus.qtpl:62
 	streamtargetsTabs(qw422016, tsr, filter, "scrapeTargets")
-//line lib/promscrape/targetstatus.qtpl:63
+//line lib/promscrape/targetstatus.qtpl:62
 	qw422016.N().S(`</main></div></div></body></html>`)
-//line lib/promscrape/targetstatus.qtpl:69
+//line lib/promscrape/targetstatus.qtpl:68
 }
 
-//line lib/promscrape/targetstatus.qtpl:69
+//line lib/promscrape/targetstatus.qtpl:68
 func WriteTargetsResponseHTML(qq422016 qtio422016.Writer, tsr *targetsStatusResult, filter *requestFilter) {
-//line lib/promscrape/targetstatus.qtpl:69
+//line lib/promscrape/targetstatus.qtpl:68
 	qw422016 := qt422016.AcquireWriter(qq422016)
-//line lib/promscrape/targetstatus.qtpl:69
+//line lib/promscrape/targetstatus.qtpl:68
 	StreamTargetsResponseHTML(qw422016, tsr, filter)
-//line lib/promscrape/targetstatus.qtpl:69
+//line lib/promscrape/targetstatus.qtpl:68
 	qt422016.ReleaseWriter(qw422016)
-//line lib/promscrape/targetstatus.qtpl:69
+//line lib/promscrape/targetstatus.qtpl:68
 }
 
-//line lib/promscrape/targetstatus.qtpl:69
+//line lib/promscrape/targetstatus.qtpl:68
 func TargetsResponseHTML(tsr *targetsStatusResult, filter *requestFilter) string {
-//line lib/promscrape/targetstatus.qtpl:69
+//line lib/promscrape/targetstatus.qtpl:68
 	qb422016 := qt422016.AcquireByteBuffer()
-//line lib/promscrape/targetstatus.qtpl:69
+//line lib/promscrape/targetstatus.qtpl:68
 	WriteTargetsResponseHTML(qb422016, tsr, filter)
-//line lib/promscrape/targetstatus.qtpl:69
+//line lib/promscrape/targetstatus.qtpl:68
 	qs422016 := string(qb422016.B)
-//line lib/promscrape/targetstatus.qtpl:69
+//line lib/promscrape/targetstatus.qtpl:68
 	qt422016.ReleaseByteBuffer(qb422016)
-//line lib/promscrape/targetstatus.qtpl:69
+//line lib/promscrape/targetstatus.qtpl:68
 	return qs422016
-//line lib/promscrape/targetstatus.qtpl:69
+//line lib/promscrape/targetstatus.qtpl:68
 }
 
-//line lib/promscrape/targetstatus.qtpl:71
+//line lib/promscrape/targetstatus.qtpl:70
 func StreamServiceDiscoveryResponse(qw422016 *qt422016.Writer, tsr *targetsStatusResult, filter *requestFilter) {
-//line lib/promscrape/targetstatus.qtpl:71
+//line lib/promscrape/targetstatus.qtpl:70
 	qw422016.N().S(`<!DOCTYPE html><html lang="en"><head>`)
-//line lib/promscrape/targetstatus.qtpl:75
+//line lib/promscrape/targetstatus.qtpl:74
 	htmlcomponents.StreamCommonHeader(qw422016)
-//line lib/promscrape/targetstatus.qtpl:75
+//line lib/promscrape/targetstatus.qtpl:74
 	qw422016.N().S(`<title>Discovered Targets</title></head><body>`)
-//line lib/promscrape/targetstatus.qtpl:79
+//line lib/promscrape/targetstatus.qtpl:78
 	htmlcomponents.StreamNavbar(qw422016)
-//line lib/promscrape/targetstatus.qtpl:79
+//line lib/promscrape/targetstatus.qtpl:78
 	qw422016.N().S(`<div class="container-fluid">`)
-//line lib/promscrape/targetstatus.qtpl:81
+//line lib/promscrape/targetstatus.qtpl:80
 	if tsr.err != nil {
-//line lib/promscrape/targetstatus.qtpl:82
+//line lib/promscrape/targetstatus.qtpl:81
 		htmlcomponents.StreamErrorNotification(qw422016, tsr.err)
-//line lib/promscrape/targetstatus.qtpl:83
+//line lib/promscrape/targetstatus.qtpl:82
 	}
-//line lib/promscrape/targetstatus.qtpl:83
+//line lib/promscrape/targetstatus.qtpl:82
 	qw422016.N().S(`<div class="row"><main class="col-12"><h1>Discovered Targets</h1><hr />`)
-//line lib/promscrape/targetstatus.qtpl:88
+//line lib/promscrape/targetstatus.qtpl:87
 	streamfiltersForm(qw422016, filter)
-//line lib/promscrape/targetstatus.qtpl:88
+//line lib/promscrape/targetstatus.qtpl:87
 	qw422016.N().S(`<hr />`)
-//line lib/promscrape/targetstatus.qtpl:90
+//line lib/promscrape/targetstatus.qtpl:89
 	streamtargetsTabs(qw422016, tsr, filter, "discoveredTargets")
-//line lib/promscrape/targetstatus.qtpl:90
+//line lib/promscrape/targetstatus.qtpl:89
 	qw422016.N().S(`</main></div></div></body></html>`)
-//line lib/promscrape/targetstatus.qtpl:96
+//line lib/promscrape/targetstatus.qtpl:95
 }
 
-//line lib/promscrape/targetstatus.qtpl:96
+//line lib/promscrape/targetstatus.qtpl:95
 func WriteServiceDiscoveryResponse(qq422016 qtio422016.Writer, tsr *targetsStatusResult, filter *requestFilter) {
-//line lib/promscrape/targetstatus.qtpl:96
+//line lib/promscrape/targetstatus.qtpl:95
 	qw422016 := qt422016.AcquireWriter(qq422016)
-//line lib/promscrape/targetstatus.qtpl:96
+//line lib/promscrape/targetstatus.qtpl:95
 	StreamServiceDiscoveryResponse(qw422016, tsr, filter)
-//line lib/promscrape/targetstatus.qtpl:96
+//line lib/promscrape/targetstatus.qtpl:95
 	qt422016.ReleaseWriter(qw422016)
-//line lib/promscrape/targetstatus.qtpl:96
+//line lib/promscrape/targetstatus.qtpl:95
 }
 
-//line lib/promscrape/targetstatus.qtpl:96
+//line lib/promscrape/targetstatus.qtpl:95
 func ServiceDiscoveryResponse(tsr *targetsStatusResult, filter *requestFilter) string {
-//line lib/promscrape/targetstatus.qtpl:96
+//line lib/promscrape/targetstatus.qtpl:95
 	qb422016 := qt422016.AcquireByteBuffer()
-//line lib/promscrape/targetstatus.qtpl:96
+//line lib/promscrape/targetstatus.qtpl:95
 	WriteServiceDiscoveryResponse(qb422016, tsr, filter)
-//line lib/promscrape/targetstatus.qtpl:96
+//line lib/promscrape/targetstatus.qtpl:95
 	qs422016 := string(qb422016.B)
-//line lib/promscrape/targetstatus.qtpl:96
+//line lib/promscrape/targetstatus.qtpl:95
 	qt422016.ReleaseByteBuffer(qb422016)
-//line lib/promscrape/targetstatus.qtpl:96
+//line lib/promscrape/targetstatus.qtpl:95
 	return qs422016
-//line lib/promscrape/targetstatus.qtpl:96
+//line lib/promscrape/targetstatus.qtpl:95
 }
 
-//line lib/promscrape/targetstatus.qtpl:98
+//line lib/promscrape/targetstatus.qtpl:97
 func streamfiltersForm(qw422016 *qt422016.Writer, filter *requestFilter) {
-//line lib/promscrape/targetstatus.qtpl:98
+//line lib/promscrape/targetstatus.qtpl:97
 	qw422016.N().S(`<div class="row g-3 align-items-center mb-3"><div class="col-auto"><button id="all-btn" type="button" class="btn`)
-//line lib/promscrape/targetstatus.qtpl:101
+//line lib/promscrape/targetstatus.qtpl:100
 	qw422016.N().S(` `)
-//line lib/promscrape/targetstatus.qtpl:101
+//line lib/promscrape/targetstatus.qtpl:100
 	if !filter.showOnlyUnhealthy {
-//line lib/promscrape/targetstatus.qtpl:101
+//line lib/promscrape/targetstatus.qtpl:100
 		qw422016.N().S(`btn-secondary`)
-//line lib/promscrape/targetstatus.qtpl:101
+//line lib/promscrape/targetstatus.qtpl:100
 	} else {
-//line lib/promscrape/targetstatus.qtpl:101
+//line lib/promscrape/targetstatus.qtpl:100
 		qw422016.N().S(`btn-success`)
-//line lib/promscrape/targetstatus.qtpl:101
+//line lib/promscrape/targetstatus.qtpl:100
 	}
-//line lib/promscrape/targetstatus.qtpl:101
+//line lib/promscrape/targetstatus.qtpl:100
 	qw422016.N().S(`"onclick="location.href='?`)
-//line lib/promscrape/targetstatus.qtpl:102
+//line lib/promscrape/targetstatus.qtpl:101
 	streamqueryArgs(qw422016, filter, map[string]string{"show_only_unhealthy": "false"})
-//line lib/promscrape/targetstatus.qtpl:102
+//line lib/promscrape/targetstatus.qtpl:101
 	qw422016.N().S(`'">All</button></div><div class="col-auto"><button id="unhealthy-btn" type="button" class="btn`)
-//line lib/promscrape/targetstatus.qtpl:107
+//line lib/promscrape/targetstatus.qtpl:106
 	qw422016.N().S(` `)
-//line lib/promscrape/targetstatus.qtpl:107
+//line lib/promscrape/targetstatus.qtpl:106
 	if filter.showOnlyUnhealthy {
-//line lib/promscrape/targetstatus.qtpl:107
+//line lib/promscrape/targetstatus.qtpl:106
 		qw422016.N().S(`btn-secondary`)
-//line lib/promscrape/targetstatus.qtpl:107
+//line lib/promscrape/targetstatus.qtpl:106
 	} else {
-//line lib/promscrape/targetstatus.qtpl:107
+//line lib/promscrape/targetstatus.qtpl:106
 		qw422016.N().S(`btn-danger`)
-//line lib/promscrape/targetstatus.qtpl:107
+//line lib/promscrape/targetstatus.qtpl:106
 	}
-//line lib/promscrape/targetstatus.qtpl:107
+//line lib/promscrape/targetstatus.qtpl:106
 	qw422016.N().S(`"onclick="location.href='?`)
-//line lib/promscrape/targetstatus.qtpl:108
+//line lib/promscrape/targetstatus.qtpl:107
 	streamqueryArgs(qw422016, filter, map[string]string{"show_only_unhealthy": "true"})
-//line lib/promscrape/targetstatus.qtpl:108
+//line lib/promscrape/targetstatus.qtpl:107
 	qw422016.N().S(`'">Unhealthy</button></div><div class="col-auto"><button type="button" class="btn btn-primary" onclick="document.querySelectorAll('.scrape-job').forEach((el) => { el.style.display = 'none'; })">Collapse all</button></div><div class="col-auto"><button type="button" class="btn btn-secondary" onclick="document.querySelectorAll('.scrape-job').forEach((el) => { el.style.display = 'block'; })">Expand all</button></div><div class="col-auto"><button type="button" class="btn btn-success" onclick="document.getElementById('filters').style.display='block'">Filter targets</button></div></div><div id="filters"`)
-//line lib/promscrape/targetstatus.qtpl:128
+//line lib/promscrape/targetstatus.qtpl:127
 	if filter.endpointSearch == "" && filter.labelSearch == "" {
-//line lib/promscrape/targetstatus.qtpl:128
+//line lib/promscrape/targetstatus.qtpl:127
 		qw422016.N().S(`style="display:none"`)
-//line lib/promscrape/targetstatus.qtpl:128
+//line lib/promscrape/targetstatus.qtpl:127
 	}
-//line lib/promscrape/targetstatus.qtpl:128
+//line lib/promscrape/targetstatus.qtpl:127
 	qw422016.N().S(`><form class="form-horizontal"><div class="form-group mb-3"><label for="endpoint_search" class="col-sm-10 control-label">Endpoint filter (<a target="_blank" href="https://github.com/google/re2/wiki/Syntax">Regexp</a> is accepted)</label><div class="col-sm-10"><input type="text" id="endpoint_search" name="endpoint_search"placeholder="For example, 127.0.0.1" class="form-control" value="`)
-//line lib/promscrape/targetstatus.qtpl:134
+//line lib/promscrape/targetstatus.qtpl:133
 	qw422016.E().S(filter.endpointSearch)
-//line lib/promscrape/targetstatus.qtpl:134
+//line lib/promscrape/targetstatus.qtpl:133
 	qw422016.N().S(`"/></div></div><div class="form-group mb-3"><label for="label_search" class="col-sm-10 control-label">Labels filter (<a target="_blank" href="https://prometheus.io/docs/prometheus/latest/querying/basics/#time-series-selectors">Arbitrary time series selectors</a> are accepted)</label><div class="col-sm-10"><input type="text" id="label_search" name="label_search"placeholder="For example, {instance=~'.+:9100'}" class="form-control" value="`)
-//line lib/promscrape/targetstatus.qtpl:141
+//line lib/promscrape/targetstatus.qtpl:140
 	qw422016.E().S(filter.labelSearch)
-//line lib/promscrape/targetstatus.qtpl:141
+//line lib/promscrape/targetstatus.qtpl:140
 	qw422016.N().S(`"/></div></div><input type="hidden" name="show_only_unhealthy" value="`)
-//line lib/promscrape/targetstatus.qtpl:144
+//line lib/promscrape/targetstatus.qtpl:143
 	qw422016.E().V(filter.showOnlyUnhealthy)
-//line lib/promscrape/targetstatus.qtpl:144
+//line lib/promscrape/targetstatus.qtpl:143
 	qw422016.N().S(`"/><input type="hidden" name="show_original_labels" value="`)
-//line lib/promscrape/targetstatus.qtpl:145
+//line lib/promscrape/targetstatus.qtpl:144
 	qw422016.E().V(filter.showOriginalLabels)
-//line lib/promscrape/targetstatus.qtpl:145
+//line lib/promscrape/targetstatus.qtpl:144
 	qw422016.N().S(`"/><button type="submit" class="btn btn-success mb-3">Submit</button><button type="button" class="btn btn-danger mb-3" onclick="location.href='?'">Clear target filters</button></form></div>`)
-//line lib/promscrape/targetstatus.qtpl:150
+//line lib/promscrape/targetstatus.qtpl:149
 }
 
-//line lib/promscrape/targetstatus.qtpl:150
+//line lib/promscrape/targetstatus.qtpl:149
 func writefiltersForm(qq422016 qtio422016.Writer, filter *requestFilter) {
-//line lib/promscrape/targetstatus.qtpl:150
+//line lib/promscrape/targetstatus.qtpl:149
 	qw422016 := qt422016.AcquireWriter(qq422016)
-//line lib/promscrape/targetstatus.qtpl:150
+//line lib/promscrape/targetstatus.qtpl:149
 	streamfiltersForm(qw422016, filter)
-//line lib/promscrape/targetstatus.qtpl:150
+//line lib/promscrape/targetstatus.qtpl:149
 	qt422016.ReleaseWriter(qw422016)
-//line lib/promscrape/targetstatus.qtpl:150
+//line lib/promscrape/targetstatus.qtpl:149
 }
 
-//line lib/promscrape/targetstatus.qtpl:150
+//line lib/promscrape/targetstatus.qtpl:149
 func filtersForm(filter *requestFilter) string {
-//line lib/promscrape/targetstatus.qtpl:150
+//line lib/promscrape/targetstatus.qtpl:149
 	qb422016 := qt422016.AcquireByteBuffer()
-//line lib/promscrape/targetstatus.qtpl:150
+//line lib/promscrape/targetstatus.qtpl:149
 	writefiltersForm(qb422016, filter)
-//line lib/promscrape/targetstatus.qtpl:150
+//line lib/promscrape/targetstatus.qtpl:149
 	qs422016 := string(qb422016.B)
-//line lib/promscrape/targetstatus.qtpl:150
+//line lib/promscrape/targetstatus.qtpl:149
 	qt422016.ReleaseByteBuffer(qb422016)
-//line lib/promscrape/targetstatus.qtpl:150
+//line lib/promscrape/targetstatus.qtpl:149
 	return qs422016
-//line lib/promscrape/targetstatus.qtpl:150
+//line lib/promscrape/targetstatus.qtpl:149
 }
 
-//line lib/promscrape/targetstatus.qtpl:152
+//line lib/promscrape/targetstatus.qtpl:151
 func streamtargetsTabs(qw422016 *qt422016.Writer, tsr *targetsStatusResult, filter *requestFilter, activeTab string) {
-//line lib/promscrape/targetstatus.qtpl:152
+//line lib/promscrape/targetstatus.qtpl:151
 	qw422016.N().S(`<ul class="nav nav-tabs" id="myTab" role="tablist"><li class="nav-item" role="presentation"><button class="nav-link`)
-//line lib/promscrape/targetstatus.qtpl:155
+//line lib/promscrape/targetstatus.qtpl:154
 	if activeTab == "scrapeTargets" {
-//line lib/promscrape/targetstatus.qtpl:155
+//line lib/promscrape/targetstatus.qtpl:154
 		qw422016.N().S(` `)
-//line lib/promscrape/targetstatus.qtpl:155
+//line lib/promscrape/targetstatus.qtpl:154
 		qw422016.N().S(`active`)
-//line lib/promscrape/targetstatus.qtpl:155
+//line lib/promscrape/targetstatus.qtpl:154
 	}
-//line lib/promscrape/targetstatus.qtpl:155
+//line lib/promscrape/targetstatus.qtpl:154
 	qw422016.N().S(`" type="button" role="tab"onclick="location.href='targets?`)
-//line lib/promscrape/targetstatus.qtpl:156
+//line lib/promscrape/targetstatus.qtpl:155
 	streamqueryArgs(qw422016, filter, nil)
-//line lib/promscrape/targetstatus.qtpl:156
+//line lib/promscrape/targetstatus.qtpl:155
 	qw422016.N().S(`'">Active targets</button></li><li class="nav-item" role="presentation"><button class="nav-link`)
-//line lib/promscrape/targetstatus.qtpl:161
+//line lib/promscrape/targetstatus.qtpl:160
 	if activeTab == "discoveredTargets" {
-//line lib/promscrape/targetstatus.qtpl:161
+//line lib/promscrape/targetstatus.qtpl:160
 		qw422016.N().S(` `)
-//line lib/promscrape/targetstatus.qtpl:161
+//line lib/promscrape/targetstatus.qtpl:160
 		qw422016.N().S(`active`)
-//line lib/promscrape/targetstatus.qtpl:161
+//line lib/promscrape/targetstatus.qtpl:160
 	}
-//line lib/promscrape/targetstatus.qtpl:161
+//line lib/promscrape/targetstatus.qtpl:160
 	qw422016.N().S(`" type="button" role="tab"onclick="location.href='service-discovery?`)
-//line lib/promscrape/targetstatus.qtpl:162
+//line lib/promscrape/targetstatus.qtpl:161
 	streamqueryArgs(qw422016, filter, nil)
-//line lib/promscrape/targetstatus.qtpl:162
+//line lib/promscrape/targetstatus.qtpl:161
 	qw422016.N().S(`'">Discovered targets</button></li></ul><div class="tab-content"><div class="tab-pane active" role="tabpanel">`)
-//line lib/promscrape/targetstatus.qtpl:169
+//line lib/promscrape/targetstatus.qtpl:168
 	switch activeTab {
-//line lib/promscrape/targetstatus.qtpl:170
+//line lib/promscrape/targetstatus.qtpl:169
 	case "scrapeTargets":
-//line lib/promscrape/targetstatus.qtpl:171
+//line lib/promscrape/targetstatus.qtpl:170
 		streamscrapeTargets(qw422016, tsr)
-//line lib/promscrape/targetstatus.qtpl:172
+//line lib/promscrape/targetstatus.qtpl:171
 	case "discoveredTargets":
-//line lib/promscrape/targetstatus.qtpl:173
+//line lib/promscrape/targetstatus.qtpl:172
 		streamdiscoveredTargets(qw422016, tsr)
-//line lib/promscrape/targetstatus.qtpl:174
+//line lib/promscrape/targetstatus.qtpl:173
 	}
-//line lib/promscrape/targetstatus.qtpl:174
+//line lib/promscrape/targetstatus.qtpl:173
 	qw422016.N().S(`</div></div>`)
-//line lib/promscrape/targetstatus.qtpl:177
+//line lib/promscrape/targetstatus.qtpl:176
 }
 
-//line lib/promscrape/targetstatus.qtpl:177
+//line lib/promscrape/targetstatus.qtpl:176
 func writetargetsTabs(qq422016 qtio422016.Writer, tsr *targetsStatusResult, filter *requestFilter, activeTab string) {
-//line lib/promscrape/targetstatus.qtpl:177
+//line lib/promscrape/targetstatus.qtpl:176
 	qw422016 := qt422016.AcquireWriter(qq422016)
-//line lib/promscrape/targetstatus.qtpl:177
+//line lib/promscrape/targetstatus.qtpl:176
 	streamtargetsTabs(qw422016, tsr, filter, activeTab)
-//line lib/promscrape/targetstatus.qtpl:177
+//line lib/promscrape/targetstatus.qtpl:176
 	qt422016.ReleaseWriter(qw422016)
-//line lib/promscrape/targetstatus.qtpl:177
+//line lib/promscrape/targetstatus.qtpl:176
 }
 
-//line lib/promscrape/targetstatus.qtpl:177
+//line lib/promscrape/targetstatus.qtpl:176
 func targetsTabs(tsr *targetsStatusResult, filter *requestFilter, activeTab string) string {
-//line lib/promscrape/targetstatus.qtpl:177
+//line lib/promscrape/targetstatus.qtpl:176
 	qb422016 := qt422016.AcquireByteBuffer()
-//line lib/promscrape/targetstatus.qtpl:177
+//line lib/promscrape/targetstatus.qtpl:176
 	writetargetsTabs(qb422016, tsr, filter, activeTab)
-//line lib/promscrape/targetstatus.qtpl:177
+//line lib/promscrape/targetstatus.qtpl:176
 	qs422016 := string(qb422016.B)
-//line lib/promscrape/targetstatus.qtpl:177
+//line lib/promscrape/targetstatus.qtpl:176
 	qt422016.ReleaseByteBuffer(qb422016)
-//line lib/promscrape/targetstatus.qtpl:177
+//line lib/promscrape/targetstatus.qtpl:176
 	return qs422016
-//line lib/promscrape/targetstatus.qtpl:177
+//line lib/promscrape/targetstatus.qtpl:176
 }
 
-//line lib/promscrape/targetstatus.qtpl:179
+//line lib/promscrape/targetstatus.qtpl:178
 func streamscrapeTargets(qw422016 *qt422016.Writer, tsr *targetsStatusResult) {
-//line lib/promscrape/targetstatus.qtpl:179
+//line lib/promscrape/targetstatus.qtpl:178
 	qw422016.N().S(`<div class="row mt-4"><div class="col-12">`)
-//line lib/promscrape/targetstatus.qtpl:182
+//line lib/promscrape/targetstatus.qtpl:181
 	for i, jts := range tsr.jobTargetsStatuses {
-//line lib/promscrape/targetstatus.qtpl:183
+//line lib/promscrape/targetstatus.qtpl:182
 		streamscrapeJobTargets(qw422016, i, jts, tsr.hasOriginalLabels)
-//line lib/promscrape/targetstatus.qtpl:184
+//line lib/promscrape/targetstatus.qtpl:183
 	}
-//line lib/promscrape/targetstatus.qtpl:185
+//line lib/promscrape/targetstatus.qtpl:184
 	for i, jobName := range tsr.emptyJobs {
-//line lib/promscrape/targetstatus.qtpl:187
+//line lib/promscrape/targetstatus.qtpl:186
 		num := i + len(tsr.jobTargetsStatuses)
 		jts := &jobTargetsStatuses{
 			jobName: jobName,
 		}
 
-//line lib/promscrape/targetstatus.qtpl:192
+//line lib/promscrape/targetstatus.qtpl:191
 		streamscrapeJobTargets(qw422016, num, jts, tsr.hasOriginalLabels)
-//line lib/promscrape/targetstatus.qtpl:193
+//line lib/promscrape/targetstatus.qtpl:192
 	}
-//line lib/promscrape/targetstatus.qtpl:193
+//line lib/promscrape/targetstatus.qtpl:192
 	qw422016.N().S(`</div></div>`)
-//line lib/promscrape/targetstatus.qtpl:196
+//line lib/promscrape/targetstatus.qtpl:195
 }
 
-//line lib/promscrape/targetstatus.qtpl:196
+//line lib/promscrape/targetstatus.qtpl:195
 func writescrapeTargets(qq422016 qtio422016.Writer, tsr *targetsStatusResult) {
-//line lib/promscrape/targetstatus.qtpl:196
+//line lib/promscrape/targetstatus.qtpl:195
 	qw422016 := qt422016.AcquireWriter(qq422016)
-//line lib/promscrape/targetstatus.qtpl:196
+//line lib/promscrape/targetstatus.qtpl:195
 	streamscrapeTargets(qw422016, tsr)
-//line lib/promscrape/targetstatus.qtpl:196
+//line lib/promscrape/targetstatus.qtpl:195
 	qt422016.ReleaseWriter(qw422016)
-//line lib/promscrape/targetstatus.qtpl:196
+//line lib/promscrape/targetstatus.qtpl:195
 }
 
-//line lib/promscrape/targetstatus.qtpl:196
+//line lib/promscrape/targetstatus.qtpl:195
 func scrapeTargets(tsr *targetsStatusResult) string {
-//line lib/promscrape/targetstatus.qtpl:196
+//line lib/promscrape/targetstatus.qtpl:195
 	qb422016 := qt422016.AcquireByteBuffer()
-//line lib/promscrape/targetstatus.qtpl:196
+//line lib/promscrape/targetstatus.qtpl:195
 	writescrapeTargets(qb422016, tsr)
-//line lib/promscrape/targetstatus.qtpl:196
+//line lib/promscrape/targetstatus.qtpl:195
 	qs422016 := string(qb422016.B)
-//line lib/promscrape/targetstatus.qtpl:196
+//line lib/promscrape/targetstatus.qtpl:195
 	qt422016.ReleaseByteBuffer(qb422016)
-//line lib/promscrape/targetstatus.qtpl:196
+//line lib/promscrape/targetstatus.qtpl:195
 	return qs422016
-//line lib/promscrape/targetstatus.qtpl:196
+//line lib/promscrape/targetstatus.qtpl:195
 }
 
-//line lib/promscrape/targetstatus.qtpl:198
+//line lib/promscrape/targetstatus.qtpl:197
 func streamscrapeJobTargets(qw422016 *qt422016.Writer, num int, jts *jobTargetsStatuses, hasOriginalLabels bool) {
-//line lib/promscrape/targetstatus.qtpl:198
+//line lib/promscrape/targetstatus.qtpl:197
 	qw422016.N().S(`<div class="row mb-4"><div class="col-12"><h4><span class="me-2">`)
-//line lib/promscrape/targetstatus.qtpl:202
+//line lib/promscrape/targetstatus.qtpl:201
 	qw422016.E().S(jts.jobName)
-//line lib/promscrape/targetstatus.qtpl:202
+//line lib/promscrape/targetstatus.qtpl:201
 	qw422016.N().S(` `)
-//line lib/promscrape/targetstatus.qtpl:202
+//line lib/promscrape/targetstatus.qtpl:201
 	qw422016.N().S(`(`)
-//line lib/promscrape/targetstatus.qtpl:202
+//line lib/promscrape/targetstatus.qtpl:201
 	qw422016.N().D(jts.upCount)
-//line lib/promscrape/targetstatus.qtpl:202
+//line lib/promscrape/targetstatus.qtpl:201
 	qw422016.N().S(`/`)
-//line lib/promscrape/targetstatus.qtpl:202
+//line lib/promscrape/targetstatus.qtpl:201
 	qw422016.N().D(jts.targetsTotal)
-//line lib/promscrape/targetstatus.qtpl:202
+//line lib/promscrape/targetstatus.qtpl:201
 	qw422016.N().S(` `)
-//line lib/promscrape/targetstatus.qtpl:202
+//line lib/promscrape/targetstatus.qtpl:201
 	qw422016.N().S(`up)</span>`)
-//line lib/promscrape/targetstatus.qtpl:203
+//line lib/promscrape/targetstatus.qtpl:202
 	streamshowHideScrapeJobButtons(qw422016, num)
-//line lib/promscrape/targetstatus.qtpl:203
+//line lib/promscrape/targetstatus.qtpl:202
 	qw422016.N().S(`</h4><div id="scrape-job-`)
-//line lib/promscrape/targetstatus.qtpl:205
+//line lib/promscrape/targetstatus.qtpl:204
 	qw422016.N().D(num)
-//line lib/promscrape/targetstatus.qtpl:205
+//line lib/promscrape/targetstatus.qtpl:204
 	qw422016.N().S(`" class="scrape-job table-responsive"><table class="table table-striped table-hover table-bordered table-sm"><thead><tr><th scope="col">Endpoint</th><th scope="col">State</th><th scope="col" title="target labels">Labels</th>`)
-//line lib/promscrape/targetstatus.qtpl:212
+//line lib/promscrape/targetstatus.qtpl:211
 	if hasOriginalLabels {
-//line lib/promscrape/targetstatus.qtpl:212
+//line lib/promscrape/targetstatus.qtpl:211
 		qw422016.N().S(`<th scope="col" title="debug relabeling">Debug relabeling</th>`)
-//line lib/promscrape/targetstatus.qtpl:214
+//line lib/promscrape/targetstatus.qtpl:213
 	}
-//line lib/promscrape/targetstatus.qtpl:214
+//line lib/promscrape/targetstatus.qtpl:213
 	qw422016.N().S(`<th scope="col" title="total scrapes">Scrapes</th><th scope="col" title="total scrape errors">Errors</th><th scope="col" title="the time of the last scrape">Last Scrape</th><th scope="col" title="the duration of the last scrape">Duration</th><th scope="col" title="the number of metrics scraped during the last scrape">Samples</th><th scope="col" title="error from the last scrape (if any)">Last error</th></tr></thead><tbody>`)
-//line lib/promscrape/targetstatus.qtpl:224
+//line lib/promscrape/targetstatus.qtpl:223
 	for _, ts := range jts.targetsStatus {
-//line lib/promscrape/targetstatus.qtpl:226
+//line lib/promscrape/targetstatus.qtpl:225
 		endpoint := ts.sw.Config.ScrapeURL
 		originalLabels := ts.sw.Config.OriginalLabels
 
 		// The target is uniquely identified by a pointer to its original labels.
 		targetID := getLabelsID(originalLabels)
-		lastScrapeDuration := ts.getDurationFromLastScrape()
 
-//line lib/promscrape/targetstatus.qtpl:232
+//line lib/promscrape/targetstatus.qtpl:230
 		qw422016.N().S(`<tr`)
-//line lib/promscrape/targetstatus.qtpl:233
+//line lib/promscrape/targetstatus.qtpl:231
 		if !ts.up {
-//line lib/promscrape/targetstatus.qtpl:233
+//line lib/promscrape/targetstatus.qtpl:231
 			qw422016.N().S(` `)
-//line lib/promscrape/targetstatus.qtpl:233
+//line lib/promscrape/targetstatus.qtpl:231
 			qw422016.N().S(`class="alert alert-danger" role="alert"`)
-//line lib/promscrape/targetstatus.qtpl:233
+//line lib/promscrape/targetstatus.qtpl:231
 		}
-//line lib/promscrape/targetstatus.qtpl:233
+//line lib/promscrape/targetstatus.qtpl:231
 		qw422016.N().S(`><td class="endpoint"><a href="`)
-//line lib/promscrape/targetstatus.qtpl:235
+//line lib/promscrape/targetstatus.qtpl:233
 		qw422016.E().S(endpoint)
-//line lib/promscrape/targetstatus.qtpl:235
+//line lib/promscrape/targetstatus.qtpl:233
 		qw422016.N().S(`" target="_blank">`)
-//line lib/promscrape/targetstatus.qtpl:235
+//line lib/promscrape/targetstatus.qtpl:233
 		qw422016.E().S(endpoint)
-//line lib/promscrape/targetstatus.qtpl:235
+//line lib/promscrape/targetstatus.qtpl:233
 		qw422016.N().S(`</a>`)
-//line lib/promscrape/targetstatus.qtpl:236
+//line lib/promscrape/targetstatus.qtpl:234
 		if hasOriginalLabels {
-//line lib/promscrape/targetstatus.qtpl:237
+//line lib/promscrape/targetstatus.qtpl:235
 			qw422016.N().S(` `)
-//line lib/promscrape/targetstatus.qtpl:237
+//line lib/promscrape/targetstatus.qtpl:235
 			qw422016.N().S(`(<a href="target_response?id=`)
-//line lib/promscrape/targetstatus.qtpl:238
+//line lib/promscrape/targetstatus.qtpl:236
 			qw422016.E().S(targetID)
-//line lib/promscrape/targetstatus.qtpl:238
+//line lib/promscrape/targetstatus.qtpl:236
 			qw422016.N().S(`" target="_blank"title="click to fetch target response on behalf of the scraper">response</a>)`)
-//line lib/promscrape/targetstatus.qtpl:240
+//line lib/promscrape/targetstatus.qtpl:238
 		}
-//line lib/promscrape/targetstatus.qtpl:240
+//line lib/promscrape/targetstatus.qtpl:238
 		qw422016.N().S(`</td><td>`)
-//line lib/promscrape/targetstatus.qtpl:243
+//line lib/promscrape/targetstatus.qtpl:241
 		if ts.up {
-//line lib/promscrape/targetstatus.qtpl:243
+//line lib/promscrape/targetstatus.qtpl:241
 			qw422016.N().S(`<span class="badge bg-success">UP</span>`)
-//line lib/promscrape/targetstatus.qtpl:245
+//line lib/promscrape/targetstatus.qtpl:243
 		} else {
-//line lib/promscrape/targetstatus.qtpl:245
+//line lib/promscrape/targetstatus.qtpl:243
 			qw422016.N().S(`<span class="badge bg-danger">DOWN</span>`)
-//line lib/promscrape/targetstatus.qtpl:247
+//line lib/promscrape/targetstatus.qtpl:245
 		}
-//line lib/promscrape/targetstatus.qtpl:247
+//line lib/promscrape/targetstatus.qtpl:245
 		qw422016.N().S(`</td><td class="labels"><div`)
-//line lib/promscrape/targetstatus.qtpl:251
+//line lib/promscrape/targetstatus.qtpl:249
 		if hasOriginalLabels {
-//line lib/promscrape/targetstatus.qtpl:252
+//line lib/promscrape/targetstatus.qtpl:250
 			qw422016.N().S(` `)
-//line lib/promscrape/targetstatus.qtpl:252
+//line lib/promscrape/targetstatus.qtpl:250
 			qw422016.N().S(`title="click to show original labels"onclick="document.getElementById('original-labels-`)
-//line lib/promscrape/targetstatus.qtpl:253
+//line lib/promscrape/targetstatus.qtpl:251
 			qw422016.E().S(targetID)
-//line lib/promscrape/targetstatus.qtpl:253
+//line lib/promscrape/targetstatus.qtpl:251
 			qw422016.N().S(`').style.display='block'"`)
-//line lib/promscrape/targetstatus.qtpl:254
+//line lib/promscrape/targetstatus.qtpl:252
 		}
-//line lib/promscrape/targetstatus.qtpl:254
+//line lib/promscrape/targetstatus.qtpl:252
 		qw422016.N().S(`>`)
-//line lib/promscrape/targetstatus.qtpl:256
+//line lib/promscrape/targetstatus.qtpl:254
 		streamformatLabels(qw422016, ts.sw.Config.Labels)
-//line lib/promscrape/targetstatus.qtpl:256
+//line lib/promscrape/targetstatus.qtpl:254
 		qw422016.N().S(`</div>`)
-//line lib/promscrape/targetstatus.qtpl:258
+//line lib/promscrape/targetstatus.qtpl:256
 		if hasOriginalLabels {
-//line lib/promscrape/targetstatus.qtpl:258
+//line lib/promscrape/targetstatus.qtpl:256
 			qw422016.N().S(`<div style="display:none" id="original-labels-`)
-//line lib/promscrape/targetstatus.qtpl:259
+//line lib/promscrape/targetstatus.qtpl:257
 			qw422016.E().S(targetID)
-//line lib/promscrape/targetstatus.qtpl:259
+//line lib/promscrape/targetstatus.qtpl:257
 			qw422016.N().S(`">`)
-//line lib/promscrape/targetstatus.qtpl:260
+//line lib/promscrape/targetstatus.qtpl:258
 			streamformatLabels(qw422016, originalLabels)
-//line lib/promscrape/targetstatus.qtpl:260
+//line lib/promscrape/targetstatus.qtpl:258
 			qw422016.N().S(`</div>`)
-//line lib/promscrape/targetstatus.qtpl:262
+//line lib/promscrape/targetstatus.qtpl:260
 		}
-//line lib/promscrape/targetstatus.qtpl:262
+//line lib/promscrape/targetstatus.qtpl:260
 		qw422016.N().S(`</td>`)
-//line lib/promscrape/targetstatus.qtpl:264
+//line lib/promscrape/targetstatus.qtpl:262
 		if hasOriginalLabels {
-//line lib/promscrape/targetstatus.qtpl:264
+//line lib/promscrape/targetstatus.qtpl:262
 			qw422016.N().S(`<td><a href="target-relabel-debug?id=`)
-//line lib/promscrape/targetstatus.qtpl:266
+//line lib/promscrape/targetstatus.qtpl:264
 			qw422016.E().S(targetID)
-//line lib/promscrape/targetstatus.qtpl:266
+//line lib/promscrape/targetstatus.qtpl:264
 			qw422016.N().S(`" target="_blank">target</a>`)
-//line lib/promscrape/targetstatus.qtpl:266
+//line lib/promscrape/targetstatus.qtpl:264
 			qw422016.N().S(` `)
-//line lib/promscrape/targetstatus.qtpl:266
+//line lib/promscrape/targetstatus.qtpl:264
 			qw422016.N().S(`<a href="metric-relabel-debug?id=`)
-//line lib/promscrape/targetstatus.qtpl:267
+//line lib/promscrape/targetstatus.qtpl:265
 			qw422016.E().S(targetID)
-//line lib/promscrape/targetstatus.qtpl:267
+//line lib/promscrape/targetstatus.qtpl:265
 			qw422016.N().S(`" target="_blank">metrics</a></td>`)
-//line lib/promscrape/targetstatus.qtpl:269
+//line lib/promscrape/targetstatus.qtpl:267
 		}
-//line lib/promscrape/targetstatus.qtpl:269
+//line lib/promscrape/targetstatus.qtpl:267
 		qw422016.N().S(`<td>`)
-//line lib/promscrape/targetstatus.qtpl:270
+//line lib/promscrape/targetstatus.qtpl:268
 		qw422016.N().D(ts.scrapesTotal)
-//line lib/promscrape/targetstatus.qtpl:270
+//line lib/promscrape/targetstatus.qtpl:268
 		qw422016.N().S(`</td><td>`)
-//line lib/promscrape/targetstatus.qtpl:271
+//line lib/promscrape/targetstatus.qtpl:269
 		qw422016.N().D(ts.scrapesFailed)
+//line lib/promscrape/targetstatus.qtpl:269
+		qw422016.N().S(`</td><td>`)
+//line lib/promscrape/targetstatus.qtpl:270
+		qw422016.E().S(ts.getDurationFromLastScrape())
+//line lib/promscrape/targetstatus.qtpl:270
+		qw422016.N().S(`<td>`)
 //line lib/promscrape/targetstatus.qtpl:271
+		qw422016.N().D(int(ts.scrapeDuration))
+//line lib/promscrape/targetstatus.qtpl:271
+		qw422016.N().S(`ms</td><td>`)
+//line lib/promscrape/targetstatus.qtpl:272
+		qw422016.N().D(ts.samplesScraped)
+//line lib/promscrape/targetstatus.qtpl:272
 		qw422016.N().S(`</td><td>`)
 //line lib/promscrape/targetstatus.qtpl:273
-		if lastScrapeDuration < 365*24*time.Hour {
-//line lib/promscrape/targetstatus.qtpl:274
-			qw422016.N().D(int(lastScrapeDuration.Milliseconds()))
-//line lib/promscrape/targetstatus.qtpl:274
-			qw422016.N().S(`ms ago`)
-//line lib/promscrape/targetstatus.qtpl:275
-		} else {
-//line lib/promscrape/targetstatus.qtpl:275
-			qw422016.N().S(`none`)
-//line lib/promscrape/targetstatus.qtpl:277
-		}
-//line lib/promscrape/targetstatus.qtpl:277
-		qw422016.N().S(`<td>`)
-//line lib/promscrape/targetstatus.qtpl:278
-		qw422016.N().D(int(ts.scrapeDuration))
-//line lib/promscrape/targetstatus.qtpl:278
-		qw422016.N().S(`ms</td><td>`)
-//line lib/promscrape/targetstatus.qtpl:279
-		qw422016.N().D(ts.samplesScraped)
-//line lib/promscrape/targetstatus.qtpl:279
-		qw422016.N().S(`</td><td>`)
-//line lib/promscrape/targetstatus.qtpl:280
 		if ts.err != nil {
-//line lib/promscrape/targetstatus.qtpl:280
+//line lib/promscrape/targetstatus.qtpl:273
 			qw422016.E().S(ts.err.Error())
-//line lib/promscrape/targetstatus.qtpl:280
+//line lib/promscrape/targetstatus.qtpl:273
 		}
-//line lib/promscrape/targetstatus.qtpl:280
+//line lib/promscrape/targetstatus.qtpl:273
 		qw422016.N().S(`</td></tr>`)
-//line lib/promscrape/targetstatus.qtpl:282
+//line lib/promscrape/targetstatus.qtpl:275
 	}
-//line lib/promscrape/targetstatus.qtpl:282
+//line lib/promscrape/targetstatus.qtpl:275
 	qw422016.N().S(`</tbody></table></div></div></div>`)
-//line lib/promscrape/targetstatus.qtpl:288
+//line lib/promscrape/targetstatus.qtpl:281
 }
 
-//line lib/promscrape/targetstatus.qtpl:288
+//line lib/promscrape/targetstatus.qtpl:281
 func writescrapeJobTargets(qq422016 qtio422016.Writer, num int, jts *jobTargetsStatuses, hasOriginalLabels bool) {
-//line lib/promscrape/targetstatus.qtpl:288
+//line lib/promscrape/targetstatus.qtpl:281
 	qw422016 := qt422016.AcquireWriter(qq422016)
-//line lib/promscrape/targetstatus.qtpl:288
+//line lib/promscrape/targetstatus.qtpl:281
 	streamscrapeJobTargets(qw422016, num, jts, hasOriginalLabels)
-//line lib/promscrape/targetstatus.qtpl:288
+//line lib/promscrape/targetstatus.qtpl:281
 	qt422016.ReleaseWriter(qw422016)
-//line lib/promscrape/targetstatus.qtpl:288
+//line lib/promscrape/targetstatus.qtpl:281
 }
 
-//line lib/promscrape/targetstatus.qtpl:288
+//line lib/promscrape/targetstatus.qtpl:281
 func scrapeJobTargets(num int, jts *jobTargetsStatuses, hasOriginalLabels bool) string {
-//line lib/promscrape/targetstatus.qtpl:288
+//line lib/promscrape/targetstatus.qtpl:281
 	qb422016 := qt422016.AcquireByteBuffer()
-//line lib/promscrape/targetstatus.qtpl:288
+//line lib/promscrape/targetstatus.qtpl:281
 	writescrapeJobTargets(qb422016, num, jts, hasOriginalLabels)
-//line lib/promscrape/targetstatus.qtpl:288
+//line lib/promscrape/targetstatus.qtpl:281
 	qs422016 := string(qb422016.B)
-//line lib/promscrape/targetstatus.qtpl:288
+//line lib/promscrape/targetstatus.qtpl:281
 	qt422016.ReleaseByteBuffer(qb422016)
-//line lib/promscrape/targetstatus.qtpl:288
+//line lib/promscrape/targetstatus.qtpl:281
 	return qs422016
-//line lib/promscrape/targetstatus.qtpl:288
+//line lib/promscrape/targetstatus.qtpl:281
 }
 
-//line lib/promscrape/targetstatus.qtpl:290
+//line lib/promscrape/targetstatus.qtpl:283
 func streamdiscoveredTargets(qw422016 *qt422016.Writer, tsr *targetsStatusResult) {
-//line lib/promscrape/targetstatus.qtpl:291
+//line lib/promscrape/targetstatus.qtpl:284
 	if !tsr.hasOriginalLabels {
-//line lib/promscrape/targetstatus.qtpl:291
+//line lib/promscrape/targetstatus.qtpl:284
 		qw422016.N().S(`Discovered targets are unavailable when -promscrape.dropOriginalLabels command-line flag is set`)
-//line lib/promscrape/targetstatus.qtpl:293
+//line lib/promscrape/targetstatus.qtpl:286
 		return
-//line lib/promscrape/targetstatus.qtpl:294
+//line lib/promscrape/targetstatus.qtpl:287
 	}
-//line lib/promscrape/targetstatus.qtpl:296
+//line lib/promscrape/targetstatus.qtpl:289
 	tljs := tsr.getTargetLabelsByJob()
 
-//line lib/promscrape/targetstatus.qtpl:296
+//line lib/promscrape/targetstatus.qtpl:289
 	qw422016.N().S(`<div class="row mt-4"><div class="col-12">`)
-//line lib/promscrape/targetstatus.qtpl:299
+//line lib/promscrape/targetstatus.qtpl:292
 	for i, tlj := range tljs {
-//line lib/promscrape/targetstatus.qtpl:300
+//line lib/promscrape/targetstatus.qtpl:293
 		streamdiscoveredJobTargets(qw422016, i, tlj)
-//line lib/promscrape/targetstatus.qtpl:301
+//line lib/promscrape/targetstatus.qtpl:294
 	}
-//line lib/promscrape/targetstatus.qtpl:301
+//line lib/promscrape/targetstatus.qtpl:294
 	qw422016.N().S(`</div></div>`)
-//line lib/promscrape/targetstatus.qtpl:304
+//line lib/promscrape/targetstatus.qtpl:297
 }
 
-//line lib/promscrape/targetstatus.qtpl:304
+//line lib/promscrape/targetstatus.qtpl:297
 func writediscoveredTargets(qq422016 qtio422016.Writer, tsr *targetsStatusResult) {
-//line lib/promscrape/targetstatus.qtpl:304
+//line lib/promscrape/targetstatus.qtpl:297
 	qw422016 := qt422016.AcquireWriter(qq422016)
-//line lib/promscrape/targetstatus.qtpl:304
+//line lib/promscrape/targetstatus.qtpl:297
 	streamdiscoveredTargets(qw422016, tsr)
-//line lib/promscrape/targetstatus.qtpl:304
+//line lib/promscrape/targetstatus.qtpl:297
 	qt422016.ReleaseWriter(qw422016)
-//line lib/promscrape/targetstatus.qtpl:304
+//line lib/promscrape/targetstatus.qtpl:297
 }
 
-//line lib/promscrape/targetstatus.qtpl:304
+//line lib/promscrape/targetstatus.qtpl:297
 func discoveredTargets(tsr *targetsStatusResult) string {
-//line lib/promscrape/targetstatus.qtpl:304
+//line lib/promscrape/targetstatus.qtpl:297
 	qb422016 := qt422016.AcquireByteBuffer()
-//line lib/promscrape/targetstatus.qtpl:304
+//line lib/promscrape/targetstatus.qtpl:297
 	writediscoveredTargets(qb422016, tsr)
-//line lib/promscrape/targetstatus.qtpl:304
+//line lib/promscrape/targetstatus.qtpl:297
 	qs422016 := string(qb422016.B)
-//line lib/promscrape/targetstatus.qtpl:304
+//line lib/promscrape/targetstatus.qtpl:297
 	qt422016.ReleaseByteBuffer(qb422016)
-//line lib/promscrape/targetstatus.qtpl:304
+//line lib/promscrape/targetstatus.qtpl:297
 	return qs422016
-//line lib/promscrape/targetstatus.qtpl:304
+//line lib/promscrape/targetstatus.qtpl:297
 }
 
-//line lib/promscrape/targetstatus.qtpl:306
+//line lib/promscrape/targetstatus.qtpl:299
 func streamdiscoveredJobTargets(qw422016 *qt422016.Writer, num int, tlj *targetLabelsByJob) {
-//line lib/promscrape/targetstatus.qtpl:306
+//line lib/promscrape/targetstatus.qtpl:299
 	qw422016.N().S(`<h4><span class="me-2">`)
-//line lib/promscrape/targetstatus.qtpl:308
+//line lib/promscrape/targetstatus.qtpl:301
 	qw422016.E().S(tlj.jobName)
-//line lib/promscrape/targetstatus.qtpl:308
+//line lib/promscrape/targetstatus.qtpl:301
 	qw422016.N().S(` `)
-//line lib/promscrape/targetstatus.qtpl:308
+//line lib/promscrape/targetstatus.qtpl:301
 	qw422016.N().S(`(`)
-//line lib/promscrape/targetstatus.qtpl:308
+//line lib/promscrape/targetstatus.qtpl:301
 	qw422016.N().D(tlj.activeTargets)
-//line lib/promscrape/targetstatus.qtpl:308
+//line lib/promscrape/targetstatus.qtpl:301
 	qw422016.N().S(`/`)
-//line lib/promscrape/targetstatus.qtpl:308
+//line lib/promscrape/targetstatus.qtpl:301
 	qw422016.N().D(tlj.activeTargets + tlj.droppedTargets)
-//line lib/promscrape/targetstatus.qtpl:308
+//line lib/promscrape/targetstatus.qtpl:301
 	qw422016.N().S(` `)
-//line lib/promscrape/targetstatus.qtpl:308
+//line lib/promscrape/targetstatus.qtpl:301
 	qw422016.N().S(`active)</span>`)
-//line lib/promscrape/targetstatus.qtpl:309
+//line lib/promscrape/targetstatus.qtpl:302
 	streamshowHideScrapeJobButtons(qw422016, num)
-//line lib/promscrape/targetstatus.qtpl:309
+//line lib/promscrape/targetstatus.qtpl:302
 	qw422016.N().S(`</h4><div id="scrape-job-`)
-//line lib/promscrape/targetstatus.qtpl:311
+//line lib/promscrape/targetstatus.qtpl:304
 	qw422016.N().D(num)
-//line lib/promscrape/targetstatus.qtpl:311
+//line lib/promscrape/targetstatus.qtpl:304
 	qw422016.N().S(`" class="scrape-job table-responsive"><table class="table table-striped table-hover table-bordered table-sm"><thead><tr><th scope="col" style="width: 5%">Status</th><th scope="col" style="width: 60%">Discovered Labels</th><th scope="col" style="width: 30%">Target Labels</th><th scope="col" stile="width: 5%">Debug relabeling</a></tr></thead><tbody>`)
-//line lib/promscrape/targetstatus.qtpl:322
+//line lib/promscrape/targetstatus.qtpl:315
 	for _, t := range tlj.targets {
-//line lib/promscrape/targetstatus.qtpl:322
+//line lib/promscrape/targetstatus.qtpl:315
 		qw422016.N().S(`<tr`)
-//line lib/promscrape/targetstatus.qtpl:324
+//line lib/promscrape/targetstatus.qtpl:317
 		if !t.up {
-//line lib/promscrape/targetstatus.qtpl:325
+//line lib/promscrape/targetstatus.qtpl:318
 			qw422016.N().S(` `)
-//line lib/promscrape/targetstatus.qtpl:325
+//line lib/promscrape/targetstatus.qtpl:318
 			qw422016.N().S(`role="alert"`)
-//line lib/promscrape/targetstatus.qtpl:325
+//line lib/promscrape/targetstatus.qtpl:318
 			qw422016.N().S(` `)
-//line lib/promscrape/targetstatus.qtpl:326
+//line lib/promscrape/targetstatus.qtpl:319
 			if t.labels.Len() > 0 {
-//line lib/promscrape/targetstatus.qtpl:326
+//line lib/promscrape/targetstatus.qtpl:319
 				qw422016.N().S(`class="alert alert-danger"`)
-//line lib/promscrape/targetstatus.qtpl:328
+//line lib/promscrape/targetstatus.qtpl:321
 			} else {
-//line lib/promscrape/targetstatus.qtpl:328
+//line lib/promscrape/targetstatus.qtpl:321
 				qw422016.N().S(`class="alert alert-warning"`)
-//line lib/promscrape/targetstatus.qtpl:330
+//line lib/promscrape/targetstatus.qtpl:323
 			}
-//line lib/promscrape/targetstatus.qtpl:331
+//line lib/promscrape/targetstatus.qtpl:324
 		}
-//line lib/promscrape/targetstatus.qtpl:331
+//line lib/promscrape/targetstatus.qtpl:324
 		qw422016.N().S(`><td>`)
-//line lib/promscrape/targetstatus.qtpl:334
+//line lib/promscrape/targetstatus.qtpl:327
 		if t.up {
-//line lib/promscrape/targetstatus.qtpl:334
+//line lib/promscrape/targetstatus.qtpl:327
 			qw422016.N().S(`<span class="badge bg-success">UP</span>`)
-//line lib/promscrape/targetstatus.qtpl:336
+//line lib/promscrape/targetstatus.qtpl:329
 		} else if t.labels.Len() > 0 {
-//line lib/promscrape/targetstatus.qtpl:336
+//line lib/promscrape/targetstatus.qtpl:329
 			qw422016.N().S(`<span class="badge bg-danger">DOWN</span>`)
-//line lib/promscrape/targetstatus.qtpl:338
+//line lib/promscrape/targetstatus.qtpl:331
 		} else {
-//line lib/promscrape/targetstatus.qtpl:338
+//line lib/promscrape/targetstatus.qtpl:331
 			qw422016.N().S(`<span class="badge bg-warning">DROPPED (`)
-//line lib/promscrape/targetstatus.qtpl:339
+//line lib/promscrape/targetstatus.qtpl:332
 			qw422016.E().S(string(t.dropReason))
-//line lib/promscrape/targetstatus.qtpl:339
+//line lib/promscrape/targetstatus.qtpl:332
 			qw422016.N().S(`)</span>`)
-//line lib/promscrape/targetstatus.qtpl:340
+//line lib/promscrape/targetstatus.qtpl:333
 		}
-//line lib/promscrape/targetstatus.qtpl:340
+//line lib/promscrape/targetstatus.qtpl:333
 		qw422016.N().S(`</td><td class="labels">`)
-//line lib/promscrape/targetstatus.qtpl:343
+//line lib/promscrape/targetstatus.qtpl:336
 		streamformatLabels(qw422016, t.originalLabels)
-//line lib/promscrape/targetstatus.qtpl:343
+//line lib/promscrape/targetstatus.qtpl:336
 		qw422016.N().S(`</td><td class="labels">`)
-//line lib/promscrape/targetstatus.qtpl:346
+//line lib/promscrape/targetstatus.qtpl:339
 		streamformatLabels(qw422016, t.labels)
-//line lib/promscrape/targetstatus.qtpl:346
+//line lib/promscrape/targetstatus.qtpl:339
 		qw422016.N().S(`</td><td>`)
-//line lib/promscrape/targetstatus.qtpl:349
+//line lib/promscrape/targetstatus.qtpl:342
 		targetID := getLabelsID(t.originalLabels)
 
-//line lib/promscrape/targetstatus.qtpl:349
+//line lib/promscrape/targetstatus.qtpl:342
 		qw422016.N().S(`<a href="target-relabel-debug?id=`)
-//line lib/promscrape/targetstatus.qtpl:350
+//line lib/promscrape/targetstatus.qtpl:343
 		qw422016.E().S(targetID)
-//line lib/promscrape/targetstatus.qtpl:350
+//line lib/promscrape/targetstatus.qtpl:343
 		qw422016.N().S(`" target="_blank">debug</a></td></tr>`)
-//line lib/promscrape/targetstatus.qtpl:353
+//line lib/promscrape/targetstatus.qtpl:346
 	}
-//line lib/promscrape/targetstatus.qtpl:353
+//line lib/promscrape/targetstatus.qtpl:346
 	qw422016.N().S(`</tbody></table></div>`)
-//line lib/promscrape/targetstatus.qtpl:357
+//line lib/promscrape/targetstatus.qtpl:350
 }
 
-//line lib/promscrape/targetstatus.qtpl:357
+//line lib/promscrape/targetstatus.qtpl:350
 func writediscoveredJobTargets(qq422016 qtio422016.Writer, num int, tlj *targetLabelsByJob) {
-//line lib/promscrape/targetstatus.qtpl:357
+//line lib/promscrape/targetstatus.qtpl:350
 	qw422016 := qt422016.AcquireWriter(qq422016)
-//line lib/promscrape/targetstatus.qtpl:357
+//line lib/promscrape/targetstatus.qtpl:350
 	streamdiscoveredJobTargets(qw422016, num, tlj)
-//line lib/promscrape/targetstatus.qtpl:357
+//line lib/promscrape/targetstatus.qtpl:350
 	qt422016.ReleaseWriter(qw422016)
-//line lib/promscrape/targetstatus.qtpl:357
+//line lib/promscrape/targetstatus.qtpl:350
 }
 
-//line lib/promscrape/targetstatus.qtpl:357
+//line lib/promscrape/targetstatus.qtpl:350
 func discoveredJobTargets(num int, tlj *targetLabelsByJob) string {
-//line lib/promscrape/targetstatus.qtpl:357
+//line lib/promscrape/targetstatus.qtpl:350
 	qb422016 := qt422016.AcquireByteBuffer()
-//line lib/promscrape/targetstatus.qtpl:357
+//line lib/promscrape/targetstatus.qtpl:350
 	writediscoveredJobTargets(qb422016, num, tlj)
-//line lib/promscrape/targetstatus.qtpl:357
+//line lib/promscrape/targetstatus.qtpl:350
 	qs422016 := string(qb422016.B)
-//line lib/promscrape/targetstatus.qtpl:357
+//line lib/promscrape/targetstatus.qtpl:350
 	qt422016.ReleaseByteBuffer(qb422016)
-//line lib/promscrape/targetstatus.qtpl:357
+//line lib/promscrape/targetstatus.qtpl:350
 	return qs422016
-//line lib/promscrape/targetstatus.qtpl:357
+//line lib/promscrape/targetstatus.qtpl:350
 }
 
-//line lib/promscrape/targetstatus.qtpl:359
+//line lib/promscrape/targetstatus.qtpl:352
 func streamshowHideScrapeJobButtons(qw422016 *qt422016.Writer, num int) {
-//line lib/promscrape/targetstatus.qtpl:359
+//line lib/promscrape/targetstatus.qtpl:352
 	qw422016.N().S(`<button type="button" class="btn btn-primary btn-sm me-1"onclick="document.getElementById('scrape-job-`)
-//line lib/promscrape/targetstatus.qtpl:361
+//line lib/promscrape/targetstatus.qtpl:354
 	qw422016.N().D(num)
-//line lib/promscrape/targetstatus.qtpl:361
+//line lib/promscrape/targetstatus.qtpl:354
 	qw422016.N().S(`').style.display='none'">collapse</button><button type="button" class="btn btn-secondary btn-sm me-1"onclick="document.getElementById('scrape-job-`)
-//line lib/promscrape/targetstatus.qtpl:365
+//line lib/promscrape/targetstatus.qtpl:358
 	qw422016.N().D(num)
-//line lib/promscrape/targetstatus.qtpl:365
+//line lib/promscrape/targetstatus.qtpl:358
 	qw422016.N().S(`').style.display='block'">expand</button>`)
-//line lib/promscrape/targetstatus.qtpl:368
+//line lib/promscrape/targetstatus.qtpl:361
 }
 
-//line lib/promscrape/targetstatus.qtpl:368
+//line lib/promscrape/targetstatus.qtpl:361
 func writeshowHideScrapeJobButtons(qq422016 qtio422016.Writer, num int) {
-//line lib/promscrape/targetstatus.qtpl:368
+//line lib/promscrape/targetstatus.qtpl:361
 	qw422016 := qt422016.AcquireWriter(qq422016)
-//line lib/promscrape/targetstatus.qtpl:368
+//line lib/promscrape/targetstatus.qtpl:361
 	streamshowHideScrapeJobButtons(qw422016, num)
-//line lib/promscrape/targetstatus.qtpl:368
+//line lib/promscrape/targetstatus.qtpl:361
 	qt422016.ReleaseWriter(qw422016)
-//line lib/promscrape/targetstatus.qtpl:368
+//line lib/promscrape/targetstatus.qtpl:361
 }
 
-//line lib/promscrape/targetstatus.qtpl:368
+//line lib/promscrape/targetstatus.qtpl:361
 func showHideScrapeJobButtons(num int) string {
-//line lib/promscrape/targetstatus.qtpl:368
+//line lib/promscrape/targetstatus.qtpl:361
 	qb422016 := qt422016.AcquireByteBuffer()
-//line lib/promscrape/targetstatus.qtpl:368
+//line lib/promscrape/targetstatus.qtpl:361
 	writeshowHideScrapeJobButtons(qb422016, num)
-//line lib/promscrape/targetstatus.qtpl:368
+//line lib/promscrape/targetstatus.qtpl:361
 	qs422016 := string(qb422016.B)
-//line lib/promscrape/targetstatus.qtpl:368
+//line lib/promscrape/targetstatus.qtpl:361
 	qt422016.ReleaseByteBuffer(qb422016)
-//line lib/promscrape/targetstatus.qtpl:368
+//line lib/promscrape/targetstatus.qtpl:361
 	return qs422016
-//line lib/promscrape/targetstatus.qtpl:368
+//line lib/promscrape/targetstatus.qtpl:361
 }
 
-//line lib/promscrape/targetstatus.qtpl:370
+//line lib/promscrape/targetstatus.qtpl:363
 func streamqueryArgs(qw422016 *qt422016.Writer, filter *requestFilter, override map[string]string) {
-//line lib/promscrape/targetstatus.qtpl:372
+//line lib/promscrape/targetstatus.qtpl:365
 	showOnlyUnhealthy := "false"
 	if filter.showOnlyUnhealthy {
 		showOnlyUnhealthy = "true"
@@ -995,89 +983,89 @@ func streamqueryArgs(qw422016 *qt422016.Writer, filter *requestFilter, override
 		qa[k] = []string{v}
 	}
 
-//line lib/promscrape/targetstatus.qtpl:389
+//line lib/promscrape/targetstatus.qtpl:382
 	qw422016.E().S(qa.Encode())
-//line lib/promscrape/targetstatus.qtpl:390
+//line lib/promscrape/targetstatus.qtpl:383
 }
 
-//line lib/promscrape/targetstatus.qtpl:390
+//line lib/promscrape/targetstatus.qtpl:383
 func writequeryArgs(qq422016 qtio422016.Writer, filter *requestFilter, override map[string]string) {
-//line lib/promscrape/targetstatus.qtpl:390
+//line lib/promscrape/targetstatus.qtpl:383
 	qw422016 := qt422016.AcquireWriter(qq422016)
-//line lib/promscrape/targetstatus.qtpl:390
+//line lib/promscrape/targetstatus.qtpl:383
 	streamqueryArgs(qw422016, filter, override)
-//line lib/promscrape/targetstatus.qtpl:390
+//line lib/promscrape/targetstatus.qtpl:383
 	qt422016.ReleaseWriter(qw422016)
-//line lib/promscrape/targetstatus.qtpl:390
+//line lib/promscrape/targetstatus.qtpl:383
 }
 
-//line lib/promscrape/targetstatus.qtpl:390
+//line lib/promscrape/targetstatus.qtpl:383
 func queryArgs(filter *requestFilter, override map[string]string) string {
-//line lib/promscrape/targetstatus.qtpl:390
+//line lib/promscrape/targetstatus.qtpl:383
 	qb422016 := qt422016.AcquireByteBuffer()
-//line lib/promscrape/targetstatus.qtpl:390
+//line lib/promscrape/targetstatus.qtpl:383
 	writequeryArgs(qb422016, filter, override)
-//line lib/promscrape/targetstatus.qtpl:390
+//line lib/promscrape/targetstatus.qtpl:383
 	qs422016 := string(qb422016.B)
-//line lib/promscrape/targetstatus.qtpl:390
+//line lib/promscrape/targetstatus.qtpl:383
 	qt422016.ReleaseByteBuffer(qb422016)
-//line lib/promscrape/targetstatus.qtpl:390
+//line lib/promscrape/targetstatus.qtpl:383
 	return qs422016
-//line lib/promscrape/targetstatus.qtpl:390
+//line lib/promscrape/targetstatus.qtpl:383
 }
 
-//line lib/promscrape/targetstatus.qtpl:392
+//line lib/promscrape/targetstatus.qtpl:385
 func streamformatLabels(qw422016 *qt422016.Writer, labels *promutils.Labels) {
-//line lib/promscrape/targetstatus.qtpl:393
+//line lib/promscrape/targetstatus.qtpl:386
 	labelsList := labels.GetLabels()
 
-//line lib/promscrape/targetstatus.qtpl:393
+//line lib/promscrape/targetstatus.qtpl:386
 	qw422016.N().S(`{`)
-//line lib/promscrape/targetstatus.qtpl:395
+//line lib/promscrape/targetstatus.qtpl:388
 	for i, label := range labelsList {
-//line lib/promscrape/targetstatus.qtpl:396
+//line lib/promscrape/targetstatus.qtpl:389
 		qw422016.E().S(label.Name)
-//line lib/promscrape/targetstatus.qtpl:396
+//line lib/promscrape/targetstatus.qtpl:389
 		qw422016.N().S(`=`)
-//line lib/promscrape/targetstatus.qtpl:396
+//line lib/promscrape/targetstatus.qtpl:389
 		qw422016.E().Q(label.Value)
-//line lib/promscrape/targetstatus.qtpl:397
+//line lib/promscrape/targetstatus.qtpl:390
 		if i+1 < len(labelsList) {
-//line lib/promscrape/targetstatus.qtpl:397
+//line lib/promscrape/targetstatus.qtpl:390
 			qw422016.N().S(`,`)
-//line lib/promscrape/targetstatus.qtpl:397
+//line lib/promscrape/targetstatus.qtpl:390
 			qw422016.N().S(` `)
-//line lib/promscrape/targetstatus.qtpl:397
+//line lib/promscrape/targetstatus.qtpl:390
 		}
-//line lib/promscrape/targetstatus.qtpl:398
+//line lib/promscrape/targetstatus.qtpl:391
 	}
-//line lib/promscrape/targetstatus.qtpl:398
+//line lib/promscrape/targetstatus.qtpl:391
 	qw422016.N().S(`}`)
-//line lib/promscrape/targetstatus.qtpl:400
+//line lib/promscrape/targetstatus.qtpl:393
 }
 
-//line lib/promscrape/targetstatus.qtpl:400
+//line lib/promscrape/targetstatus.qtpl:393
 func writeformatLabels(qq422016 qtio422016.Writer, labels *promutils.Labels) {
-//line lib/promscrape/targetstatus.qtpl:400
+//line lib/promscrape/targetstatus.qtpl:393
 	qw422016 := qt422016.AcquireWriter(qq422016)
-//line lib/promscrape/targetstatus.qtpl:400
+//line lib/promscrape/targetstatus.qtpl:393
 	streamformatLabels(qw422016, labels)
-//line lib/promscrape/targetstatus.qtpl:400
+//line lib/promscrape/targetstatus.qtpl:393
 	qt422016.ReleaseWriter(qw422016)
-//line lib/promscrape/targetstatus.qtpl:400
+//line lib/promscrape/targetstatus.qtpl:393
 }
 
-//line lib/promscrape/targetstatus.qtpl:400
+//line lib/promscrape/targetstatus.qtpl:393
 func formatLabels(labels *promutils.Labels) string {
-//line lib/promscrape/targetstatus.qtpl:400
+//line lib/promscrape/targetstatus.qtpl:393
 	qb422016 := qt422016.AcquireByteBuffer()
-//line lib/promscrape/targetstatus.qtpl:400
+//line lib/promscrape/targetstatus.qtpl:393
 	writeformatLabels(qb422016, labels)
-//line lib/promscrape/targetstatus.qtpl:400
+//line lib/promscrape/targetstatus.qtpl:393
 	qs422016 := string(qb422016.B)
-//line lib/promscrape/targetstatus.qtpl:400
+//line lib/promscrape/targetstatus.qtpl:393
 	qt422016.ReleaseByteBuffer(qb422016)
-//line lib/promscrape/targetstatus.qtpl:400
+//line lib/promscrape/targetstatus.qtpl:393
 	return qs422016
-//line lib/promscrape/targetstatus.qtpl:400
+//line lib/promscrape/targetstatus.qtpl:393
 }