Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Суть
Расследование инцидента с per-cell правками MCP (#400) опёрлось на два числа из контура #355 —
collab_store_duration_seconds(~1.48 с) иnodejs_eventloop_lag_max(спайки 1.3–1.7 с) — но вся остальная механика восстанавливалась чтением кода и гипотезами, потому что циклconnect → auth → load → sync → diffи жизненный цикл документов hocuspocus не наблюдаемы:onLoadDocument(чтение ~400 КБ + двойная перекодировка) — невидим;table_update_cellиget_outline— одно и то же;Без этих метрик фиксы #400 (кэш CollabSession) и #399 (resolve в очередь) будут проверяться вслепую.
Решение: 6 дополнений в существующий registry
Все имена — в духе контракта #355; всё за существующим гейтом
METRICS_PORT(не задан → ни коллекторов, ни листенера).1.
collab_doc_load_duration_seconds(histogram, labels:size_bucket)Инструментировать
onLoadDocumentв persistence.extension.ts (чтение из БД +Y.applyUpdate). Вторая половина цикла, симметрично store.2. Жизненный цикл документов:
collab_docs_open(gauge) +collab_doc_loads_total/collab_doc_unloads_total(counters)Хуки
afterLoadDocument/afterUnloadDocument(extension или collaboration.gateway.ts). Gauge не инкрементами, аcollect()-колбэком изhocuspocus.documents.size— не дрейфует при ошибках/рестартах. Трэшинг-детектор:rate(collab_doc_loads_total) ≈ rate(collab_doc_unloads_total)при стабильно маломcollab_docs_open— та самая пила load→store→unload.3.
collab_connect_duration_seconds(histogram) +collab_connect_timeouts_total(counter)Серверная длительность:
onConnect→ отправлена начальная синхронизация (хуки hocuspocus). Счётчик таймаутов — на MCP-стороне (25-секундный таймер вpackages/mcpcollaboration.ts:198):packages/mcpне должен зависеть от prom-client → опциональный колбэк-интерфейсonMetric?(name, value)в конструкторе клиента, который хост (mcp.service мост) подключает к registry. Standalone-режим MCP колбэк не передаёт — метрик нет, поведение не меняется.4.
collab_auth_duration_seconds(histogram)Вокруг
onAuthenticateв authentication.extension.ts — 4–5 DB-запросов на каждое подключение, сейчас растворены в общем DB-агрегате.5.
mcp_tool_duration_seconds{tool}(histogram)В точке диспатча инструментов in-process MCP-хоста (мост в server). Кардинальность bounded: лейбл — имя из реестра зарегистрированных инструментов, всё вне реестра →
other.6. Дименсия размера: label
size_bucketна load (п. 1) и на существующийcollab_store_duration_secondsФиксированные бакеты:
lt64k | lt256k | lt1m | ge1m(по размеру ydoc-стейта в байтах). Кардинальность ×4. Функция бакетирования — одна, разделяемая обоими местами.Дашборд (DevOps, после выката)
Четыре панели: load p95 по size_bucket; docs_open + rate(loads/unloads) (трэшинг-детектор); connect p95 + timeouts_total; MCP p95 по tool. Алерт на трэшинг — не сразу: сначала неделю посмотреть на живой паттерн, потом порог (урок queue-growing: правило по живым данным, а не по интуиции).
Границы изменения
apps/server(metrics registry/constants + 3 точки инструментирования в collaboration) +packages/mcp(опциональныйonMetric-колбэк, нейтральный интерфейс без зависимостей). Поведение фич 1:1. Контракт имён — дополнение к таблице #355.Крайние случаи
tool— из реестра инструментов +other;size_bucket— 4 фиксированных значения; никаких id/имён документов в лейблах (docs by name — НЕ добавлять, это unbounded).collab_docs_openчерезcollect()— читает актуальный размер map на скрейпе; инкременты запрещены (дрейф).packages/mcpв standalone-режиме (внешний процесс): колбэк не передан → no-op; сборка build/* коммитится, проверить пересборку.collab_store_duration_seconds+size_bucket): в VM появится новая серия рядом со старой безлейбловой — запросы дашборда обновить наsum without(size_bucket); старая серия дотлеет за retention.Тесты / проверка
other), no-op колбэка в standalone.curl :9464/metricsпосле открытия/правки/закрытия документа через MCP-вызов.Вне скоупа
План работ
size_bucketна store (пп. 1, 2, 4, 6).packages/mcp+ подключение в хосте +mcp_tool_duration_secondsиcollab_connect_timeouts_total(пп. 3, 5), пересборка build/*.sum without(size_bucket).