branch: main
commit 724bef1703ebda7a807aec0b28184743e4e98901
Author: Ludovic Courtès <[email protected]>
AuthorDate: Sun Jan 5 22:09:54 2025 +0100
metrics: Change pending builds sampling period to 6h.
So far ‘pending-builds’ was effectively sampled every 24h.
* src/cuirass/metrics.scm (%pending-builds-sampling-period): New variable.
(timestamp): New procedure.
(db-current-day-timestamp): Remove.
(%metrics): Change ‘field-proc’ of ‘pending-builds’ to use ‘timestamp’.
(db-update-metrics): Update the ‘pending-builds’ and
‘pending-builds-per-system’ metrics with the same timestamp.
* tests/metrics.scm (pending-builds-timestamp): New variable.
("pending-builds", "pending-builds-per-system")
("pending-builds-per-system, aarch64-linux")
("pending-builds-per-system, x86_64-linux")
("db-update-metrics"): Use it instead of ‘today’.
---
src/cuirass/metrics.scm | 35 +++++++++++++++++++++--------------
tests/metrics.scm | 21 +++++++++++++--------
2 files changed, 34 insertions(+), 22 deletions(-)
diff --git a/src/cuirass/metrics.scm b/src/cuirass/metrics.scm
index 0578da3..12bfc11 100644
--- a/src/cuirass/metrics.scm
+++ b/src/cuirass/metrics.scm
@@ -39,6 +39,8 @@
metric->type
compute-metric
+ %pending-builds-sampling-period ;for tests
+
db-get-metric
db-get-metrics-with-id
db-update-metric
@@ -204,6 +206,19 @@ LEFT JOIN Builds as B
ON E.id = B.evaluation and B.stoptime > 0
GROUP BY E.id, E.evaltime;"))))
+(define %pending-builds-sampling-period
+ ;; Sampling period in seconds for the 'pending-builds' and
+ ;; 'pending-builds-per-system' metrics. More precisely, any additional
+ ;; sample taken during that period overwrites the previous sample of that
+ ;; same period.
+ (* 6 3600))
+
+(define (timestamp period)
+ "Return a timestamp (seconds since the Epoch) rounded to the previous
+PERIOD."
+ (let ((now (time-second (current-time time-utc))))
+ (- now (modulo now period))))
+
(define (db-previous-day-timestamp)
"Return the timestamp of the previous day."
(with-db-connection db
@@ -211,13 +226,6 @@ GROUP BY E.id, E.evaltime;"))))
(exec-query
db "SELECT extract(epoch from 'yesterday'::date);"))))
-(define (db-current-day-timestamp)
- "Return the timestamp of the current day."
- (with-db-connection db
- (return-exact
- (exec-query
- db "SELECT extract(epoch from 'today'::date);"))))
-
(define* (db-latest-evaluations #:key (days 3))
"Return the successful evaluations added during the previous DAYS."
(with-db-connection db
@@ -289,7 +297,7 @@ to_timestamp(stoptime)::date > 'today'::date - interval '1
day'"))))
(metric
(id 'pending-builds)
(compute-proc (lambda (_) (db-pending-builds)))
- (field-proc db-current-day-timestamp))
+ (field-proc (cut timestamp %pending-builds-sampling-period)))
;; New derivations per day.
(metric
@@ -474,15 +482,14 @@ UPDATE SET value = " value ", timestamp = " timestamp
";"))
(with-transaction db
(db-update-metric 'builds-per-day)
(db-update-metric 'new-derivations-per-day)
- (db-update-metric 'pending-builds)
- ;; Update per-system pending build metrics; use the today-at-midnight
- ;; as the timestamp, just like for the 'pending-builds' metric.
- (let* ((now (time-second (current-time time-utc)))
- (today (- now (modulo now 86400))))
+ ;; Update per-system pending build metrics; use the same timestamp as
+ ;; for the 'pending-builds' metric.
+ (let ((time (timestamp %pending-builds-sampling-period)))
+ (db-update-metric 'pending-builds time)
(for-each (lambda (system)
(db-update-metric 'pending-builds-per-system system
- #:timestamp today))
+ #:timestamp time))
%cuirass-supported-systems))
;; Update specification related metrics.
diff --git a/tests/metrics.scm b/tests/metrics.scm
index de2d88b..195b043 100644
--- a/tests/metrics.scm
+++ b/tests/metrics.scm
@@ -32,6 +32,10 @@
(define yesterday
(- today 86400))
+(define pending-builds-timestamp
+ (let ((time (current-time)))
+ (- time (modulo time %pending-builds-sampling-period))))
+
(test-group-with-cleanup "database"
(test-assert "db-init"
(begin
@@ -99,28 +103,29 @@ nix_name, log, status, timestamp, starttime, stoptime)
VALUES
(db-get-metric 'builds-per-day yesterday)))
(test-equal "pending-builds"
- `((,today . 1.0))
+ `((,pending-builds-timestamp . 1.0))
(begin
- (db-update-metric 'pending-builds)
+ (db-update-metric 'pending-builds pending-builds-timestamp)
(db-get-metrics-with-id 'pending-builds)))
(test-equal "pending-builds-per-system"
- `((,today "aarch64-linux" 1.0) (,today "x86_64-linux" 0.0))
+ `((,pending-builds-timestamp "aarch64-linux" 1.0)
+ (,pending-builds-timestamp "x86_64-linux" 0.0))
(begin
(db-update-metric 'pending-builds-per-system "x86_64-linux"
- #:timestamp today)
+ #:timestamp pending-builds-timestamp)
(db-update-metric 'pending-builds-per-system "aarch64-linux"
- #:timestamp today)
+ #:timestamp pending-builds-timestamp)
(db-get-metrics-with-id 'pending-builds-per-system
#:timestamp? #t)))
(test-equal "pending-builds-per-system, aarch64-linux"
- `((,today . 1.0))
+ `((,pending-builds-timestamp . 1.0))
(db-get-metrics-with-id 'pending-builds-per-system
#:value "aarch64-linux"))
(test-equal "pending-builds-per-system, x86_64-linux"
- `((,today . 0.0))
+ `((,pending-builds-timestamp . 0.0))
(db-get-metrics-with-id 'pending-builds-per-system
#:value "x86_64-linux"))
@@ -137,7 +142,7 @@ nix_name, log, status, timestamp, starttime, stoptime)
VALUES
(db-get-metrics-with-id 'percentage-failed-eval-per-spec)))
(test-equal "db-update-metrics"
- `((,today . 2.0))
+ `((,pending-builds-timestamp . 2.0))
(begin
(exec-query (%db) (format #f "\
INSERT INTO Builds (id, derivation, evaluation, job_name, system,