diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md
index 2527f6106c..02bdf78307 100644
--- a/docs/CHANGELOG.md
+++ b/docs/CHANGELOG.md
@@ -31,7 +31,8 @@ The following tip changes can be tested by building VictoriaMetrics components f
* FEATURE: [vmagent](https://docs.victoriametrics.com/vmagent.html): provide the ability to fetch target responses on behalf of `vmagent` by clicking the `response` link for the needed target at `/targets` page. This feature may be useful for debugging responses from targets located in isolated environments.
* FEATURE: [vmagent](https://docs.victoriametrics.com/vmagent.html): show the total number of scrapes and the total number of scrape errors per target at `/targets` page. This information may be useful when debugging unreliable scrape targets.
* FEATURE: vmagent and single-node VictoriaMetrics: disallow unknown fields at `-promscrape.config` file. Previously unknown fields were allowed. This could lead to long-living silent config errors. The previous behaviour can be returned by passing `-promscrape.config.strictParse=false` command-line flag.
-* FEATURE: add `__meta_kubernetes_endpointslice_label*` and `__meta_kubernetes_endpointslice_annotation*` labels for `role: endpointslice` targets in [kubernetes_sd_config](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#kubernetes_sd_config) to be consistent with other `role` values. See [this issue](https://github.com/prometheus/prometheus/issues/10284).
+* FEATURE: vmagent: add `__meta_kubernetes_endpointslice_label*` and `__meta_kubernetes_endpointslice_annotation*` labels for `role: endpointslice` targets in [kubernetes_sd_config](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#kubernetes_sd_config) to be consistent with other `role` values. See [this issue](https://github.com/prometheus/prometheus/issues/10284).
+* FEATURE: vmagent: add `collapse all` and `expand all` buttons to `http://vmagent:8429/targets` page. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/2021).
* FEATURE: vmagent: support Prometheus-like durations in `-promscrape.config`. See [this comment](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/817#issuecomment-1033384766).
* BUGFIX: calculate [absent_over_time()](https://docs.victoriametrics.com/MetricsQL.html#absent_over_time) in the same way as Prometheus does. Previously it could return multiple time series instead of at most one time series like Prometheus does. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/2130).
diff --git a/lib/promscrape/targets_response.qtpl.go b/lib/promscrape/targets_response.qtpl.go
deleted file mode 100644
index c5abd4e9a5..0000000000
--- a/lib/promscrape/targets_response.qtpl.go
+++ /dev/null
@@ -1,466 +0,0 @@
-// Code generated by qtc from "targets_response.qtpl". DO NOT EDIT.
-// See https://github.com/valyala/quicktemplate for details.
-
-//line lib/promscrape/targets_response.qtpl:1
-package promscrape
-
-//line lib/promscrape/targets_response.qtpl:1
-import (
- "github.com/VictoriaMetrics/VictoriaMetrics/lib/prompbmarshal"
- "github.com/VictoriaMetrics/VictoriaMetrics/lib/promrelabel"
- "time"
-)
-
-//line lib/promscrape/targets_response.qtpl:9
-import (
- qtio422016 "io"
-
- qt422016 "github.com/valyala/quicktemplate"
-)
-
-//line lib/promscrape/targets_response.qtpl:9
-var (
- _ = qtio422016.Copy
- _ = qt422016.AcquireByteBuffer
-)
-
-//line lib/promscrape/targets_response.qtpl:9
-func StreamTargetsResponsePlain(qw422016 *qt422016.Writer, jts []jobTargetsStatuses, emptyJobs []string, showOriginLabels bool) {
-//line lib/promscrape/targets_response.qtpl:11
- for _, js := range jts {
-//line lib/promscrape/targets_response.qtpl:11
- qw422016.N().S(`job=`)
-//line lib/promscrape/targets_response.qtpl:12
- qw422016.N().Q(js.job)
-//line lib/promscrape/targets_response.qtpl:12
- qw422016.N().S(`(`)
-//line lib/promscrape/targets_response.qtpl:12
- qw422016.N().D(js.upCount)
-//line lib/promscrape/targets_response.qtpl:12
- qw422016.N().S(`/`)
-//line lib/promscrape/targets_response.qtpl:12
- qw422016.N().D(js.targetsTotal)
-//line lib/promscrape/targets_response.qtpl:12
- qw422016.N().S(` `)
-//line lib/promscrape/targets_response.qtpl:12
- qw422016.N().S(`up)`)
-//line lib/promscrape/targets_response.qtpl:13
- qw422016.N().S(`
-`)
-//line lib/promscrape/targets_response.qtpl:14
- for _, ts := range js.targetsStatus {
-//line lib/promscrape/targets_response.qtpl:15
- qw422016.N().S("\t")
-//line lib/promscrape/targets_response.qtpl:15
- qw422016.N().S(`state=`)
-//line lib/promscrape/targets_response.qtpl:16
- if ts.up {
-//line lib/promscrape/targets_response.qtpl:16
- qw422016.N().S(`up`)
-//line lib/promscrape/targets_response.qtpl:16
- } else {
-//line lib/promscrape/targets_response.qtpl:16
- qw422016.N().S(`down`)
-//line lib/promscrape/targets_response.qtpl:16
- }
-//line lib/promscrape/targets_response.qtpl:16
- qw422016.N().S(`,`)
-//line lib/promscrape/targets_response.qtpl:16
- qw422016.N().S(` `)
-//line lib/promscrape/targets_response.qtpl:16
- qw422016.N().S(`endpoint=`)
-//line lib/promscrape/targets_response.qtpl:17
- qw422016.N().S(ts.sw.Config.ScrapeURL)
-//line lib/promscrape/targets_response.qtpl:17
- qw422016.N().S(`,`)
-//line lib/promscrape/targets_response.qtpl:17
- qw422016.N().S(` `)
-//line lib/promscrape/targets_response.qtpl:17
- qw422016.N().S(`labels=`)
-//line lib/promscrape/targets_response.qtpl:18
- qw422016.N().S(promLabelsString(promrelabel.FinalizeLabels(nil, ts.sw.Config.Labels)))
-//line lib/promscrape/targets_response.qtpl:18
- qw422016.N().S(`,`)
-//line lib/promscrape/targets_response.qtpl:18
- qw422016.N().S(` `)
-//line lib/promscrape/targets_response.qtpl:19
- if showOriginLabels {
-//line lib/promscrape/targets_response.qtpl:19
- qw422016.N().S(`originalLabels=`)
-//line lib/promscrape/targets_response.qtpl:19
- qw422016.N().S(promLabelsString(ts.sw.Config.OriginalLabels))
-//line lib/promscrape/targets_response.qtpl:19
- qw422016.N().S(`,`)
-//line lib/promscrape/targets_response.qtpl:19
- qw422016.N().S(` `)
-//line lib/promscrape/targets_response.qtpl:19
- }
-//line lib/promscrape/targets_response.qtpl:19
- qw422016.N().S(`scrapes_total=`)
-//line lib/promscrape/targets_response.qtpl:20
- qw422016.N().D(ts.scrapesTotal)
-//line lib/promscrape/targets_response.qtpl:20
- qw422016.N().S(`,`)
-//line lib/promscrape/targets_response.qtpl:20
- qw422016.N().S(` `)
-//line lib/promscrape/targets_response.qtpl:20
- qw422016.N().S(`scrapes_failed=`)
-//line lib/promscrape/targets_response.qtpl:21
- qw422016.N().D(ts.scrapesFailed)
-//line lib/promscrape/targets_response.qtpl:21
- qw422016.N().S(`,`)
-//line lib/promscrape/targets_response.qtpl:21
- qw422016.N().S(` `)
-//line lib/promscrape/targets_response.qtpl:21
- qw422016.N().S(`last_scrape=`)
-//line lib/promscrape/targets_response.qtpl:22
- qw422016.N().FPrec(ts.getDurationFromLastScrape().Seconds(), 3)
-//line lib/promscrape/targets_response.qtpl:22
- qw422016.N().S(`s ago,`)
-//line lib/promscrape/targets_response.qtpl:22
- qw422016.N().S(` `)
-//line lib/promscrape/targets_response.qtpl:22
- qw422016.N().S(`scrape_duration=`)
-//line lib/promscrape/targets_response.qtpl:23
- qw422016.N().D(int(ts.scrapeDuration))
-//line lib/promscrape/targets_response.qtpl:23
- qw422016.N().S(`ms,`)
-//line lib/promscrape/targets_response.qtpl:23
- qw422016.N().S(` `)
-//line lib/promscrape/targets_response.qtpl:23
- qw422016.N().S(`samples_scraped=`)
-//line lib/promscrape/targets_response.qtpl:24
- qw422016.N().D(ts.samplesScraped)
-//line lib/promscrape/targets_response.qtpl:24
- qw422016.N().S(`,`)
-//line lib/promscrape/targets_response.qtpl:24
- qw422016.N().S(` `)
-//line lib/promscrape/targets_response.qtpl:24
- qw422016.N().S(`error=`)
-//line lib/promscrape/targets_response.qtpl:25
- if ts.err != nil {
-//line lib/promscrape/targets_response.qtpl:25
- qw422016.N().S(ts.err.Error())
-//line lib/promscrape/targets_response.qtpl:25
- }
-//line lib/promscrape/targets_response.qtpl:26
- qw422016.N().S(`
-`)
-//line lib/promscrape/targets_response.qtpl:27
- }
-//line lib/promscrape/targets_response.qtpl:28
- }
-//line lib/promscrape/targets_response.qtpl:30
- for _, jobName := range emptyJobs {
-//line lib/promscrape/targets_response.qtpl:30
- qw422016.N().S(`job=`)
-//line lib/promscrape/targets_response.qtpl:31
- qw422016.N().Q(jobName)
-//line lib/promscrape/targets_response.qtpl:31
- qw422016.N().S(`(0/0 up)`)
-//line lib/promscrape/targets_response.qtpl:32
- qw422016.N().S(`
-`)
-//line lib/promscrape/targets_response.qtpl:33
- }
-//line lib/promscrape/targets_response.qtpl:35
-}
-
-//line lib/promscrape/targets_response.qtpl:35
-func WriteTargetsResponsePlain(qq422016 qtio422016.Writer, jts []jobTargetsStatuses, emptyJobs []string, showOriginLabels bool) {
-//line lib/promscrape/targets_response.qtpl:35
- qw422016 := qt422016.AcquireWriter(qq422016)
-//line lib/promscrape/targets_response.qtpl:35
- StreamTargetsResponsePlain(qw422016, jts, emptyJobs, showOriginLabels)
-//line lib/promscrape/targets_response.qtpl:35
- qt422016.ReleaseWriter(qw422016)
-//line lib/promscrape/targets_response.qtpl:35
-}
-
-//line lib/promscrape/targets_response.qtpl:35
-func TargetsResponsePlain(jts []jobTargetsStatuses, emptyJobs []string, showOriginLabels bool) string {
-//line lib/promscrape/targets_response.qtpl:35
- qb422016 := qt422016.AcquireByteBuffer()
-//line lib/promscrape/targets_response.qtpl:35
- WriteTargetsResponsePlain(qb422016, jts, emptyJobs, showOriginLabels)
-//line lib/promscrape/targets_response.qtpl:35
- qs422016 := string(qb422016.B)
-//line lib/promscrape/targets_response.qtpl:35
- qt422016.ReleaseByteBuffer(qb422016)
-//line lib/promscrape/targets_response.qtpl:35
- return qs422016
-//line lib/promscrape/targets_response.qtpl:35
-}
-
-//line lib/promscrape/targets_response.qtpl:37
-func StreamTargetsResponseHTML(qw422016 *qt422016.Writer, jts []jobTargetsStatuses, emptyJobs []string, onlyUnhealthy bool) {
-//line lib/promscrape/targets_response.qtpl:37
- qw422016.N().S(`
Scrape targetsScrape targets
`)
-//line lib/promscrape/targets_response.qtpl:56
- for i, js := range jts {
-//line lib/promscrape/targets_response.qtpl:57
- if onlyUnhealthy && js.upCount == js.targetsTotal {
-//line lib/promscrape/targets_response.qtpl:57
- continue
-//line lib/promscrape/targets_response.qtpl:57
- }
-//line lib/promscrape/targets_response.qtpl:57
- qw422016.N().S(``)
-//line lib/promscrape/targets_response.qtpl:60
- qw422016.E().S(js.job)
-//line lib/promscrape/targets_response.qtpl:60
- qw422016.N().S(` `)
-//line lib/promscrape/targets_response.qtpl:60
- qw422016.N().S(`(`)
-//line lib/promscrape/targets_response.qtpl:60
- qw422016.N().D(js.upCount)
-//line lib/promscrape/targets_response.qtpl:60
- qw422016.N().S(`/`)
-//line lib/promscrape/targets_response.qtpl:60
- qw422016.N().D(js.targetsTotal)
-//line lib/promscrape/targets_response.qtpl:60
- qw422016.N().S(` `)
-//line lib/promscrape/targets_response.qtpl:60
- qw422016.N().S(`up)
Endpoint | State | Labels | Scrapes | Errors | Last Scrape | Duration | Samples | Last error |
`)
-//line lib/promscrape/targets_response.qtpl:80
- for _, ts := range js.targetsStatus {
-//line lib/promscrape/targets_response.qtpl:82
- endpoint := ts.sw.Config.ScrapeURL
- targetID := getTargetID(ts.sw)
- lastScrapeTime := ts.getDurationFromLastScrape()
-
-//line lib/promscrape/targets_response.qtpl:86
- if onlyUnhealthy && ts.up {
-//line lib/promscrape/targets_response.qtpl:86
- continue
-//line lib/promscrape/targets_response.qtpl:86
- }
-//line lib/promscrape/targets_response.qtpl:86
- qw422016.N().S(``)
-//line lib/promscrape/targets_response.qtpl:88
- qw422016.E().S(endpoint)
-//line lib/promscrape/targets_response.qtpl:88
- qw422016.N().S(` (response) | `)
-//line lib/promscrape/targets_response.qtpl:91
- if ts.up {
-//line lib/promscrape/targets_response.qtpl:91
- qw422016.N().S(`UP`)
-//line lib/promscrape/targets_response.qtpl:91
- } else {
-//line lib/promscrape/targets_response.qtpl:91
- qw422016.N().S(`DOWN`)
-//line lib/promscrape/targets_response.qtpl:91
- }
-//line lib/promscrape/targets_response.qtpl:91
- qw422016.N().S(` | `)
-//line lib/promscrape/targets_response.qtpl:94
- streamformatLabel(qw422016, promrelabel.FinalizeLabels(nil, ts.sw.Config.Labels))
-//line lib/promscrape/targets_response.qtpl:94
- qw422016.N().S(` `)
-//line lib/promscrape/targets_response.qtpl:97
- streamformatLabel(qw422016, ts.sw.Config.OriginalLabels)
-//line lib/promscrape/targets_response.qtpl:97
- qw422016.N().S(` | `)
-//line lib/promscrape/targets_response.qtpl:100
- qw422016.N().D(ts.scrapesTotal)
-//line lib/promscrape/targets_response.qtpl:100
- qw422016.N().S(` | `)
-//line lib/promscrape/targets_response.qtpl:101
- qw422016.N().D(ts.scrapesFailed)
-//line lib/promscrape/targets_response.qtpl:101
- qw422016.N().S(` | `)
-//line lib/promscrape/targets_response.qtpl:103
- if lastScrapeTime < 365*24*time.Hour {
-//line lib/promscrape/targets_response.qtpl:104
- qw422016.N().FPrec(lastScrapeTime.Seconds(), 3)
-//line lib/promscrape/targets_response.qtpl:104
- qw422016.N().S(`s ago`)
-//line lib/promscrape/targets_response.qtpl:105
- } else {
-//line lib/promscrape/targets_response.qtpl:105
- qw422016.N().S(`none`)
-//line lib/promscrape/targets_response.qtpl:107
- }
-//line lib/promscrape/targets_response.qtpl:107
- qw422016.N().S(` | `)
-//line lib/promscrape/targets_response.qtpl:108
- qw422016.N().D(int(ts.scrapeDuration))
-//line lib/promscrape/targets_response.qtpl:108
- qw422016.N().S(`ms | `)
-//line lib/promscrape/targets_response.qtpl:109
- qw422016.N().D(ts.samplesScraped)
-//line lib/promscrape/targets_response.qtpl:109
- qw422016.N().S(` | `)
-//line lib/promscrape/targets_response.qtpl:110
- if ts.err != nil {
-//line lib/promscrape/targets_response.qtpl:110
- qw422016.E().S(ts.err.Error())
-//line lib/promscrape/targets_response.qtpl:110
- }
-//line lib/promscrape/targets_response.qtpl:110
- qw422016.N().S(` |
`)
-//line lib/promscrape/targets_response.qtpl:112
- }
-//line lib/promscrape/targets_response.qtpl:112
- qw422016.N().S(`
`)
-//line lib/promscrape/targets_response.qtpl:117
- }
-//line lib/promscrape/targets_response.qtpl:119
- for _, jobName := range emptyJobs {
-//line lib/promscrape/targets_response.qtpl:119
- qw422016.N().S(`Endpoint | State | Labels | Last Scrape | Scrape Duration | Samples Scraped | Error |
---|
`)
-//line lib/promscrape/targets_response.qtpl:138
- }
-//line lib/promscrape/targets_response.qtpl:138
- qw422016.N().S(``)
-//line lib/promscrape/targets_response.qtpl:141
-}
-
-//line lib/promscrape/targets_response.qtpl:141
-func WriteTargetsResponseHTML(qq422016 qtio422016.Writer, jts []jobTargetsStatuses, emptyJobs []string, onlyUnhealthy bool) {
-//line lib/promscrape/targets_response.qtpl:141
- qw422016 := qt422016.AcquireWriter(qq422016)
-//line lib/promscrape/targets_response.qtpl:141
- StreamTargetsResponseHTML(qw422016, jts, emptyJobs, onlyUnhealthy)
-//line lib/promscrape/targets_response.qtpl:141
- qt422016.ReleaseWriter(qw422016)
-//line lib/promscrape/targets_response.qtpl:141
-}
-
-//line lib/promscrape/targets_response.qtpl:141
-func TargetsResponseHTML(jts []jobTargetsStatuses, emptyJobs []string, onlyUnhealthy bool) string {
-//line lib/promscrape/targets_response.qtpl:141
- qb422016 := qt422016.AcquireByteBuffer()
-//line lib/promscrape/targets_response.qtpl:141
- WriteTargetsResponseHTML(qb422016, jts, emptyJobs, onlyUnhealthy)
-//line lib/promscrape/targets_response.qtpl:141
- qs422016 := string(qb422016.B)
-//line lib/promscrape/targets_response.qtpl:141
- qt422016.ReleaseByteBuffer(qb422016)
-//line lib/promscrape/targets_response.qtpl:141
- return qs422016
-//line lib/promscrape/targets_response.qtpl:141
-}
-
-//line lib/promscrape/targets_response.qtpl:143
-func streamformatLabel(qw422016 *qt422016.Writer, labels []prompbmarshal.Label) {
-//line lib/promscrape/targets_response.qtpl:143
- qw422016.N().S(`{`)
-//line lib/promscrape/targets_response.qtpl:145
- for i, label := range labels {
-//line lib/promscrape/targets_response.qtpl:146
- qw422016.E().S(label.Name)
-//line lib/promscrape/targets_response.qtpl:146
- qw422016.N().S(`=`)
-//line lib/promscrape/targets_response.qtpl:146
- qw422016.E().Q(label.Value)
-//line lib/promscrape/targets_response.qtpl:147
- if i+1 < len(labels) {
-//line lib/promscrape/targets_response.qtpl:147
- qw422016.N().S(`,`)
-//line lib/promscrape/targets_response.qtpl:147
- qw422016.N().S(` `)
-//line lib/promscrape/targets_response.qtpl:147
- }
-//line lib/promscrape/targets_response.qtpl:148
- }
-//line lib/promscrape/targets_response.qtpl:148
- qw422016.N().S(`}`)
-//line lib/promscrape/targets_response.qtpl:150
-}
-
-//line lib/promscrape/targets_response.qtpl:150
-func writeformatLabel(qq422016 qtio422016.Writer, labels []prompbmarshal.Label) {
-//line lib/promscrape/targets_response.qtpl:150
- qw422016 := qt422016.AcquireWriter(qq422016)
-//line lib/promscrape/targets_response.qtpl:150
- streamformatLabel(qw422016, labels)
-//line lib/promscrape/targets_response.qtpl:150
- qt422016.ReleaseWriter(qw422016)
-//line lib/promscrape/targets_response.qtpl:150
-}
-
-//line lib/promscrape/targets_response.qtpl:150
-func formatLabel(labels []prompbmarshal.Label) string {
-//line lib/promscrape/targets_response.qtpl:150
- qb422016 := qt422016.AcquireByteBuffer()
-//line lib/promscrape/targets_response.qtpl:150
- writeformatLabel(qb422016, labels)
-//line lib/promscrape/targets_response.qtpl:150
- qs422016 := string(qb422016.B)
-//line lib/promscrape/targets_response.qtpl:150
- qt422016.ReleaseByteBuffer(qb422016)
-//line lib/promscrape/targets_response.qtpl:150
- return qs422016
-//line lib/promscrape/targets_response.qtpl:150
-}
diff --git a/lib/promscrape/targets_response.qtpl b/lib/promscrape/targetstatus.qtpl
similarity index 91%
rename from lib/promscrape/targets_response.qtpl
rename to lib/promscrape/targetstatus.qtpl
index 1d50802ee9..292a345514 100644
--- a/lib/promscrape/targets_response.qtpl
+++ b/lib/promscrape/targetstatus.qtpl
@@ -42,16 +42,36 @@ job={%q= jobName %} (0/0 up)
Scrape targets
+
Scrape targets
-
+
+
+
{% for i, js := range jts %}
{% if onlyUnhealthy && js.upCount == js.targetsTotal %}{% continue %}{% endif %}
diff --git a/lib/promscrape/targetstatus.qtpl.go b/lib/promscrape/targetstatus.qtpl.go
new file mode 100644
index 0000000000..534e2d4a75
--- /dev/null
+++ b/lib/promscrape/targetstatus.qtpl.go
@@ -0,0 +1,474 @@
+// Code generated by qtc from "targetstatus.qtpl". DO NOT EDIT.
+// See https://github.com/valyala/quicktemplate for details.
+
+//line lib/promscrape/targetstatus.qtpl:1
+package promscrape
+
+//line lib/promscrape/targetstatus.qtpl:1
+import (
+ "github.com/VictoriaMetrics/VictoriaMetrics/lib/prompbmarshal"
+ "github.com/VictoriaMetrics/VictoriaMetrics/lib/promrelabel"
+ "time"
+)
+
+//line lib/promscrape/targetstatus.qtpl:9
+import (
+ qtio422016 "io"
+
+ qt422016 "github.com/valyala/quicktemplate"
+)
+
+//line lib/promscrape/targetstatus.qtpl:9
+var (
+ _ = qtio422016.Copy
+ _ = qt422016.AcquireByteBuffer
+)
+
+//line lib/promscrape/targetstatus.qtpl:9
+func StreamTargetsResponsePlain(qw422016 *qt422016.Writer, jts []jobTargetsStatuses, emptyJobs []string, showOriginLabels bool) {
+//line lib/promscrape/targetstatus.qtpl:11
+ for _, js := range jts {
+//line lib/promscrape/targetstatus.qtpl:11
+ qw422016.N().S(`job=`)
+//line lib/promscrape/targetstatus.qtpl:12
+ qw422016.N().Q(js.job)
+//line lib/promscrape/targetstatus.qtpl:12
+ qw422016.N().S(`(`)
+//line lib/promscrape/targetstatus.qtpl:12
+ qw422016.N().D(js.upCount)
+//line lib/promscrape/targetstatus.qtpl:12
+ qw422016.N().S(`/`)
+//line lib/promscrape/targetstatus.qtpl:12
+ qw422016.N().D(js.targetsTotal)
+//line lib/promscrape/targetstatus.qtpl:12
+ qw422016.N().S(` `)
+//line lib/promscrape/targetstatus.qtpl:12
+ qw422016.N().S(`up)`)
+//line lib/promscrape/targetstatus.qtpl:13
+ qw422016.N().S(`
+`)
+//line lib/promscrape/targetstatus.qtpl:14
+ for _, ts := range js.targetsStatus {
+//line lib/promscrape/targetstatus.qtpl:15
+ qw422016.N().S("\t")
+//line lib/promscrape/targetstatus.qtpl:15
+ qw422016.N().S(`state=`)
+//line lib/promscrape/targetstatus.qtpl:16
+ if ts.up {
+//line lib/promscrape/targetstatus.qtpl:16
+ qw422016.N().S(`up`)
+//line lib/promscrape/targetstatus.qtpl:16
+ } else {
+//line lib/promscrape/targetstatus.qtpl:16
+ qw422016.N().S(`down`)
+//line lib/promscrape/targetstatus.qtpl:16
+ }
+//line lib/promscrape/targetstatus.qtpl:16
+ qw422016.N().S(`,`)
+//line lib/promscrape/targetstatus.qtpl:16
+ qw422016.N().S(` `)
+//line lib/promscrape/targetstatus.qtpl:16
+ qw422016.N().S(`endpoint=`)
+//line lib/promscrape/targetstatus.qtpl:17
+ qw422016.N().S(ts.sw.Config.ScrapeURL)
+//line lib/promscrape/targetstatus.qtpl:17
+ qw422016.N().S(`,`)
+//line lib/promscrape/targetstatus.qtpl:17
+ qw422016.N().S(` `)
+//line lib/promscrape/targetstatus.qtpl:17
+ qw422016.N().S(`labels=`)
+//line lib/promscrape/targetstatus.qtpl:18
+ qw422016.N().S(promLabelsString(promrelabel.FinalizeLabels(nil, ts.sw.Config.Labels)))
+//line lib/promscrape/targetstatus.qtpl:18
+ qw422016.N().S(`,`)
+//line lib/promscrape/targetstatus.qtpl:18
+ qw422016.N().S(` `)
+//line lib/promscrape/targetstatus.qtpl:19
+ if showOriginLabels {
+//line lib/promscrape/targetstatus.qtpl:19
+ qw422016.N().S(`originalLabels=`)
+//line lib/promscrape/targetstatus.qtpl:19
+ qw422016.N().S(promLabelsString(ts.sw.Config.OriginalLabels))
+//line lib/promscrape/targetstatus.qtpl:19
+ qw422016.N().S(`,`)
+//line lib/promscrape/targetstatus.qtpl:19
+ qw422016.N().S(` `)
+//line lib/promscrape/targetstatus.qtpl:19
+ }
+//line lib/promscrape/targetstatus.qtpl:19
+ qw422016.N().S(`scrapes_total=`)
+//line lib/promscrape/targetstatus.qtpl:20
+ qw422016.N().D(ts.scrapesTotal)
+//line lib/promscrape/targetstatus.qtpl:20
+ qw422016.N().S(`,`)
+//line lib/promscrape/targetstatus.qtpl:20
+ qw422016.N().S(` `)
+//line lib/promscrape/targetstatus.qtpl:20
+ qw422016.N().S(`scrapes_failed=`)
+//line lib/promscrape/targetstatus.qtpl:21
+ qw422016.N().D(ts.scrapesFailed)
+//line lib/promscrape/targetstatus.qtpl:21
+ qw422016.N().S(`,`)
+//line lib/promscrape/targetstatus.qtpl:21
+ qw422016.N().S(` `)
+//line lib/promscrape/targetstatus.qtpl:21
+ qw422016.N().S(`last_scrape=`)
+//line lib/promscrape/targetstatus.qtpl:22
+ qw422016.N().FPrec(ts.getDurationFromLastScrape().Seconds(), 3)
+//line lib/promscrape/targetstatus.qtpl:22
+ qw422016.N().S(`s ago,`)
+//line lib/promscrape/targetstatus.qtpl:22
+ qw422016.N().S(` `)
+//line lib/promscrape/targetstatus.qtpl:22
+ qw422016.N().S(`scrape_duration=`)
+//line lib/promscrape/targetstatus.qtpl:23
+ qw422016.N().D(int(ts.scrapeDuration))
+//line lib/promscrape/targetstatus.qtpl:23
+ qw422016.N().S(`ms,`)
+//line lib/promscrape/targetstatus.qtpl:23
+ qw422016.N().S(` `)
+//line lib/promscrape/targetstatus.qtpl:23
+ qw422016.N().S(`samples_scraped=`)
+//line lib/promscrape/targetstatus.qtpl:24
+ qw422016.N().D(ts.samplesScraped)
+//line lib/promscrape/targetstatus.qtpl:24
+ qw422016.N().S(`,`)
+//line lib/promscrape/targetstatus.qtpl:24
+ qw422016.N().S(` `)
+//line lib/promscrape/targetstatus.qtpl:24
+ qw422016.N().S(`error=`)
+//line lib/promscrape/targetstatus.qtpl:25
+ if ts.err != nil {
+//line lib/promscrape/targetstatus.qtpl:25
+ qw422016.N().S(ts.err.Error())
+//line lib/promscrape/targetstatus.qtpl:25
+ }
+//line lib/promscrape/targetstatus.qtpl:26
+ qw422016.N().S(`
+`)
+//line lib/promscrape/targetstatus.qtpl:27
+ }
+//line lib/promscrape/targetstatus.qtpl:28
+ }
+//line lib/promscrape/targetstatus.qtpl:30
+ for _, jobName := range emptyJobs {
+//line lib/promscrape/targetstatus.qtpl:30
+ qw422016.N().S(`job=`)
+//line lib/promscrape/targetstatus.qtpl:31
+ qw422016.N().Q(jobName)
+//line lib/promscrape/targetstatus.qtpl:31
+ qw422016.N().S(`(0/0 up)`)
+//line lib/promscrape/targetstatus.qtpl:32
+ qw422016.N().S(`
+`)
+//line lib/promscrape/targetstatus.qtpl:33
+ }
+//line lib/promscrape/targetstatus.qtpl:35
+}
+
+//line lib/promscrape/targetstatus.qtpl:35
+func WriteTargetsResponsePlain(qq422016 qtio422016.Writer, jts []jobTargetsStatuses, emptyJobs []string, showOriginLabels bool) {
+//line lib/promscrape/targetstatus.qtpl:35
+ qw422016 := qt422016.AcquireWriter(qq422016)
+//line lib/promscrape/targetstatus.qtpl:35
+ StreamTargetsResponsePlain(qw422016, jts, emptyJobs, showOriginLabels)
+//line lib/promscrape/targetstatus.qtpl:35
+ qt422016.ReleaseWriter(qw422016)
+//line lib/promscrape/targetstatus.qtpl:35
+}
+
+//line lib/promscrape/targetstatus.qtpl:35
+func TargetsResponsePlain(jts []jobTargetsStatuses, emptyJobs []string, showOriginLabels bool) string {
+//line lib/promscrape/targetstatus.qtpl:35
+ qb422016 := qt422016.AcquireByteBuffer()
+//line lib/promscrape/targetstatus.qtpl:35
+ WriteTargetsResponsePlain(qb422016, jts, emptyJobs, showOriginLabels)
+//line lib/promscrape/targetstatus.qtpl:35
+ qs422016 := string(qb422016.B)
+//line lib/promscrape/targetstatus.qtpl:35
+ qt422016.ReleaseByteBuffer(qb422016)
+//line lib/promscrape/targetstatus.qtpl:35
+ return qs422016
+//line lib/promscrape/targetstatus.qtpl:35
+}
+
+//line lib/promscrape/targetstatus.qtpl:37
+func StreamTargetsResponseHTML(qw422016 *qt422016.Writer, jts []jobTargetsStatuses, emptyJobs []string, onlyUnhealthy bool) {
+//line lib/promscrape/targetstatus.qtpl:37
+ qw422016.N().S(`
Scrape targetsScrape targets
`)
+//line lib/promscrape/targetstatus.qtpl:76
+ for i, js := range jts {
+//line lib/promscrape/targetstatus.qtpl:77
+ if onlyUnhealthy && js.upCount == js.targetsTotal {
+//line lib/promscrape/targetstatus.qtpl:77
+ continue
+//line lib/promscrape/targetstatus.qtpl:77
+ }
+//line lib/promscrape/targetstatus.qtpl:77
+ qw422016.N().S(`
`)
+//line lib/promscrape/targetstatus.qtpl:80
+ qw422016.E().S(js.job)
+//line lib/promscrape/targetstatus.qtpl:80
+ qw422016.N().S(` `)
+//line lib/promscrape/targetstatus.qtpl:80
+ qw422016.N().S(`(`)
+//line lib/promscrape/targetstatus.qtpl:80
+ qw422016.N().D(js.upCount)
+//line lib/promscrape/targetstatus.qtpl:80
+ qw422016.N().S(`/`)
+//line lib/promscrape/targetstatus.qtpl:80
+ qw422016.N().D(js.targetsTotal)
+//line lib/promscrape/targetstatus.qtpl:80
+ qw422016.N().S(` `)
+//line lib/promscrape/targetstatus.qtpl:80
+ qw422016.N().S(`up)
Endpoint | State | Labels | Scrapes | Errors | Last Scrape | Duration | Samples | Last error |
`)
+//line lib/promscrape/targetstatus.qtpl:100
+ for _, ts := range js.targetsStatus {
+//line lib/promscrape/targetstatus.qtpl:102
+ endpoint := ts.sw.Config.ScrapeURL
+ targetID := getTargetID(ts.sw)
+ lastScrapeTime := ts.getDurationFromLastScrape()
+
+//line lib/promscrape/targetstatus.qtpl:106
+ if onlyUnhealthy && ts.up {
+//line lib/promscrape/targetstatus.qtpl:106
+ continue
+//line lib/promscrape/targetstatus.qtpl:106
+ }
+//line lib/promscrape/targetstatus.qtpl:106
+ qw422016.N().S(``)
+//line lib/promscrape/targetstatus.qtpl:108
+ qw422016.E().S(endpoint)
+//line lib/promscrape/targetstatus.qtpl:108
+ qw422016.N().S(` (response) | `)
+//line lib/promscrape/targetstatus.qtpl:111
+ if ts.up {
+//line lib/promscrape/targetstatus.qtpl:111
+ qw422016.N().S(`UP`)
+//line lib/promscrape/targetstatus.qtpl:111
+ } else {
+//line lib/promscrape/targetstatus.qtpl:111
+ qw422016.N().S(`DOWN`)
+//line lib/promscrape/targetstatus.qtpl:111
+ }
+//line lib/promscrape/targetstatus.qtpl:111
+ qw422016.N().S(` | `)
+//line lib/promscrape/targetstatus.qtpl:114
+ streamformatLabel(qw422016, promrelabel.FinalizeLabels(nil, ts.sw.Config.Labels))
+//line lib/promscrape/targetstatus.qtpl:114
+ qw422016.N().S(` `)
+//line lib/promscrape/targetstatus.qtpl:117
+ streamformatLabel(qw422016, ts.sw.Config.OriginalLabels)
+//line lib/promscrape/targetstatus.qtpl:117
+ qw422016.N().S(` | `)
+//line lib/promscrape/targetstatus.qtpl:120
+ qw422016.N().D(ts.scrapesTotal)
+//line lib/promscrape/targetstatus.qtpl:120
+ qw422016.N().S(` | `)
+//line lib/promscrape/targetstatus.qtpl:121
+ qw422016.N().D(ts.scrapesFailed)
+//line lib/promscrape/targetstatus.qtpl:121
+ qw422016.N().S(` | `)
+//line lib/promscrape/targetstatus.qtpl:123
+ if lastScrapeTime < 365*24*time.Hour {
+//line lib/promscrape/targetstatus.qtpl:124
+ qw422016.N().FPrec(lastScrapeTime.Seconds(), 3)
+//line lib/promscrape/targetstatus.qtpl:124
+ qw422016.N().S(`s ago`)
+//line lib/promscrape/targetstatus.qtpl:125
+ } else {
+//line lib/promscrape/targetstatus.qtpl:125
+ qw422016.N().S(`none`)
+//line lib/promscrape/targetstatus.qtpl:127
+ }
+//line lib/promscrape/targetstatus.qtpl:127
+ qw422016.N().S(` | `)
+//line lib/promscrape/targetstatus.qtpl:128
+ qw422016.N().D(int(ts.scrapeDuration))
+//line lib/promscrape/targetstatus.qtpl:128
+ qw422016.N().S(`ms | `)
+//line lib/promscrape/targetstatus.qtpl:129
+ qw422016.N().D(ts.samplesScraped)
+//line lib/promscrape/targetstatus.qtpl:129
+ qw422016.N().S(` | `)
+//line lib/promscrape/targetstatus.qtpl:130
+ if ts.err != nil {
+//line lib/promscrape/targetstatus.qtpl:130
+ qw422016.E().S(ts.err.Error())
+//line lib/promscrape/targetstatus.qtpl:130
+ }
+//line lib/promscrape/targetstatus.qtpl:130
+ qw422016.N().S(` |
`)
+//line lib/promscrape/targetstatus.qtpl:132
+ }
+//line lib/promscrape/targetstatus.qtpl:132
+ qw422016.N().S(`
`)
+//line lib/promscrape/targetstatus.qtpl:137
+ }
+//line lib/promscrape/targetstatus.qtpl:139
+ for _, jobName := range emptyJobs {
+//line lib/promscrape/targetstatus.qtpl:139
+ qw422016.N().S(`
Endpoint | State | Labels | Last Scrape | Scrape Duration | Samples Scraped | Error |
---|
`)
+//line lib/promscrape/targetstatus.qtpl:158
+ }
+//line lib/promscrape/targetstatus.qtpl:158
+ qw422016.N().S(``)
+//line lib/promscrape/targetstatus.qtpl:161
+}
+
+//line lib/promscrape/targetstatus.qtpl:161
+func WriteTargetsResponseHTML(qq422016 qtio422016.Writer, jts []jobTargetsStatuses, emptyJobs []string, onlyUnhealthy bool) {
+//line lib/promscrape/targetstatus.qtpl:161
+ qw422016 := qt422016.AcquireWriter(qq422016)
+//line lib/promscrape/targetstatus.qtpl:161
+ StreamTargetsResponseHTML(qw422016, jts, emptyJobs, onlyUnhealthy)
+//line lib/promscrape/targetstatus.qtpl:161
+ qt422016.ReleaseWriter(qw422016)
+//line lib/promscrape/targetstatus.qtpl:161
+}
+
+//line lib/promscrape/targetstatus.qtpl:161
+func TargetsResponseHTML(jts []jobTargetsStatuses, emptyJobs []string, onlyUnhealthy bool) string {
+//line lib/promscrape/targetstatus.qtpl:161
+ qb422016 := qt422016.AcquireByteBuffer()
+//line lib/promscrape/targetstatus.qtpl:161
+ WriteTargetsResponseHTML(qb422016, jts, emptyJobs, onlyUnhealthy)
+//line lib/promscrape/targetstatus.qtpl:161
+ qs422016 := string(qb422016.B)
+//line lib/promscrape/targetstatus.qtpl:161
+ qt422016.ReleaseByteBuffer(qb422016)
+//line lib/promscrape/targetstatus.qtpl:161
+ return qs422016
+//line lib/promscrape/targetstatus.qtpl:161
+}
+
+//line lib/promscrape/targetstatus.qtpl:163
+func streamformatLabel(qw422016 *qt422016.Writer, labels []prompbmarshal.Label) {
+//line lib/promscrape/targetstatus.qtpl:163
+ qw422016.N().S(`{`)
+//line lib/promscrape/targetstatus.qtpl:165
+ for i, label := range labels {
+//line lib/promscrape/targetstatus.qtpl:166
+ qw422016.E().S(label.Name)
+//line lib/promscrape/targetstatus.qtpl:166
+ qw422016.N().S(`=`)
+//line lib/promscrape/targetstatus.qtpl:166
+ qw422016.E().Q(label.Value)
+//line lib/promscrape/targetstatus.qtpl:167
+ if i+1 < len(labels) {
+//line lib/promscrape/targetstatus.qtpl:167
+ qw422016.N().S(`,`)
+//line lib/promscrape/targetstatus.qtpl:167
+ qw422016.N().S(` `)
+//line lib/promscrape/targetstatus.qtpl:167
+ }
+//line lib/promscrape/targetstatus.qtpl:168
+ }
+//line lib/promscrape/targetstatus.qtpl:168
+ qw422016.N().S(`}`)
+//line lib/promscrape/targetstatus.qtpl:170
+}
+
+//line lib/promscrape/targetstatus.qtpl:170
+func writeformatLabel(qq422016 qtio422016.Writer, labels []prompbmarshal.Label) {
+//line lib/promscrape/targetstatus.qtpl:170
+ qw422016 := qt422016.AcquireWriter(qq422016)
+//line lib/promscrape/targetstatus.qtpl:170
+ streamformatLabel(qw422016, labels)
+//line lib/promscrape/targetstatus.qtpl:170
+ qt422016.ReleaseWriter(qw422016)
+//line lib/promscrape/targetstatus.qtpl:170
+}
+
+//line lib/promscrape/targetstatus.qtpl:170
+func formatLabel(labels []prompbmarshal.Label) string {
+//line lib/promscrape/targetstatus.qtpl:170
+ qb422016 := qt422016.AcquireByteBuffer()
+//line lib/promscrape/targetstatus.qtpl:170
+ writeformatLabel(qb422016, labels)
+//line lib/promscrape/targetstatus.qtpl:170
+ qs422016 := string(qb422016.B)
+//line lib/promscrape/targetstatus.qtpl:170
+ qt422016.ReleaseByteBuffer(qb422016)
+//line lib/promscrape/targetstatus.qtpl:170
+ return qs422016
+//line lib/promscrape/targetstatus.qtpl:170
+}