Skip to content

Commit 51576db

Browse files
committed
make probe_http_requests_failed_total a counter instead of a rate
`probe_http_requests_failed` is emitted as a rate now, as the original metric is
1 parent d5e7694 commit 51576db

File tree

3 files changed

+47
-11
lines changed

3 files changed

+47
-11
lines changed

integration/integration_test.go

+25-5
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,8 @@ func TestSMK6(t *testing.T) {
8383
"probe_http_error_code",
8484
"probe_http_got_expected_response",
8585
"probe_http_info",
86-
"probe_http_requests_failed_total",
86+
"probe_http_requests_failed", // Original rate.
87+
"probe_http_requests_failed_total", // Computed counter.
8788
"probe_http_requests_total",
8889
"probe_http_ssl",
8990
"probe_http_status_code",
@@ -107,7 +108,7 @@ func TestSMK6(t *testing.T) {
107108

108109
unwantedMetrics := []string{
109110
"probe_checks",
110-
"probe_http_reqs", "probe_http_req_failed",
111+
"probe_http_reqs", "probe_http_req_failed", // Renamed s/req/requests.
111112
"probe_data_sent", "probe_data_received",
112113
"probe_http_req_duration", "probe_iteration_duration",
113114
"probe_http_req_blocked", "probe_http_req_connecting", "probe_http_req_receiving", "probe_http_req_sending", "probe_http_req_tls_handshaking", "probe_http_req_waiting",
@@ -282,9 +283,28 @@ func TestSMK6(t *testing.T) {
282283
assertValue: equals(0),
283284
},
284285
{
285-
name: "Total requests for each url",
286-
metricName: "probe_http_requests_total",
287-
assertValue: equals(1),
286+
name: "Total requests for a URL accessed once",
287+
metricName: "probe_http_requests_total",
288+
metricLabels: map[string]string{"url": "https://test-api.k6.io/public/crocodiles/"},
289+
assertValue: equals(1),
290+
},
291+
{
292+
name: "Total requests for a URL accessed twice",
293+
metricName: "probe_http_requests_total",
294+
metricLabels: map[string]string{"url": "https://test-api.k6.io/public/crocodiles4/"},
295+
assertValue: equals(2),
296+
},
297+
{
298+
name: "HTTP requests failed rate",
299+
metricName: "probe_http_requests_failed",
300+
metricLabels: map[string]string{"url": "https://test-api.k6.io/public/crocodiles4/"},
301+
assertValue: equals(1),
302+
},
303+
{
304+
name: "HTTP requests failed ttoal",
305+
metricName: "probe_http_requests_failed_total",
306+
metricLabels: map[string]string{"url": "https://test-api.k6.io/public/crocodiles4/"},
307+
assertValue: equals(2),
288308
},
289309
{
290310
name: "HTTP version",

integration/test-script.js

+1
Original file line numberDiff line numberDiff line change
@@ -41,5 +41,6 @@ export default function () {
4141
http.get(`https://${testHost}/public/crocodiles2/`); // 404
4242
http.get(`https://${testHost}/public/crocodiles3/`); // 404
4343
http.get(`https://${testHost}/public/crocodiles4/`); // 404
44+
http.get(`https://${testHost}/public/crocodiles4/`); // Second 404, to assert differences between failure rate and counter.
4445
http.get(`http://fail.internal/public/crocodiles4/`); // failed
4546
}

output.go

+21-6
Original file line numberDiff line numberDiff line change
@@ -253,12 +253,27 @@ func (ms *metricStore) DeriveMetrics() {
253253
log.Tracef("Created %q from %q", httpVersionTS.name, ts.name)
254254
}()
255255

256-
// Rename to http_requests_failed_total
256+
// http_req_failed is a rate, and traditionally we have reported http_requests_failed_total (as a counter)
257+
// Here we derive the total from the rate.
257258
case "http_req_failed":
258-
newTS := ts
259-
newTS.name = "http_requests_failed_total"
260-
ms.store[newTS] = v
261-
log.Tracef("Created %q from %q", newTS.name, ts.name)
259+
// Derive the counter
260+
func() {
261+
failedTotal := ts
262+
failedTotal.name = "http_requests_failed_total"
263+
ms.store[failedTotal] = value{
264+
// Number of failures is the (computed) avg failure rate times the number of samples.
265+
value: math.Round(float64(v.seenSamples) * v.value),
266+
seenSamples: 1,
267+
}
268+
log.Tracef("Created %q from %q", failedTotal.name, ts.name)
269+
}()
270+
// Also rename it to s/req/requests.
271+
func() {
272+
newTS := ts
273+
newTS.name = "http_requests_failed"
274+
ms.store[newTS] = v
275+
log.Tracef("Created %q from %q", newTS.name, ts.name)
276+
}()
262277

263278
// Add _bytes suffix to data_sent and data_received.
264279
case "data_sent", "data_received":
@@ -426,7 +441,7 @@ func (ms *metricStore) RemoveMetrics() {
426441
"iteration_duration": true,
427442
// Squashed into a single metric with a phase label.
428443
"http_req_blocked": true, "http_req_connecting": true, "http_req_receiving": true, "http_req_sending": true, "http_req_tls_handshaking": true, "http_req_waiting": true,
429-
// Renamed to http_requests(_failed)_total.
444+
// Renamed s/reqs/requests.
430445
"http_reqs": true,
431446
"http_req_failed": true,
432447
// Replaced by check_rate and checks_total

0 commit comments

Comments
 (0)