lib/promscrape: show the number of samples collected during the last scrape at /targets and /api/v1/targets pages

Updates https://github.com/VictoriaMetrics/VictoriaMetrics/issues/1377
This commit is contained in:
Aliaksandr Valialkin 2021-06-14 14:01:13 +03:00
parent fb8114ad9c
commit 5f91a701fa
5 changed files with 160 additions and 143 deletions

View File

@ -7,6 +7,7 @@ sort: 15
## tip ## tip
* FEATURE: vmagent: add service discovery for DigitalOcean (aka [digitalocean_sd_config](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#digitalocean_sd_config)). See [this feature request](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/1367). * FEATURE: vmagent: add service discovery for DigitalOcean (aka [digitalocean_sd_config](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#digitalocean_sd_config)). See [this feature request](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/1367).
* FEATURE: vmagent: show the number of samples the target returned during the last scrape on `/targets` and `/api/v1/targets` pages. This should simplify debugging targets, which may return too big or too low number of samples. See [this feature request](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/1377).
## [v1.61.1](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.61.1) ## [v1.61.1](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.61.1)

View File

@ -324,7 +324,7 @@ func (sw *scrapeWork) scrapeInternal(scrapeTimestamp, realTimestamp int64) error
// body must be released only after wc is released, since wc refers to body. // body must be released only after wc is released, since wc refers to body.
sw.prevBodyLen = len(body.B) sw.prevBodyLen = len(body.B)
leveledbytebufferpool.Put(body) leveledbytebufferpool.Put(body)
tsmGlobal.Update(sw.Config, sw.ScrapeGroup, up == 1, realTimestamp, int64(duration*1000), err) tsmGlobal.Update(sw.Config, sw.ScrapeGroup, up == 1, realTimestamp, int64(duration*1000), samplesScraped, err)
return err return err
} }
@ -391,7 +391,7 @@ func (sw *scrapeWork) scrapeStream(scrapeTimestamp, realTimestamp int64) error {
sw.prevLabelsLen = len(wc.labels) sw.prevLabelsLen = len(wc.labels)
wc.reset() wc.reset()
writeRequestCtxPool.Put(wc) writeRequestCtxPool.Put(wc)
tsmGlobal.Update(sw.Config, sw.ScrapeGroup, up == 1, realTimestamp, int64(duration*1000), err) tsmGlobal.Update(sw.Config, sw.ScrapeGroup, up == 1, realTimestamp, int64(duration*1000), samplesScraped, err)
return err return err
} }

View File

@ -19,7 +19,8 @@ job={%q= js.job %} ({%d js.upCount %}/{%d js.targetsTotal %} up)
{% if showOriginLabels %}, originalLabels={%s= ol %}{% endif %}, {% if showOriginLabels %}, originalLabels={%s= ol %}{% endif %},
last_scrape={%f.3 ts.lastScrapeTime.Seconds() %}s ago, last_scrape={%f.3 ts.lastScrapeTime.Seconds() %}s ago,
scrape_duration={%f.3 ts.scrapeDuration.Seconds() %}s, scrape_duration={%f.3 ts.scrapeDuration.Seconds() %}s,
error={%q= ts.error %} samples_scraped={%d ts.samplesScraped %},
error={%q= ts.errMsg %}
{% newline %} {% newline %}
{% endfor %} {% endfor %}
{% endfor %} {% endfor %}
@ -62,6 +63,7 @@ job={%q= js.job %} ({%d js.upCount %}/{%d js.targetsTotal %} up)
<th scope="col">Labels</th> <th scope="col">Labels</th>
<th scope="col">Last Scrape</th> <th scope="col">Last Scrape</th>
<th scope="col">Scrape Duration</th> <th scope="col">Scrape Duration</th>
<th scope="col">Samples Scraped</th>
<th scope="col">Error</th> <th scope="col">Error</th>
</tr> </tr>
</thead> </thead>
@ -76,7 +78,8 @@ job={%q= js.job %} ({%d js.upCount %}/{%d js.targetsTotal %} up)
</td> </td>
<td>{%f.3 ts.lastScrapeTime.Seconds() %}s ago</td> <td>{%f.3 ts.lastScrapeTime.Seconds() %}s ago</td>
<td>{%f.3 ts.scrapeDuration.Seconds() %}s</td> <td>{%f.3 ts.scrapeDuration.Seconds() %}s</td>
<td>{%s ts.error %}</td> <td>{%d ts.samplesScraped %}</td>
<td>{%s ts.errMsg %}</td>
</tr> </tr>
{% endfor %} {% endfor %}
</tbody> </tbody>

