Телевізор нікуди не залогиниш — зранку на стіні висітиме форма входу замість карти мережі. Тому /tv/<токен> розгалужується до перевірки сесії, а доступ дає токен у посиланні. Публічний зріз навмисно вузький: розкладка, алерти, хости й метрики ЛИШЕ тих хостів, які показані на цьому дашборді. Ширший доступ був би простішим у коді й перетворив би забутий лінк на ключ до кабінету. Плитки ті самі, що в кабінеті: джерело даних підмінюється контекстом. Дорогою знайдено дві помилки. Вбудовані icmp-тригери мали умову у формі, якої движок не розуміє, і мовчали, засипаючи журнал помилками — виправлено міграцією 0026 і в редакторі. База стенда виявилась у SQL_ASCII: тепер міграція відмовляється накочуватись на не-UTF8, а compose задає кодування явно. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
45 lines
2.4 KiB
SQL
45 lines
2.4 KiB
SQL
-- =====================================================================
|
||
-- NetPulse :: 0026_fix_icmp_conditions.sql
|
||
-- Умова icmp-тригера має форму {"metric":"loss_pct","op":">","value":20}.
|
||
--
|
||
-- У 0024 вбудовані тригери отримали {"op":"loss_pct >","value":99} —
|
||
-- форму зі старого прикладу в коментарі до 0007, якої движок сповіщень
|
||
-- ніколи не розумів. Він читає `metric`, `op` і `value` окремими полями,
|
||
-- тож кожен тік писав у журнал «невідома метрика "" для джерела icmp», а
|
||
-- правило мовчало.
|
||
--
|
||
-- Найгірша з можливих поломок для моніторингу: система виглядає
|
||
-- налаштованою, тригери на місці, а про недоступність хоста не скаже
|
||
-- ніхто. Помітно це стає під час першої ж аварії.
|
||
--
|
||
-- Саму 0024 не чіпаємо, хоча спокуса є: застосована міграція незмінна,
|
||
-- і рант її контрольної суми не дарма зупиняє запуск. Свіжа інсталяція
|
||
-- просто отримає обидві поспіль — 0024 покладе стару форму, 0026 одразу
|
||
-- виправить.
|
||
-- =====================================================================
|
||
|
||
-- Розбираємо злиплий рядок "поле оператор" назад на два поля. Беремо
|
||
-- лише ті записи, де поля `metric` немає: чужі й уже виправлені умови
|
||
-- не чіпаємо.
|
||
UPDATE tpl.triggers
|
||
SET condition = jsonb_build_object(
|
||
'metric', split_part(condition->>'op', ' ', 1),
|
||
'op', NULLIF(split_part(condition->>'op', ' ', 2), ''),
|
||
'value', condition->'value'
|
||
)
|
||
WHERE source = 'icmp'
|
||
AND condition ? 'op'
|
||
AND NOT (condition ? 'metric')
|
||
AND position(' ' IN (condition->>'op')) > 0;
|
||
|
||
UPDATE alr.rules
|
||
SET condition = jsonb_build_object(
|
||
'metric', split_part(condition->>'op', ' ', 1),
|
||
'op', NULLIF(split_part(condition->>'op', ' ', 2), ''),
|
||
'value', condition->'value'
|
||
),
|
||
updated_at = now()
|
||
WHERE source = 'icmp'
|
||
AND condition ? 'op'
|
||
AND NOT (condition ? 'metric')
|
||
AND position(' ' IN (condition->>'op')) > 0;
|