# Автономное тройное ревью П30 · август 2020 · «Метрики приложения»
Статус: **принят независимым редактором в выпусковой набор**. В нём ровно три
revision для стабильных slug:
- editorial-2020-08-practice-metrics-basics;
- editorial-2020-08-mechanism-metrics-basics;
- editorial-2020-08-field-metrics-basics.
Созданы только пять разрешённых файлов П30:
- web/scripts/upgrade-2020-08.mjs;
- web/public/assets/editorial/2020/metrics-signal-contract-2020.svg;
- web/public/assets/editorial/2020/metrics-label-boundary-2020.svg;
- web/public/assets/editorial/2020/metrics-diagnosis-2020.svg;
- этот документ.
Module export не задаёт date или author. При будущей
интеграции registry может наложить только редакционные поля на базовые записи
архива. articles.json, registry, стандарт, очередь, package config
и Git данным пакетом не менялись. Команда --print-revisions
печатает только JSON, а --verify-fixture запускает отдельную
детерминированную проверку в памяти.
## Проход 1. Факты и техника — пройдено
| Утверждение | Первичный или официальный источник | Проверенная граница |
| --- | --- | --- |
| Имя метрики описывает одну величину и единицу; для counter используется суффикс _total, duration измеряется в seconds | [Prometheus: Metric and label naming](https://prometheus.io/docs/practices/naming/) | store_http_requests_total отделён от store_http_request_duration_seconds; учебные имена не смешивают запросы, ошибки и время |
| Для online-serving системы полезно считать завершённые запросы, ошибки и latency; errors нужны рядом с числом попыток | [Prometheus: Instrumentation](https://prometheus.io/docs/practices/instrumentation/) | Counter увеличивается после завершения operation; operation и outcome ограничены allowlist |
| Counter накапливает события и при рестарте может сброситься; server-side query над окном не равен ручной разности двух точек | [Prometheus: Instrumentation](https://prometheus.io/docs/practices/instrumentation/), [Prometheus: Querying basics](https://prometheus.io/docs/prometheus/latest/querying/basics/) | PromQL с increase(...[10m]) приведён как будущий вопрос к серверу; fixture проверяет только монотонную учебную серию и не моделирует reset или scrape |
| Уникальная комбинация имени и labels создаёт отдельную time series; неограниченные значения раздувают storage | [Prometheus: Metric and label naming](https://prometheus.io/docs/practices/naming/), [Prometheus: Instrumentation](https://prometheus.io/docs/practices/instrumentation/) | Учебная арифметика 3 operations × 2 outcomes и пример с 100 user ID не выданы за RAM-, disk- или workload-замер |
| Counter, gauge, histogram и summary описывают разные формы величины | [Prometheus: Metric types](https://prometheus.io/docs/concepts/metric_types/) | Counter не назван current state; fixture с sum/count не выдаёт p95 или распределение за production telemetry |
Все четыре официальные страницы использованы для сверки смысла names, labels,
types и запросов. Они не представлены как доказательство развернутого в августе
2020 года production-контура. В тексте нет claim о реальном Prometheus server,
exporter, scrape interval, dashboard, alert delivery, нагрузке или
производственном пороге.
### Техническая граница учебной фикстуры
runMetricsFixture() создаёт четыре synthetic event, допускает
ровно catalog, checkout, profile и
success/error, затем формирует локальный exposition-текст. Вторая
часть fixture сравнивает две серии counter:
- 0 → 1 → 2 за учебное окно даёт delta 2 и
пересекает упражнение >= 2;
- 0 → 1 → 1 даёт delta 1 и его не пересекает.
Эта проверка не подменяет PromQL, target scrape, counter reset, network,
storage, client library или alerting. Её задача уже: зафиксировать, что
изменение labels или числа в учебном контракте не пройдёт незаметно.
Вердикт прохода: **пройден**. Утверждения о Prometheus отделены от учебной
модели, а учебная модель — от запуска на реальной инфраструктуре.
## Проход 2. Редактура, глубина и голос М3 — пройдено
| Ревизия | Симптом и цена в первых двух абзацах | Главный вопрос | Объём основного текста |
| --- | --- | --- | --- |
| Практика | Общий график requests не показывает operation и outcome; цена — поиск не по той границе и разрастание бесполезных линий | Как выбрать один completed-request signal, bounded labels и учебный threshold | **9 182** знаков body |
| Механизм | Уникальный label размножает series и делает запрос неясным; цена — хранение и потеря агрегированного смысла | Где заканчивается полезная dimension и почему request context живёт в журнале | **10 230** знаков body |
| Полевой разбор | Одна линия requests не объясняет деградацию; цена — шумный порог и правка timeout без факта | Как прочитать controlled counter-series, окно и threshold, не выдав их за production-диагноз | **9 480** знаков body |
- Во всех материалах начало устроено по схеме «симптом → цена → ограниченная
учебная граница», затем следует «причина → проверка → действие».
- У каждой revision больше пяти смысловых разделов, есть figure с
самостоятельным alt/figcaption, таблица с
caption/thead, code/query/fixture example,
нумерованный маршрут и четыре официальные ссылки.
- Статьи не используют общую риторику про важность наблюдаемости. Они
фиксируют completed request, counter, seconds, operation/outcome, time
series, окно, порог, log и следующий сценарий.
- Голос соответствует М3 / августу 2020 года. Автор связывает application-code
с наблюдаемым измерением, но не приписывает себе SLO, error budget,
observability platform, реальные production-значения или опыт большого
инцидента.
- Все цифры в графике, таблице cardinality и пороге явно названы учебными.
Нагрузка, допустимая ошибка и стоимость alert не придуманы вместо данных
проекта.
Второй редакторский проход проверил, что count, duration и latency не
смешиваются. Counter не назван current state, а increase() не
выдана за ручную разность snapshots. Pseudocode над client library отмечен как
контракт labels, а не как запущенный exporter.
Вердикт прохода: **пройден**. Тексты укладываются в 5 000–15 000 знаков,
остаются прагматичными и не перескакивают к зрелой платформенной терминологии.
## Проход 3. Визуал, fixture и выпусковой preflight — пройдено в пределах пакета
- metrics-signal-contract-2020.svg ведёт от операционного
вопроса к counter, двум ограниченным labels, учебному окну и действию после
пересечения порога.
- metrics-label-boundary-2020.svg отделяет allowlist
operation/outcome для series от request ID, email и полного URL,
которые остаются в журнале.
- metrics-diagnosis-2020.svg показывает три synthetic snapshots
counter 0 → 1 → 2, условие increase(...[10m]) = 2
и следующий диагностический шаг.
- У схем есть title, desc, role="img",
вертикальные viewBox 720 px, контрастные карточки и текст не мельче 20 px в
исходном SVG. В них нет JavaScript, foreignObject, внешних URL
или raster data URI.
- Отдельный mobile preflight отрендерил все три SVG в PNG шириной 375 px
через Sharp и просмотрел результат. У всех схем крупные заголовки, короткие
строки и вертикальная композиция; clipping, наложение и горизонтальный
overflow внутри SVG не обнаружены. Это статическая проверка visual asset, не
browser-run и не test screen reader.
### Фактически выполненные проверки
Запущены после финальной редакторской правки 31 июля 2026 года:
cd web && node --check scripts/upgrade-2020-08.mjs
cd web && npm run audit:draft -- scripts/upgrade-2020-08.mjs
cd web && node scripts/upgrade-2020-08.mjs --verify-fixture
cd web && xmllint --noout \
public/assets/editorial/2020/metrics-signal-contract-2020.svg \
public/assets/editorial/2020/metrics-label-boundary-2020.svg \
public/assets/editorial/2020/metrics-diagnosis-2020.svg
| Проверка | Реальный результат |
| --- | --- |
| node --check | PASS, code 0 |
| Import-safe export и draft gate | PASS: **9 182 / 10 230 / 9 480** знаков body; три slug, tables, figures, code, routes, sources и assets найдены |
| In-memory fixture | PASS: bounded labels сохранены, counter error checkout найден, threshold пересекается на 2 и не пересекается на 1 |
| xmllint --noout | PASS, все три SVG — корректный XML |
| Sharp mobile preflight | PASS: три PNG шириной 375 px просмотрены; нет clipping, наложения или horizontal overflow внутри схем |
| Scope/self-review | PASS: в revision нет date/author; созданы только пять файлов П30; чужие незакоммиченные пакеты не редактировались и не индексировались |
## Независимая интеграционная приёмка
Основной редактор 31 июля 2026 года подключил три revision к
web/data/editorial-revisions.mjs, не меняя базовый
articles.json, даты или автора архивных записей. После подключения
в registry стало 85 revision. Отдельно выполнены:
| Проверка после интеграции | Реальный результат |
| --- | --- |
| Строгий audit трёх slug | PASS: 9 182 / 10 230 / 9 480 знаков; у каждой статьи один figure, одна table и два code example |
| Production build | PASS: Next.js собрал 374 статические страницы |
| Независимый mobile visual review | PASS: основной редактор повторно просмотрел все три SVG, отрендеренные Sharp в 375 px; clipping, overlap и overflow не обнаружены |
Ни этот отчёт, ни интеграция не утверждают, что был запущен настоящий
Prometheus, exporter, scrape, browser или assistive technology. Они фиксируют
границы автономного учебного пакета и результат статических проверок.
Выпусковой вердикт: **ACCEPT**. Commit и push выполняются отдельной
публикационной операцией; Git остаётся источником её фактической записи.