Перейти до вмісту

Блог ·

Журнал, який рахує ще до будь-якої ціни

Моніторинг дає число на кожну перевірку задовго до появи ціни. Ось чому облік збудовано першим і що саме захищає такий порядок дій у цій системі.

Автор: Provibr

Моніторинг не має ціни. Ні суми, ні валюти, ні тарифу, ні рядка рахунку. Що є від цього кола робіт, так це журнал, який записує кожну перевірку, справді надіслану платформою, зберігає її тринадцять місяців і закриває кожну годину у відро, яке більше ніколи не змінюють.

Будувати облік раніше за нарахування здається хибним порядком, доки одного разу не зробиш навпаки. Лічильник, що народжується поруч із рахунком, успадковує всі зручності, яких той рахунок бажає: повторну спробу, тихо зараховану тому, що інакше підсумок виглядав дивно, виправлення, внесене редагуванням рядка. Це рішення, і вони даються краще, коли від них не залежить жоден підсумок.

Отже, журнал існує, грошей у ньому немає, а один зі стовпців у ньому свідомо порожній.

Рахується те, що справді вийшло назовні

Запланована перевірка проходить кілька станів, і журнал ставить одне питання на кожен стан: чи вийшов трафік за межі будівлі. Це записано як таблиця по кожному результату, а не як розгалуження з типовою гілкою, бо саме типова гілка є шляхом, яким сьомий результат тихо стає «не рахується», а місяць зникає.

РезультатРядок записаноРахуєтьсяЧому
запланованонініслот зарезервовано, ще нічого не надіслано
зайнятонінізайнято, але не надіслано; рядок постає під час надсилання
надісланотактакперевірка справді вийшла назовні
завершенотактакзакінчено; свій рядок вона дістала ще під час надсилання
пропущенонініне надсилали: немає агента, немає справного зонда, обслуговування чи минулий слот
простроченонінітермін минув, а нічого не вийшло

Два з цих рядків заслуговують на окреме речення.

Перевірка, що дістається мертвої машини, рахується так само. Був трафік і було вимірювання; те, що відповідь звучить як «недоступно», є результатом, а не питанням. Правило, яке рахувало б лише успішні перевірки, брало б найменше саме з тих клієнтів, задля яких працюють найбільше.

А «прострочено» тонше, ніж здається, бо запит може прострочитися після надсилання. Подвійного обліку немає, і це не випадковість: тік дістає цей стан лише через прохід, що торкається тіків, які ніколи не минули крок надсилання, а те, що вийшло, вже значилося надісланим і має свій рядок відтоді.

Клас джерела, наш власний зонд чи агент клієнта, є в рядку та в сигнатурі функції, яка вирішує. Сьогодні обидва рахуються однаково, і саме тому клас записано, а не припущено.

Один тік, один рядок

Перемикання на резерв є тим випадком, що тихо роздуває число використання. Перевірка йде від одного джерела, це джерело не відповідає, інше перебирає роботу, і ось уже дві спроби на одне вимірювання.

Тут це унікальний індекс за ключем вигляду tick:<ідентифікатор тіка>. Повтори й перемикання в межах того самого тіка дають той самий ключ, тож друга вставка конфліктує й нічого не повертає. Обидва шляхи запису роблять саме так; жоден не читає наперед, бо між читанням і вставкою вміщується другий шлюз.

Ключ є текстовим стовпцем, а не посиланням на тік, і саме тут цікаве. Тіки живуть сім днів, а використання тринадцять місяців. Коли прохід прибирає тік, посилання стає порожнім, а в Postgres порожнє значення ніколи не дорівнює іншому порожньому: унікальний індекс за цим стовпцем через тиждень почав би мовчки допускати дублікати.

Ручна перевірка теж є трафіком

Є кнопка, що запускає перевірку негайно. Вона не рахується, і її все одно записують.

Обидві половини важать. Не рахується, бо людина, що тисне кнопку, не є запланованою службою. Записують, бо це й далі трафік до чиєїсь машини, а тисяча натискань на годину є саме тим, що система обліку має вміти показати. Друга таблиця, до якої не зазирає жоден звіт, приховала б якраз той випадок, у якому число стає цікавим.

Розділяє їх не домовленість, а обмеження в базі даних: рядок типу «ручний» не може ні рахуватися, ні нести тік. «Ручний і зарахований» існувати не може, і це важить, бо такий рядок має цілком звичайний вигляд у будь-якому звіті.

Година закривається пізно й далі не змінюється

Відра йдуть за організацією, годиною, класом джерела й типом перевірки. Годину закривають лише тоді, коли минуло пʼятнадцять хвилин наступної години.

Очевидна причина, пізній результат вимірювання, не є справжньою; результати підсумку не торкаються. Справді пізнім може бути сам рядок: транзакція, підтверджена о 10:59:59, стає видимою об 11:00:00, кілька шлюзів читають кожен свій годинник, а той, що ненадовго зник, потім надолужує відставання. Пʼятнадцять хвилин на порядок більші за все, що може тривати одна перевірка, де найбільший час очікування становить 120 секунд, а резервування 45.