View File

@ -94,18 +94,18 @@ func StreamTargetsResponsePlain(qw422016 *qt422016.Writer, jts []jobTargetsStatu
//line lib/promscrape/targets_response.qtpl:21 //line lib/promscrape/targets_response.qtpl:21
qw422016.N().FPrec(ts.scrapeDuration.Seconds(), 3) qw422016.N().FPrec(ts.scrapeDuration.Seconds(), 3)
//line lib/promscrape/targets_response.qtpl:21 //line lib/promscrape/targets_response.qtpl:21
qw422016.N().S(`s, error=`) qw422016.N().S(`s, samples_scraped=`)
//line lib/promscrape/targets_response.qtpl:22 //line lib/promscrape/targets_response.qtpl:22
qw422016.N().Q(ts.error) qw422016.N().D(ts.samplesScraped)
//line lib/promscrape/targets_response.qtpl:22 //line lib/promscrape/targets_response.qtpl:22
qw422016.N().S(` `) qw422016.N().S(`, error=`)
//line lib/promscrape/targets_response.qtpl:23 //line lib/promscrape/targets_response.qtpl:23
qw422016.N().S(` qw422016.N().Q(ts.errMsg)
`)
//line lib/promscrape/targets_response.qtpl:23 //line lib/promscrape/targets_response.qtpl:23
qw422016.N().S(` `) qw422016.N().S(` `)
//line lib/promscrape/targets_response.qtpl:24 //line lib/promscrape/targets_response.qtpl:24
} qw422016.N().S(`
`)
//line lib/promscrape/targets_response.qtpl:24 //line lib/promscrape/targets_response.qtpl:24
qw422016.N().S(` `) qw422016.N().S(` `)
//line lib/promscrape/targets_response.qtpl:25 //line lib/promscrape/targets_response.qtpl:25
@ -113,261 +113,269 @@ func StreamTargetsResponsePlain(qw422016 *qt422016.Writer, jts []jobTargetsStatu
//line lib/promscrape/targets_response.qtpl:25 //line lib/promscrape/targets_response.qtpl:25
qw422016.N().S(` `) qw422016.N().S(` `)
//line lib/promscrape/targets_response.qtpl:26 //line lib/promscrape/targets_response.qtpl:26
qw422016.N().S(` }
`)
//line lib/promscrape/targets_response.qtpl:26 //line lib/promscrape/targets_response.qtpl:26
qw422016.N().S(` `) qw422016.N().S(` `)
//line lib/promscrape/targets_response.qtpl:28 //line lib/promscrape/targets_response.qtpl:27
qw422016.N().S(`
`)
//line lib/promscrape/targets_response.qtpl:27
qw422016.N().S(` `)
//line lib/promscrape/targets_response.qtpl:29
} }
//line lib/promscrape/targets_response.qtpl:28 //line lib/promscrape/targets_response.qtpl:29
func WriteTargetsResponsePlain(qq422016 qtio422016.Writer, jts []jobTargetsStatuses, showOriginLabels bool) { func WriteTargetsResponsePlain(qq422016 qtio422016.Writer, jts []jobTargetsStatuses, showOriginLabels bool) {
//line lib/promscrape/targets_response.qtpl:28 //line lib/promscrape/targets_response.qtpl:29
qw422016 := qt422016.AcquireWriter(qq422016) qw422016 := qt422016.AcquireWriter(qq422016)
//line lib/promscrape/targets_response.qtpl:28 //line lib/promscrape/targets_response.qtpl:29
StreamTargetsResponsePlain(qw422016, jts, showOriginLabels) StreamTargetsResponsePlain(qw422016, jts, showOriginLabels)
//line lib/promscrape/targets_response.qtpl:28 //line lib/promscrape/targets_response.qtpl:29
qt422016.ReleaseWriter(qw422016) qt422016.ReleaseWriter(qw422016)
//line lib/promscrape/targets_response.qtpl:28 //line lib/promscrape/targets_response.qtpl:29
} }
//line lib/promscrape/targets_response.qtpl:28 //line lib/promscrape/targets_response.qtpl:29
func TargetsResponsePlain(jts []jobTargetsStatuses, showOriginLabels bool) string { func TargetsResponsePlain(jts []jobTargetsStatuses, showOriginLabels bool) string {
//line lib/promscrape/targets_response.qtpl:28 //line lib/promscrape/targets_response.qtpl:29
qb422016 := qt422016.AcquireByteBuffer() qb422016 := qt422016.AcquireByteBuffer()
//line lib/promscrape/targets_response.qtpl:28 //line lib/promscrape/targets_response.qtpl:29
WriteTargetsResponsePlain(qb422016, jts, showOriginLabels) WriteTargetsResponsePlain(qb422016, jts, showOriginLabels)
//line lib/promscrape/targets_response.qtpl:28 //line lib/promscrape/targets_response.qtpl:29
qs422016 := string(qb422016.B) qs422016 := string(qb422016.B)
//line lib/promscrape/targets_response.qtpl:28 //line lib/promscrape/targets_response.qtpl:29
qt422016.ReleaseByteBuffer(qb422016) qt422016.ReleaseByteBuffer(qb422016)
//line lib/promscrape/targets_response.qtpl:28 //line lib/promscrape/targets_response.qtpl:29
return qs422016 return qs422016
//line lib/promscrape/targets_response.qtpl:28 //line lib/promscrape/targets_response.qtpl:29
} }
//line lib/promscrape/targets_response.qtpl:30 //line lib/promscrape/targets_response.qtpl:31
func StreamTargetsResponseHTML(qw422016 *qt422016.Writer, jts []jobTargetsStatuses, redirectPath string, onlyUnhealthy bool) { func StreamTargetsResponseHTML(qw422016 *qt422016.Writer, jts []jobTargetsStatuses, redirectPath string, onlyUnhealthy bool) {
//line lib/promscrape/targets_response.qtpl:30 //line lib/promscrape/targets_response.qtpl:31
qw422016.N().S(` <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-giJF6kkoqNQ00vy+HMDP7azOuL0xtbfIcaT9wjKHr8RbDVddVHyTfAAsrekwKmP1" crossorigin="anonymous"> <title>Scrape targets</title> </head> <body class="m-3"> <h1>Scrape targets</h1> <div> <button type="button" class="btn `) qw422016.N().S(` <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-giJF6kkoqNQ00vy+HMDP7azOuL0xtbfIcaT9wjKHr8RbDVddVHyTfAAsrekwKmP1" crossorigin="anonymous"> <title>Scrape targets</title> </head> <body class="m-3"> <h1>Scrape targets</h1> <div> <button type="button" class="btn `)
//line lib/promscrape/targets_response.qtpl:42 //line lib/promscrape/targets_response.qtpl:43
if !onlyUnhealthy { if !onlyUnhealthy {
//line lib/promscrape/targets_response.qtpl:42 //line lib/promscrape/targets_response.qtpl:43
qw422016.N().S(`btn-primary`) qw422016.N().S(`btn-primary`)
//line lib/promscrape/targets_response.qtpl:42 //line lib/promscrape/targets_response.qtpl:43
} else { } else {
//line lib/promscrape/targets_response.qtpl:42 //line lib/promscrape/targets_response.qtpl:43
qw422016.N().S(`btn-secondary`) qw422016.N().S(`btn-secondary`)
//line lib/promscrape/targets_response.qtpl:42 //line lib/promscrape/targets_response.qtpl:43
} }
//line lib/promscrape/targets_response.qtpl:42 //line lib/promscrape/targets_response.qtpl:43
qw422016.N().S(`" `) qw422016.N().S(`" `)
//line lib/promscrape/targets_response.qtpl:43 //line lib/promscrape/targets_response.qtpl:44
if onlyUnhealthy { if onlyUnhealthy {
//line lib/promscrape/targets_response.qtpl:43 //line lib/promscrape/targets_response.qtpl:44
qw422016.N().S(`onclick="location.href='`) qw422016.N().S(`onclick="location.href='`)
//line lib/promscrape/targets_response.qtpl:43 //line lib/promscrape/targets_response.qtpl:44
qw422016.E().S(redirectPath) qw422016.E().S(redirectPath)
//line lib/promscrape/targets_response.qtpl:43 //line lib/promscrape/targets_response.qtpl:44
qw422016.N().S(`'"`) qw422016.N().S(`'"`)
//line lib/promscrape/targets_response.qtpl:43 //line lib/promscrape/targets_response.qtpl:44
} }
//line lib/promscrape/targets_response.qtpl:43 //line lib/promscrape/targets_response.qtpl:44
qw422016.N().S(`> All </button> <button type="button" class="btn `) qw422016.N().S(`> All </button> <button type="button" class="btn `)
//line lib/promscrape/targets_response.qtpl:46 //line lib/promscrape/targets_response.qtpl:47
if onlyUnhealthy { if onlyUnhealthy {
//line lib/promscrape/targets_response.qtpl:46 //line lib/promscrape/targets_response.qtpl:47
qw422016.N().S(`btn-primary`) qw422016.N().S(`btn-primary`)
//line lib/promscrape/targets_response.qtpl:46 //line lib/promscrape/targets_response.qtpl:47
} else { } else {
//line lib/promscrape/targets_response.qtpl:46 //line lib/promscrape/targets_response.qtpl:47
qw422016.N().S(`btn-secondary`) qw422016.N().S(`btn-secondary`)
//line lib/promscrape/targets_response.qtpl:46 //line lib/promscrape/targets_response.qtpl:47
} }
//line lib/promscrape/targets_response.qtpl:46 //line lib/promscrape/targets_response.qtpl:47
qw422016.N().S(`" `) qw422016.N().S(`" `)
//line lib/promscrape/targets_response.qtpl:47 //line lib/promscrape/targets_response.qtpl:48
if !onlyUnhealthy { if !onlyUnhealthy {
//line lib/promscrape/targets_response.qtpl:47 //line lib/promscrape/targets_response.qtpl:48
qw422016.N().S(`onclick="location.href='`) qw422016.N().S(`onclick="location.href='`)
//line lib/promscrape/targets_response.qtpl:47 //line lib/promscrape/targets_response.qtpl:48
qw422016.N().S(redirectPath) qw422016.N().S(redirectPath)
//line lib/promscrape/targets_response.qtpl:47 //line lib/promscrape/targets_response.qtpl:48
qw422016.N().S(`?show_only_unhealthy=true'"`) qw422016.N().S(`?show_only_unhealthy=true'"`)
//line lib/promscrape/targets_response.qtpl:47 //line lib/promscrape/targets_response.qtpl:48
} }
//line lib/promscrape/targets_response.qtpl:47 //line lib/promscrape/targets_response.qtpl:48
qw422016.N().S(`> Unhealthy </button> </div> `) qw422016.N().S(`> Unhealthy </button> </div> `)
//line lib/promscrape/targets_response.qtpl:51 //line lib/promscrape/targets_response.qtpl:52
for _, js := range jts { for _, js := range jts {
//line lib/promscrape/targets_response.qtpl:51
qw422016.N().S(` `)
//line lib/promscrape/targets_response.qtpl:52 //line lib/promscrape/targets_response.qtpl:52
qw422016.N().S(` `)
//line lib/promscrape/targets_response.qtpl:53
if onlyUnhealthy && js.upCount == js.targetsTotal { if onlyUnhealthy && js.upCount == js.targetsTotal {
//line lib/promscrape/targets_response.qtpl:52 //line lib/promscrape/targets_response.qtpl:53
continue continue
//line lib/promscrape/targets_response.qtpl:52 //line lib/promscrape/targets_response.qtpl:53
} }
//line lib/promscrape/targets_response.qtpl:52 //line lib/promscrape/targets_response.qtpl:53
qw422016.N().S(` <div> <h4> <a>`) qw422016.N().S(` <div> <h4> <a>`)
//line lib/promscrape/targets_response.qtpl:55 //line lib/promscrape/targets_response.qtpl:56
qw422016.E().S(js.job) qw422016.E().S(js.job)
//line lib/promscrape/targets_response.qtpl:55 //line lib/promscrape/targets_response.qtpl:56
qw422016.N().S(` (`) qw422016.N().S(` (`)
//line lib/promscrape/targets_response.qtpl:55 //line lib/promscrape/targets_response.qtpl:56
qw422016.N().D(js.upCount) qw422016.N().D(js.upCount)
//line lib/promscrape/targets_response.qtpl:55 //line lib/promscrape/targets_response.qtpl:56
qw422016.N().S(`/`) qw422016.N().S(`/`)
//line lib/promscrape/targets_response.qtpl:55 //line lib/promscrape/targets_response.qtpl:56
qw422016.N().D(js.targetsTotal) qw422016.N().D(js.targetsTotal)
//line lib/promscrape/targets_response.qtpl:55 //line lib/promscrape/targets_response.qtpl:56
qw422016.N().S(` up)</a> </h4> <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">Labels</th> <th scope="col">Last Scrape</th> <th scope="col">Scrape Duration</th> <th scope="col">Error</th> </tr> </thead> <tbody> `) qw422016.N().S(` up)</a> </h4> <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">Labels</th> <th scope="col">Last Scrape</th> <th scope="col">Scrape Duration</th> <th scope="col">Samples Scraped</th> <th scope="col">Error</th> </tr> </thead> <tbody> `)
//line lib/promscrape/targets_response.qtpl:69 //line lib/promscrape/targets_response.qtpl:71
for _, ts := range js.targetsStatus { for _, ts := range js.targetsStatus {
//line lib/promscrape/targets_response.qtpl:69 //line lib/promscrape/targets_response.qtpl:71
qw422016.N().S(` `) qw422016.N().S(` `)
//line lib/promscrape/targets_response.qtpl:70 //line lib/promscrape/targets_response.qtpl:72
if onlyUnhealthy && ts.up { if onlyUnhealthy && ts.up {
//line lib/promscrape/targets_response.qtpl:70 //line lib/promscrape/targets_response.qtpl:72
continue continue
//line lib/promscrape/targets_response.qtpl:70 //line lib/promscrape/targets_response.qtpl:72
} }
//line lib/promscrape/targets_response.qtpl:70 //line lib/promscrape/targets_response.qtpl:72
qw422016.N().S(` <tr `) qw422016.N().S(` <tr `)
//line lib/promscrape/targets_response.qtpl:71 //line lib/promscrape/targets_response.qtpl:73
if !ts.up { if !ts.up {
//line lib/promscrape/targets_response.qtpl:71 //line lib/promscrape/targets_response.qtpl:73
qw422016.N().S(`class="alert alert-danger" role="alert"`) qw422016.N().S(`class="alert alert-danger" role="alert"`)
//line lib/promscrape/targets_response.qtpl:71 //line lib/promscrape/targets_response.qtpl:73
} }
//line lib/promscrape/targets_response.qtpl:71 //line lib/promscrape/targets_response.qtpl:73
qw422016.N().S(`> <td><a href="`) qw422016.N().S(`> <td><a href="`)
//line lib/promscrape/targets_response.qtpl:72 //line lib/promscrape/targets_response.qtpl:74
qw422016.E().S(ts.endpoint) qw422016.E().S(ts.endpoint)
//line lib/promscrape/targets_response.qtpl:72 //line lib/promscrape/targets_response.qtpl:74
qw422016.N().S(`">`) qw422016.N().S(`">`)
//line lib/promscrape/targets_response.qtpl:72 //line lib/promscrape/targets_response.qtpl:74
qw422016.E().S(ts.endpoint) qw422016.E().S(ts.endpoint)
//line lib/promscrape/targets_response.qtpl:72 //line lib/promscrape/targets_response.qtpl:74
qw422016.N().S(`</a><br></td> <td>`) qw422016.N().S(`</a><br></td> <td>`)
//line lib/promscrape/targets_response.qtpl:73 //line lib/promscrape/targets_response.qtpl:75
if ts.up { if ts.up {
//line lib/promscrape/targets_response.qtpl:73 //line lib/promscrape/targets_response.qtpl:75
qw422016.N().S(`UP`) qw422016.N().S(`UP`)
//line lib/promscrape/targets_response.qtpl:73 //line lib/promscrape/targets_response.qtpl:75
} else { } else {
//line lib/promscrape/targets_response.qtpl:73 //line lib/promscrape/targets_response.qtpl:75
qw422016.N().S(`DOWN`) qw422016.N().S(`DOWN`)
//line lib/promscrape/targets_response.qtpl:73 //line lib/promscrape/targets_response.qtpl:75
} }
//line lib/promscrape/targets_response.qtpl:73 //line lib/promscrape/targets_response.qtpl:75
qw422016.N().S(`</td> <td title="Original labels: `) qw422016.N().S(`</td> <td title="Original labels: `)
//line lib/promscrape/targets_response.qtpl:74 //line lib/promscrape/targets_response.qtpl:76
streamformatLabel(qw422016, ts.originalLabels) streamformatLabel(qw422016, ts.originalLabels)
//line lib/promscrape/targets_response.qtpl:74 //line lib/promscrape/targets_response.qtpl:76
qw422016.N().S(`"> `) qw422016.N().S(`"> `)
//line lib/promscrape/targets_response.qtpl:75 //line lib/promscrape/targets_response.qtpl:77
streamformatLabel(qw422016, ts.labels) streamformatLabel(qw422016, ts.labels)
//line lib/promscrape/targets_response.qtpl:75 //line lib/promscrape/targets_response.qtpl:77
qw422016.N().S(` </td> <td>`) qw422016.N().S(` </td> <td>`)
//line lib/promscrape/targets_response.qtpl:77 //line lib/promscrape/targets_response.qtpl:79
qw422016.N().FPrec(ts.lastScrapeTime.Seconds(), 3) qw422016.N().FPrec(ts.lastScrapeTime.Seconds(), 3)
//line lib/promscrape/targets_response.qtpl:77 //line lib/promscrape/targets_response.qtpl:79
qw422016.N().S(`s ago</td> <td>`) qw422016.N().S(`s ago</td> <td>`)
//line lib/promscrape/targets_response.qtpl:78 //line lib/promscrape/targets_response.qtpl:80
qw422016.N().FPrec(ts.scrapeDuration.Seconds(), 3) qw422016.N().FPrec(ts.scrapeDuration.Seconds(), 3)
//line lib/promscrape/targets_response.qtpl:78 //line lib/promscrape/targets_response.qtpl:80
qw422016.N().S(`s</td> <td>`) qw422016.N().S(`s</td> <td>`)
//line lib/promscrape/targets_response.qtpl:79 //line lib/promscrape/targets_response.qtpl:81
qw422016.E().S(ts.error) qw422016.N().D(ts.samplesScraped)
//line lib/promscrape/targets_response.qtpl:79 //line lib/promscrape/targets_response.qtpl:81
qw422016.N().S(`</td> <td>`)
//line lib/promscrape/targets_response.qtpl:82
qw422016.E().S(ts.errMsg)
//line lib/promscrape/targets_response.qtpl:82
qw422016.N().S(`</td> </tr> `) qw422016.N().S(`</td> </tr> `)
//line lib/promscrape/targets_response.qtpl:81 //line lib/promscrape/targets_response.qtpl:84
} }
//line lib/promscrape/targets_response.qtpl:81 //line lib/promscrape/targets_response.qtpl:84
qw422016.N().S(` </tbody> </table> </div> `) qw422016.N().S(` </tbody> </table> </div> `)
//line lib/promscrape/targets_response.qtpl:85 //line lib/promscrape/targets_response.qtpl:88
} }
//line lib/promscrape/targets_response.qtpl:85 //line lib/promscrape/targets_response.qtpl:88
qw422016.N().S(` </body> </html> `) qw422016.N().S(` </body> </html> `)
//line lib/promscrape/targets_response.qtpl:88 //line lib/promscrape/targets_response.qtpl:91
} }
//line lib/promscrape/targets_response.qtpl:88 //line lib/promscrape/targets_response.qtpl:91
func WriteTargetsResponseHTML(qq422016 qtio422016.Writer, jts []jobTargetsStatuses, redirectPath string, onlyUnhealthy bool) { func WriteTargetsResponseHTML(qq422016 qtio422016.Writer, jts []jobTargetsStatuses, redirectPath string, onlyUnhealthy bool) {
//line lib/promscrape/targets_response.qtpl:88 //line lib/promscrape/targets_response.qtpl:91
qw422016 := qt422016.AcquireWriter(qq422016) qw422016 := qt422016.AcquireWriter(qq422016)
//line lib/promscrape/targets_response.qtpl:88 //line lib/promscrape/targets_response.qtpl:91
StreamTargetsResponseHTML(qw422016, jts, redirectPath, onlyUnhealthy) StreamTargetsResponseHTML(qw422016, jts, redirectPath, onlyUnhealthy)
//line lib/promscrape/targets_response.qtpl:88 //line lib/promscrape/targets_response.qtpl:91
qt422016.ReleaseWriter(qw422016) qt422016.ReleaseWriter(qw422016)
//line lib/promscrape/targets_response.qtpl:88 //line lib/promscrape/targets_response.qtpl:91
} }
//line lib/promscrape/targets_response.qtpl:88 //line lib/promscrape/targets_response.qtpl:91
func TargetsResponseHTML(jts []jobTargetsStatuses, redirectPath string, onlyUnhealthy bool) string { func TargetsResponseHTML(jts []jobTargetsStatuses, redirectPath string, onlyUnhealthy bool) string {
//line lib/promscrape/targets_response.qtpl:88 //line lib/promscrape/targets_response.qtpl:91
qb422016 := qt422016.AcquireByteBuffer() qb422016 := qt422016.AcquireByteBuffer()
//line lib/promscrape/targets_response.qtpl:88 //line lib/promscrape/targets_response.qtpl:91
WriteTargetsResponseHTML(qb422016, jts, redirectPath, onlyUnhealthy) WriteTargetsResponseHTML(qb422016, jts, redirectPath, onlyUnhealthy)
//line lib/promscrape/targets_response.qtpl:88 //line lib/promscrape/targets_response.qtpl:91
qs422016 := string(qb422016.B) qs422016 := string(qb422016.B)
//line lib/promscrape/targets_response.qtpl:88 //line lib/promscrape/targets_response.qtpl:91
qt422016.ReleaseByteBuffer(qb422016) qt422016.ReleaseByteBuffer(qb422016)
//line lib/promscrape/targets_response.qtpl:88 //line lib/promscrape/targets_response.qtpl:91
return qs422016 return qs422016
//line lib/promscrape/targets_response.qtpl:88 //line lib/promscrape/targets_response.qtpl:91
} }
//line lib/promscrape/targets_response.qtpl:90 //line lib/promscrape/targets_response.qtpl:93
func streamformatLabel(qw422016 *qt422016.Writer, labels []prompbmarshal.Label) { func streamformatLabel(qw422016 *qt422016.Writer, labels []prompbmarshal.Label) {
//line lib/promscrape/targets_response.qtpl:90 //line lib/promscrape/targets_response.qtpl:93
qw422016.N().S(` `) qw422016.N().S(` `)
//line lib/promscrape/targets_response.qtpl:91 //line lib/promscrape/targets_response.qtpl:94
for _, label := range labels { for _, label := range labels {
//line lib/promscrape/targets_response.qtpl:91 //line lib/promscrape/targets_response.qtpl:94
qw422016.N().S(` `) qw422016.N().S(` `)
//line lib/promscrape/targets_response.qtpl:92 //line lib/promscrape/targets_response.qtpl:95
qw422016.E().S(label.Name) qw422016.E().S(label.Name)
//line lib/promscrape/targets_response.qtpl:92 //line lib/promscrape/targets_response.qtpl:95
qw422016.N().S(`=`) qw422016.N().S(`=`)
//line lib/promscrape/targets_response.qtpl:92 //line lib/promscrape/targets_response.qtpl:95
qw422016.E().Q(label.Value) qw422016.E().Q(label.Value)
//line lib/promscrape/targets_response.qtpl:92 //line lib/promscrape/targets_response.qtpl:95
qw422016.N().S(` `) qw422016.N().S(` `)
//line lib/promscrape/targets_response.qtpl:92 //line lib/promscrape/targets_response.qtpl:95
qw422016.N().S(` `) qw422016.N().S(` `)
//line lib/promscrape/targets_response.qtpl:92 //line lib/promscrape/targets_response.qtpl:95
qw422016.N().S(` `) qw422016.N().S(` `)
//line lib/promscrape/targets_response.qtpl:93 //line lib/promscrape/targets_response.qtpl:96
} }
//line lib/promscrape/targets_response.qtpl:93 //line lib/promscrape/targets_response.qtpl:96
qw422016.N().S(` `) qw422016.N().S(` `)
//line lib/promscrape/targets_response.qtpl:94 //line lib/promscrape/targets_response.qtpl:97
} }
//line lib/promscrape/targets_response.qtpl:94 //line lib/promscrape/targets_response.qtpl:97
func writeformatLabel(qq422016 qtio422016.Writer, labels []prompbmarshal.Label) { func writeformatLabel(qq422016 qtio422016.Writer, labels []prompbmarshal.Label) {
//line lib/promscrape/targets_response.qtpl:94 //line lib/promscrape/targets_response.qtpl:97
qw422016 := qt422016.AcquireWriter(qq422016) qw422016 := qt422016.AcquireWriter(qq422016)
//line lib/promscrape/targets_response.qtpl:94 //line lib/promscrape/targets_response.qtpl:97
streamformatLabel(qw422016, labels) streamformatLabel(qw422016, labels)
//line lib/promscrape/targets_response.qtpl:94 //line lib/promscrape/targets_response.qtpl:97
qt422016.ReleaseWriter(qw422016) qt422016.ReleaseWriter(qw422016)
//line lib/promscrape/targets_response.qtpl:94 //line lib/promscrape/targets_response.qtpl:97
} }
//line lib/promscrape/targets_response.qtpl:94 //line lib/promscrape/targets_response.qtpl:97
func formatLabel(labels []prompbmarshal.Label) string { func formatLabel(labels []prompbmarshal.Label) string {
//line lib/promscrape/targets_response.qtpl:94 //line lib/promscrape/targets_response.qtpl:97
qb422016 := qt422016.AcquireByteBuffer() qb422016 := qt422016.AcquireByteBuffer()
//line lib/promscrape/targets_response.qtpl:94 //line lib/promscrape/targets_response.qtpl:97
writeformatLabel(qb422016, labels) writeformatLabel(qb422016, labels)
//line lib/promscrape/targets_response.qtpl:94 //line lib/promscrape/targets_response.qtpl:97
qs422016 := string(qb422016.B) qs422016 := string(qb422016.B)
//line lib/promscrape/targets_response.qtpl:94 //line lib/promscrape/targets_response.qtpl:97
qt422016.ReleaseByteBuffer(qb422016) qt422016.ReleaseByteBuffer(qb422016)
//line lib/promscrape/targets_response.qtpl:94 //line lib/promscrape/targets_response.qtpl:97
return qs422016 return qs422016
//line lib/promscrape/targets_response.qtpl:94 //line lib/promscrape/targets_response.qtpl:97
} }

