# Автономное тройное ревью П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 остаётся источником её фактической записи.