Analytics: compare two finished runs
New page /analytics/compare and API GET /admin/analytics/compare (+ /lists/{group}):
the administrator picks an old (A) and a new (B) run; the report shows the new
addresses (only in B), the ones that left (only in A) and the common ones whose
membership in the seven indicators (pass, partial, fail, egress https any/all,
ingress ssh any/all) differs, with a "what changed" summary per address; the
dynamics of each indicator (delta = new - left + entered - exited) and a verdict
transition matrix. Every number opens a list with CSV. Cancelled addresses are not
part of a run. The list dialog moved to a shared analytics-dialog.js and template;
/analytics got a "compare with another run" button.
Docs, plan and summary in docs/changes/.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
2f038f8362
commit
068c10ea1c
28 files changed
+2057
-138
No files matched your search
@@ -0,0 +1,75 @@
|
||||
{{define "analytics_compare_page"}}
|
||||
<!doctype html>
|
||||
<html lang="ru">
|
||||
<head>{{template "html_head" .}}
|
||||
<link rel="stylesheet" href="/static/analytics.css">
|
||||
</head>
|
||||
<body>
|
||||
<div class="bg-grid"></div>
|
||||
<input type="checkbox" id="nav-toggle" class="nav-toggle">
|
||||
<div class="shell">
|
||||
{{template "sidebar_nav" .}}
|
||||
<div>
|
||||
{{template "topbar_mobile" .}}
|
||||
<main class="main">
|
||||
<div id="error-banner">{{template "banner_inner" .Banner}}</div>
|
||||
{{template "analytics_compare_content" .}}
|
||||
</main>
|
||||
</div>
|
||||
</div>
|
||||
{{if .HasReport}}
|
||||
<script type="application/json" id="analytics-data">{{.DataJSON}}</script>
|
||||
<script src="/static/analytics-dialog.js"></script>
|
||||
<script src="/static/analytics-compare.js"></script>
|
||||
{{end}}
|
||||
</body>
|
||||
</html>
|
||||
{{end}}
|
||||
|
||||
{{define "analytics_compare_content"}}
|
||||
<div class="an">
|
||||
<div class="an-head">
|
||||
<h1 class="an-title">Сравнение запусков</h1>
|
||||
<p class="an-sub">Динамика между двумя завершёнными запусками. <a href="/analytics">К аналитике одного запуска</a>.</p>
|
||||
</div>
|
||||
|
||||
{{if .RunsA}}
|
||||
<section class="an-panel" aria-label="Выбор запусков">
|
||||
<form class="an-runbar" method="get" action="/analytics/compare">
|
||||
<label for="an-base">Запуск A (старый)</label>
|
||||
<select id="an-base" name="base">
|
||||
{{range .RunsA}}<option value="{{.ID}}"{{if .Selected}} selected{{end}}>{{.Label}}</option>
|
||||
{{end}}
|
||||
</select>
|
||||
<button class="an-btn" type="button" id="an-swap" onclick="var a = document.getElementById('an-base'), b = document.getElementById('an-target'), v = a.value; a.value = b.value; b.value = v; this.form.submit()">Поменять местами</button>
|
||||
<label for="an-target">Запуск B (новый)</label>
|
||||
<select id="an-target" name="target">
|
||||
{{range .RunsB}}<option value="{{.ID}}"{{if .Selected}} selected{{end}}>{{.Label}}</option>
|
||||
{{end}}
|
||||
</select>
|
||||
<button class="an-btn an-primary" type="submit">Сравнить</button>
|
||||
</form>
|
||||
{{if .HasReport}}<div class="an-note" id="an-cmp-note"></div>{{end}}
|
||||
<p class="an-note">«Новые» — адреса, которые есть в B и которых не было в A; «выбывшие» — были в A, в B их нет. Адрес изменился, если его принадлежность к индикаторам в A и B разная. Если запуски разного состава (например, перепроверка части адресов), новых и выбывших будет много: это состав запусков, а не динамика.</p>
|
||||
</section>
|
||||
{{end}}
|
||||
|
||||
{{if .HasReport}}
|
||||
<div class="an-kpis" id="an-cmp-kpis"></div>
|
||||
|
||||
<section class="an-panel" aria-labelledby="an-h-ind">
|
||||
<h2 id="an-h-ind">Динамика по индикаторам</h2>
|
||||
<div class="an-scroll"><table id="an-cmp-ind"></table></div>
|
||||
<p class="an-note">Δ = B − A = новые − выбывшие + вошли − вышли. Зелёным выделен рост pass и падение остальных индикаторов, красным обратное. Числа в последних четырёх столбцах открывают список адресов.</p>
|
||||
</section>
|
||||
|
||||
<section class="an-panel" aria-labelledby="an-h-tr">
|
||||
<h2 id="an-h-tr">Переходы вердикта</h2>
|
||||
<div class="an-scroll"><table id="an-cmp-tr"></table></div>
|
||||
<p class="an-note">Вердикт адресов, которые есть в обоих запусках: по строкам вердикт в A, по столбцам в B. Строка «нет в A» — новые адреса по вердикту в B, столбец «нет в B» — выбывшие по вердикту в A.</p>
|
||||
</section>
|
||||
|
||||
{{template "analytics_dialog"}}
|
||||
{{end}}
|
||||
</div>
|
||||
{{end}}
|
||||
Reference in new issue
Block a user