Щойно годину закрито, її не редагують. Пізня подія дає новий рядок, який вказує на базовий із машинно-читною причиною, і ніколи не оновлення. Це навʼязує форма, а не дисципліна: унікальний індекс за організацією, годиною, класом джерела й типом є частковим і охоплює лише рядки, що не є виправленнями, тож друге виправлення тієї самої години не конфліктує з першим і не зникає. Якби виправлення ділили цей індекс, зник би саме той доказ, що потрібен у суперечці. Сама причина є одним словом, а не вільним реченням, бо панель перекладає її девʼятьма мовами, а експорт групує за нею.

Межі, що не є прайс-листом

Кожна організація має дозволений запас, і кожне число в ньому обрано, щоб спинити випадковість, а не щоб описати пакет.

Щонайбільше 200 правил, свідомо те саме число, яке функція створення вже вимагала: нижче типове значення виштовхнуло б наявні рахунки за їхню межу першого ж дня й без попередження запустило б правило зупинки нижче. Щонайбільше 9 джерел на правило, тобто вісім розміщених локацій плюс один агент, які схема вже дозволяла. Усі відомі типи перевірок, виведені з того переліку, а не виписані вручну, щоб сьомий тип не виявився типово забороненим для всіх. Поріг у 60 секунд, який запас може підняти й ніколи не опустити; опустити його дозволяє окреме платне право, що має назву й не існує.

Номер редакції того рядка є тим, що потрапляє до журналу, а нуль означає «рядка немає, це типове значення». Без цієї відмінності рядок використання торішнього року не привʼязати до того, що тоді дозволялося, а саме заради цього редакцію й зберігають.

Що зупиняється, коли запас меншає

Якщо хтось опускає запас нижче за те, що рахунок використовує, частина правил спиняється. Вибір, які саме, є рішенням, і кандидатів було два.

Найдорожчі спершу неможливі, бо ціни немає. Довелося б виводити вартість із кількості джерел або з інтервалу, і тоді спиняється якраз найгостріше спостереження, яке клієнт має. Хто зменшує свій тариф, радше втратить периферійне вимірювання, ніж сповіщення, що будить його вночі.

Отже, найстаріші правила працюють далі, а найновіші спиняються. Найстаріші несуть найдовшу історію інцидентів і сповіщення, на які люди покладаються, а «що ввімкнули останнім, вимикається першим» є єдиним порядком, який клієнт може передбачити, не читаючи нашого коду. Впорядкування йде за часом створення, а потім за ідентифікатором правила, два ключі, бо застосування шаблону створює кілька правил у ту саму мілісекунду; без другої ознаки попередній перегляд не збігався б із тим, що станеться далі.

Правила, що порушують межу за формою, заборонений тип, розміщені джерела, які вже не дозволені, забагато джерел, прибирають першими, і далі вони рахуються в тому, що лишилося. Інтервал, який тепер надто швидкий, не спиняє геть нічого: піднятий поріг відхиляє нове чи змінене правило й лишає в спокої ті, що вже працюють, доки хтось їх не торкнеться.

Порожній стовпець

Відра мають стовпець invoice_ref, і він порожній. Це названий шов, а не недогляд, у тому самому дусі, що й право, яке має назву й не має втілення: коли надійде виставлення рахунків, потрібна йому форма вже буде на місці, і нічого в обліку не доведеться переглядати під тиском строку.

Два споріднені рішення випливають із того самого міркування. Журнал має власну таблицю, а не виводиться з тіків, бо тіки живуть сім днів, а це 395. А рядки на кожну перевірку лишаються поза експортом персональних даних, із записаною поруч причиною: сотні тисяч на місяць, експорт, що обрізає кожен розділ на 25 000 рядках, і погодинні відра, які несуть ті самі підсумки. Відра й рядок меж усе-таки входять.

Що ми занотували б

  1. Будувати лічильник раніше за ціну. На будь-яке питання відповідається чесніше, коли від відповіді не залежить жоден підсумок.
  2. Записувати тієї миті, коли робота виходить, а не коли надходить відповідь, і пізня відповідь перестає бути проблемою вимірювання.
  3. Робити ключ ідемпотентності таким, що переживе свій предмет. Ключ на рядку, який приберуть, починає допускати дублікати за розкладом.
  4. Перелічувати кожен результат у таблиці. Типова гілка перетворює новий стан на тихий нуль.
  5. Виправлення є рядками, ніколи не редагуванням, і унікальність, що захищає оригінал, не має блокувати виправлення.
  6. Обирати порядок, який клієнт може передбачити, і записувати той, від якого відмовилися.

Для ясності про те, чим це є: моніторинг стоїть за перемикачем розгортання, вимкненим типово, шару прав із грошима всередині немає, і нічого з цього сьогодні не купити. Дві речі лишаються недоведеними. Прохід зберігання ніколи не працював проти справді старого рядка, лише проти схеми. А складник, що закриває години, випробувано через його функцію, а не через тривалий процес, тож шлюз, відсутній цілу ніч і потім наздоганяючий, є обміркованим, а не спостереженим.

Із роботи над моніторингом у Provibr. Чому зонд не несе прав, яких не потребує, є в зонд, якого ні на що не вмовити, а чому інцидент не закривається лише тому, що вимірювання припинилися, є в інцидент, який не закривається на мовчанні.

Читати далі

Почніть з одного хоста й одного агента

Створіть обліковий запис, встановіть агента однією командою та підключіть свій перший хост Proxmox. Пробний період триває 14 днів і не потребує платіжних даних.