Monitoring i status

Внутренняя система мониторинга с публичной страницей статуса и обработкой инцидентов. Аптайм считается честно - время без наблюдения это "unknown", а сервисные окна не завышают доступность. Инциденты живут там, где команда уже находится, с понятной историей для клиентов.

Monitoring i status
TL;DR

Мониторинг, который не лжёт в свою пользу. Время без наблюдения - это "unknown", а не "up", а окна обслуживания не завышают доступность. К этому добавляются публичная страница статуса с честной историей и ведение инцидентов там, где команда и так есть - в Discord, а не в очередном инструменте.

Введение

Почти каждая страница статуса, на которую вы попадаете, показывает красивые числа. 100 процентов аптайма, всё зелёное, ни царапины. Проблема в том, что эти числа чаще всего означают не "всё работало", а "никто не смотрел". Отсутствие данных засчитывается как успех, и клиент получает красивую картинку без покрытия в реальности.

Мы построили мониторинг, который делает нечто более трудное, чем красивый график: он говорит правду, даже когда правда неудобна. Когда мы не знаем, как работала услуга, результат должен звучать "не знаю", а не "всё хорошо". К этому добавляются публичная страница статуса с честной историей и ведение инцидентов там, где команда и так сидит. Это исследование о том, как считать доступность, не обманывая самого себя.

Зелёное, потому что никто не смотрел

Механизм типичной лжи страницы статуса банален. Если за данный период зонд не собрал ни одной пробы, а вы всё равно засчитываете этот период как исправный, ваш аптайм всегда будет выглядеть отлично. Чем реже вы смотрите, тем лучше выглядите, что абсурдно: инструмент для слежения за доступностью награждает вас за то, что вы не следите.

Эффект удобен и неправдив. Зелёный график успокаивает команду и клиента, хотя под ним мог быть час, о котором никто ничего не знает. Мы хотели ровно противоположной позиции: "не знаю" должно значить "не знаю", а не быть тихо округлённым до "всё работает".

Статус, который всегда светит зелёным, - это не мониторинг, это обои.

Три состояния вместо двух

Вся честность этого мониторинга берётся из одного решения: у пробы три возможных состояния, а не два. Не только "up" и "down", но и "unknown" на время, в которое наблюдения просто не было. Это различие - сердце всего остального.

В доступность входят исключительно фактически собранные пробы, то есть "up" и "down". Состояния "unknown" откладываются в сторону, потому что их нельзя изображать ни в одну, ни в другую сторону. Если за данный период не было ни одного наблюдения, результат не 100 процентов и не ноль. Результат пуст, и именно так его показывает страница статуса.

availability.ts · ts
type Sample = 'up' | 'down' | 'unknown';

function availability(samples: Sample[]): number | null {
  const observed = samples.filter(s => s !== 'unknown');
  if (observed.length === 0) return null;
  const up = observed.filter(s => s === 'up').length;
  return up / observed.length;
}

Окна обслуживания без натягивания

Отдельная ловушка - запланированные перерывы. Заманчиво считать окно обслуживания исправным временем, ведь "это был запланированный перерыв, а не авария". Только тогда график снова лжёт, лишь тоньше: он делает вид, что услуга работала, когда её намеренно не было.

Мы пошли серединой, которая честна в обе стороны. Окна обслуживания помечены отдельно и не считаются простоем, потому что это не авария. Но и не делают вид, что в это время всё работало. На графике видна пауза, помеченная как обслуживание, а не искусственный зелёный фон. Это тот же принцип, который правит всем проектом: мы не округляем в свою сторону.

Откуда берётся 99.5 процента (ориентировочно)

Доступно · 96%
Недоступно · 0%
Без наблюдения · 4%
i
Примечание

На круговой диаграмме выше доступность - это 995 из 1000 наблюдений, то есть 99.5 процента, а не 995 из 1040. Сорок проб без наблюдения не входят ни в числитель, ни в знаменатель, потому что об этом времени мы просто ничего не знаем. Засчитать их к доступным искусственно подняло бы результат, а к недоступным - искусственно занизило бы.

Инциденты там, где команда и так есть

Мониторинг, который только считает, - это половина работы. Вторая половина начинается в момент, когда что-то действительно падает. Тут совершают классическую ошибку: ведение инцидента заталкивают в отдельный инструмент, в который никто не хочет входить в разгар пожара. Мы пошли туда, где команда и так есть, то есть в Discord.

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

1
Обнаружение

смена состояния услуги запускает уведомление в канале.

2
Ведение из Discord

инцидент заводится и обновляется из места, где команда и так сидит.

3
Публичная история

страница статуса показывает клиентам ход и закрытие, без прикрас.

Каков итоговый результат

Число на странице значит ровно то, что говорит. Когда там стоит 99.5 процента, это 99.5 процента из фактических наблюдений, а не артефакт того, что зонд спал полдня. Клиент смотрит на страницу статуса и видит честную историю: доступность, простои и окна обслуживания разделены, а не вечная зелень, которая ничего не значит.

Когда что-то падает, команда ведёт инцидент из места, где и так находится, без входа в очередной инструмент в наихудший из возможных моментов. Всё держится на одном принципе, который выглядит скромно, а встречается редко: мониторинг, которому можно верить, потому что он признаёт то, чего не знает, вместо того чтобы закрашивать пробелы зелёным.

Больше проектов

Другие работы из той же категории - посмотрите, как мы решаем похожие задачи.

Есть похожий проект?

Напишите нам - смета бесплатна и приходит в течение часа.