release 1.10.9: stats policy not false first-error (www.stats-01)

This commit is contained in:
Hernâni Marques 2026-07-19 01:44:16 +02:00
parent b9953fd3fe
commit 94c1bab1d4
No known key found for this signature in database
GPG key ID: CB5738652768F7E9
4 changed files with 9 additions and 4 deletions

View file

@ -1 +1 @@
1.10.8 1.10.9

View file

@ -17,6 +17,7 @@ Git tags: `vMAJOR.FEATURE.FIX` (e.g. `v1.8.0`). File `VERSION` omits the `v` pre
| Tag | Date (UTC) | Notes | | Tag | Date (UTC) | Notes |
|-----|------------|--------| |-----|------------|--------|
| **v1.10.9** | 2026-07-19 | **Bugfix:** stats policy INFO no longer says bare “ERROR” (false #first-error on www.stats-01); extract_errors only from `┌ ERROR` badges. |
| **v1.10.8** | 2026-07-19 | **Docs/clarity:** only three public mon URL families (`/monitoring`, `/taler-monitoring-surface`, `/taler-monitoring-aptdeploy`) each bare+slash(+_err); suite name ≠ path; no `/taler-monitoring` page. | | **v1.10.8** | 2026-07-19 | **Docs/clarity:** only three public mon URL families (`/monitoring`, `/taler-monitoring-surface`, `/taler-monitoring-aptdeploy`) each bare+slash(+_err); suite name ≠ path; no `/taler-monitoring` page. |
| **v1.10.7** | 2026-07-19 | **Bugfix:** stop always-rsync of **stale suite-overlay** over Forgejo tip (broke stage sticky / new site-gen). Overlay only when suite missing phases. | | **v1.10.7** | 2026-07-19 | **Bugfix:** stop always-rsync of **stale suite-overlay** over Forgejo tip (broke stage sticky / new site-gen). Overlay only when suite missing phases. |
| **v1.10.6** | 2026-07-19 | **Fix:** stage mon HTML quality — suite update out of public log; filter git noise; stage-specific sticky (not GOA); `CHECK_BANK=0` / `MERCHANT_REQUIRED` for mytops stage scope. | | **v1.10.6** | 2026-07-19 | **Fix:** stage mon HTML quality — suite update out of public log; filter git noise; stage-specific sticky (not GOA); `CHECK_BANK=0` / `MERCHANT_REQUIRED` for mytops stage scope. |

View file

@ -259,7 +259,7 @@ set_group perf
section "www · performance · public HTTPS latency (outside-in)" section "www · performance · public HTTPS latency (outside-in)"
# Latency thresholds (ms), outside-in from this runner. # Latency thresholds (ms), outside-in from this runner.
# ≥ PERF_WARN_MS → WARN. ≥ PERF_FAIL_MS → ERROR (suite fails). # ≥ PERF_WARN_MS → WARN. ≥ PERF_FAIL_MS → suite fail (hard).
PERF_WARN_MS="${PERF_WARN_MS:-8000}" PERF_WARN_MS="${PERF_WARN_MS:-8000}"
PERF_FAIL_MS="${PERF_FAIL_MS:-20000}" PERF_FAIL_MS="${PERF_FAIL_MS:-20000}"
PERF_TSV="$tmp/perf.tsv" PERF_TSV="$tmp/perf.tsv"
@ -580,7 +580,8 @@ PY
if [ "${CHECK_LANDING:-1}" = "1" ] || [ "${LOCAL_STACK:-0}" = "1" ]; then if [ "${CHECK_LANDING:-1}" = "1" ] || [ "${LOCAL_STACK:-0}" = "1" ]; then
set_group stats set_group stats
section "www · landing stats.json (freshness + display fields · outside-in)" section "www · landing stats.json (freshness + display fields · outside-in)"
info "stats policy" "STALE≥${STATS_STALE_SECS}s WARN · FAIL≥${STATS_FAIL_SECS}s ERROR (0=disable fail) · need generated_at_unix" # Avoid the bare word ERROR in INFO text (older HTML converters treated it as a check failure / first-error).
info "stats policy" "STALE≥${STATS_STALE_SECS}s→WARN · FAIL≥${STATS_FAIL_SECS}s→suite-fail (0=off) · need generated_at_unix"
check_landing_stats_json "bank" "$BANK_PUBLIC" || true check_landing_stats_json "bank" "$BANK_PUBLIC" || true
check_landing_stats_json "exchange" "$EXCHANGE_PUBLIC" || true check_landing_stats_json "exchange" "$EXCHANGE_PUBLIC" || true
check_landing_stats_json "merchant" "$MERCHANT_PUBLIC" || true check_landing_stats_json "merchant" "$MERCHANT_PUBLIC" || true

View file

@ -369,13 +369,16 @@ def extract_errors(lines: list[str]) -> list[str]:
errs.append(body) errs.append(body)
elif "ERROR" in ln.upper() and ln.strip() and not is_run_timeout_text(ln): elif "ERROR" in ln.upper() and ln.strip() and not is_run_timeout_text(ln):
errs.append(ln.strip()) errs.append(ln.strip())
if re.search(r"\bERROR\b", ln, re.I) and "--- ERRORS" not in ln: # Only real check badges (not INFO text mentioning thresholds like "… ERROR (0=disable)")
if re.search(r"\s*ERROR\b|\[\s*ERROR\b", ln, re.I) and "--- ERRORS" not in ln:
if is_run_timeout_text(ln): if is_run_timeout_text(ln):
if "run.timeout-01" in ln.lower() or "RUN_TIMEOUT exceeded" in ln: if "run.timeout-01" in ln.lower() or "RUN_TIMEOUT exceeded" in ln:
timeout_detail = re.sub(r"\s+", " ", strip_ansi(ln)).strip() timeout_detail = re.sub(r"\s+", " ", strip_ansi(ln)).strip()
continue continue
if is_summary_error_line(ln): if is_summary_error_line(ln):
continue continue
if classify(ln) not in ("error", "blocker"):
continue
body = re.sub(r"^.*\bERROR\b\s*\]?\s*", "", ln, flags=re.I).strip(" ·") body = re.sub(r"^.*\bERROR\b\s*\]?\s*", "", ln, flags=re.I).strip(" ·")
if body and body not in errs and "failed — see" not in body.lower(): if body and body not in errs and "failed — see" not in body.lower():
if re.search( if re.search(