View File

@ -88,7 +88,7 @@ func (tsm *targetStatusMap) Unregister(sw *ScrapeWork) {
tsm.mu.Unlock() tsm.mu.Unlock()
} }
func (tsm *targetStatusMap) Update(sw *ScrapeWork, group string, up bool, scrapeTime, scrapeDuration int64, err error) { func (tsm *targetStatusMap) Update(sw *ScrapeWork, group string, up bool, scrapeTime, scrapeDuration int64, samplesScraped int, err error) {
tsm.mu.Lock() tsm.mu.Lock()
ts := tsm.m[sw] ts := tsm.m[sw]
if ts == nil { if ts == nil {
@ -101,6 +101,7 @@ func (tsm *targetStatusMap) Update(sw *ScrapeWork, group string, up bool, scrape
ts.scrapeGroup = group ts.scrapeGroup = group
ts.scrapeTime = scrapeTime ts.scrapeTime = scrapeTime
ts.scrapeDuration = scrapeDuration ts.scrapeDuration = scrapeDuration
ts.samplesScraped = samplesScraped
ts.err = err ts.err = err
tsm.mu.Unlock() tsm.mu.Unlock()
} }
@ -156,6 +157,7 @@ func (tsm *targetStatusMap) WriteActiveTargetsJSON(w io.Writer) {
fmt.Fprintf(w, `,"lastError":%q`, errMsg) fmt.Fprintf(w, `,"lastError":%q`, errMsg)
fmt.Fprintf(w, `,"lastScrape":%q`, time.Unix(st.scrapeTime/1000, (st.scrapeTime%1000)*1e6).Format(time.RFC3339Nano)) fmt.Fprintf(w, `,"lastScrape":%q`, time.Unix(st.scrapeTime/1000, (st.scrapeTime%1000)*1e6).Format(time.RFC3339Nano))
fmt.Fprintf(w, `,"lastScrapeDuration":%g`, (time.Millisecond * time.Duration(st.scrapeDuration)).Seconds()) fmt.Fprintf(w, `,"lastScrapeDuration":%g`, (time.Millisecond * time.Duration(st.scrapeDuration)).Seconds())
fmt.Fprintf(w, `,"lastSamplesScraped":%d`, st.samplesScraped)
state := "up" state := "up"
if !st.up { if !st.up {
state = "down" state = "down"
@ -185,6 +187,7 @@ type targetStatus struct {
scrapeGroup string scrapeGroup string
scrapeTime int64 scrapeTime int64
scrapeDuration int64 scrapeDuration int64
samplesScraped int
err error err error
} }
@ -270,7 +273,8 @@ type jobTargetStatus struct {
originalLabels []prompbmarshal.Label originalLabels []prompbmarshal.Label
lastScrapeTime time.Duration lastScrapeTime time.Duration
scrapeDuration time.Duration scrapeDuration time.Duration
error string samplesScraped int
errMsg string
} }
type jobTargetsStatuses struct { type jobTargetsStatuses struct {
@ -313,7 +317,8 @@ func (tsm *targetStatusMap) getTargetsStatusByJob() []jobTargetsStatuses {
originalLabels: st.sw.OriginalLabels, originalLabels: st.sw.OriginalLabels,
lastScrapeTime: st.getDurationFromLastScrape(), lastScrapeTime: st.getDurationFromLastScrape(),
scrapeDuration: time.Duration(st.scrapeDuration) * time.Millisecond, scrapeDuration: time.Duration(st.scrapeDuration) * time.Millisecond,
error: errMsg, samplesScraped: st.samplesScraped,
errMsg: errMsg,
}) })
} }
jts = append(jts, jobTargetsStatuses{ jts = append(jts, jobTargetsStatuses{