HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-19
1 <p>Или почему "оно работает" - это не то же самое, что "я понимаю, как оно работает"</p>
1 <p>Или почему "оно работает" - это не то же самое, что "я понимаю, как оно работает"</p>
2 <p>Кирилл Казарин, спикер курса<a>"Администрирование Linux"</a>и автор телеграм-канала Kazarin.online, простыми словами объясняет, что такое Observability и зачем оно нужно. Несмотря на то, что термин уже не новый, статья будет полезна людям, плохо с ним знакомым или незнакомым вовсе. Кирилл опирается на практику и на те примеры (пусть даже вымышленные), где наблюдаемости явно не хватает.</p>
2 <p>Кирилл Казарин, спикер курса<a>"Администрирование Linux"</a>и автор телеграм-канала Kazarin.online, простыми словами объясняет, что такое Observability и зачем оно нужно. Несмотря на то, что термин уже не новый, статья будет полезна людям, плохо с ним знакомым или незнакомым вовсе. Кирилл опирается на практику и на те примеры (пусть даже вымышленные), где наблюдаемости явно не хватает.</p>
3 <p>Рассмотрели три столпа наблюдаемости, необходимые инструменты, blind spots, а также составили чек-лист "Как понять, что у вас плохое observability".</p>
3 <p>Рассмотрели три столпа наблюдаемости, необходимые инструменты, blind spots, а также составили чек-лист "Как понять, что у вас плохое observability".</p>
4 <p><strong>Что вообще такое Observability?</strong></p>
4 <p><strong>Что вообще такое Observability?</strong></p>
5 <p>Observability ("наблюдаемость") - это способность понять внутреннее состояние системы только по её внешним проявлениям. Часто ещё говорят, что это свойство системы "быть наблюдаемой" (а значит ее нужно так построить. Или перестроить).</p>
5 <p>Observability ("наблюдаемость") - это способность понять внутреннее состояние системы только по её внешним проявлениям. Часто ещё говорят, что это свойство системы "быть наблюдаемой" (а значит ее нужно так построить. Или перестроить).</p>
6 <p>Как можно представить наличие такого свойства:</p>
6 <p>Как можно представить наличие такого свойства:</p>
7 <ul><li>У вас есть черный ящик</li>
7 <ul><li>У вас есть черный ящик</li>
8 <li>Вы не можете открыть его, но можете смотреть, как он реагирует на входные сигналы</li>
8 <li>Вы не можете открыть его, но можете смотреть, как он реагирует на входные сигналы</li>
9 <li>И по этим реакциям вы должны понять, что у него внутри: как он устроен, работает ли правильно, где болит</li>
9 <li>И по этим реакциям вы должны понять, что у него внутри: как он устроен, работает ли правильно, где болит</li>
10 </ul><p>Пример из жизни:</p>
10 </ul><p>Пример из жизни:</p>
11 <p>Сломался лифт. На табло - ничего. Кнопки не горят. Диспетчер говори: "Нажмите на все кнопки". Лифт молчит. Это плохая наблюдаемость. Или вовсе её отсутствие</p>
11 <p>Сломался лифт. На табло - ничего. Кнопки не горят. Диспетчер говори: "Нажмите на все кнопки". Лифт молчит. Это плохая наблюдаемость. Или вовсе её отсутствие</p>
12 <p>Теперь представим, что у лифта:</p>
12 <p>Теперь представим, что у лифта:</p>
13 <ul><li>горят статусы: "ожидание запроса", "движение вверх", "ошибка двери";</li>
13 <ul><li>горят статусы: "ожидание запроса", "движение вверх", "ошибка двери";</li>
14 <li>логируются события: "вызов получен, но не выполнен";</li>
14 <li>логируются события: "вызов получен, но не выполнен";</li>
15 <li>и у нас есть телеметрия с контроллера.</li>
15 <li>и у нас есть телеметрия с контроллера.</li>
16 </ul><p>Это уже хорошая наблюдаемость. Мы можем понять, что происходит - не вскрывая кабину, не залезая в моторный отсек, шахту и т.д.</p>
16 </ul><p>Это уже хорошая наблюдаемость. Мы можем понять, что происходит - не вскрывая кабину, не залезая в моторный отсек, шахту и т.д.</p>
17 <p><strong>Наблюдаемость ≠ Мониторинг</strong></p>
17 <p><strong>Наблюдаемость ≠ Мониторинг</strong></p>
18 <p>Можно подумать что observability - это метрики, графики и алерты. Нет. Это смешение понятий и подмена свойства "наблюдаемости" (подчеркну - свойства), процессом сбора телеметрии, ее автоматическим анализом, визуализацией и эскалацией. То есть тем, что в современном мире называют обычно "мониторинг". Мониторинг - процесс, наблюдаемость - свойство!</p>
18 <p>Можно подумать что observability - это метрики, графики и алерты. Нет. Это смешение понятий и подмена свойства "наблюдаемости" (подчеркну - свойства), процессом сбора телеметрии, ее автоматическим анализом, визуализацией и эскалацией. То есть тем, что в современном мире называют обычно "мониторинг". Мониторинг - процесс, наблюдаемость - свойство!</p>
19 <p>Мониторинг отвечает на вопрос: "Сломалось?", "Что сломалось?", "Когда сломалось?", и даже, возможно, "Сколько раз?".</p>
19 <p>Мониторинг отвечает на вопрос: "Сломалось?", "Что сломалось?", "Когда сломалось?", и даже, возможно, "Сколько раз?".</p>
20 <p><em>Observability отвечает на вопрос: "Почему?"</em></p>
20 <p><em>Observability отвечает на вопрос: "Почему?"</em></p>
21 <p><em>Мониторинг скажет: "API /checkout возвращает 5xx. Началось 5 минут назад" (это кстати еще хороший мониторинг)</em></p>
21 <p><em>Мониторинг скажет: "API /checkout возвращает 5xx. Началось 5 минут назад" (это кстати еще хороший мониторинг)</em></p>
22 <p>Observability поможет понять, почему: "Потому что новый релиз сломал работу с Redis, а на третьей ноде таймауты к кластеру выросли до 3 секунд".</p>
22 <p>Observability поможет понять, почему: "Потому что новый релиз сломал работу с Redis, а на третьей ноде таймауты к кластеру выросли до 3 секунд".</p>
23 <p>Можно также сказать, что мониторинг отвечает на известные вопросы, observability помогает формулировать новые.</p>
23 <p>Можно также сказать, что мониторинг отвечает на известные вопросы, observability помогает формулировать новые.</p>
24 <p><strong>Три столпа наблюдаемости: метрики, логи и трассировки</strong></p>
24 <p><strong>Три столпа наблюдаемости: метрики, логи и трассировки</strong></p>
25 <p><strong>1. Метрики, она же телеметрия</strong></p>
25 <p><strong>1. Метрики, она же телеметрия</strong></p>
26 <p>Что это: численные значения, которые можно агрегировать и отображать, обрабатывать триггером, зажигать алерт, ретроспективно анализировать.</p>
26 <p>Что это: численные значения, которые можно агрегировать и отображать, обрабатывать триггером, зажигать алерт, ретроспективно анализировать.</p>
27 <p>Примеры:</p>
27 <p>Примеры:</p>
28 <p>- Количество запросов в секунду.</p>
28 <p>- Количество запросов в секунду.</p>
29 <p>- Утилизация CPU.</p>
29 <p>- Утилизация CPU.</p>
30 <p>- Ошибки 5xx.</p>
30 <p>- Ошибки 5xx.</p>
31 <p>- Время ответа 95-го перцентиля.</p>
31 <p>- Время ответа 95-го перцентиля.</p>
32 <p>Где полезны:</p>
32 <p>Где полезны:</p>
33 <p>- Оперативный мониторинг.</p>
33 <p>- Оперативный мониторинг.</p>
34 <p>- Дашборды.</p>
34 <p>- Дашборды.</p>
35 <p>- Триггеры алертов.</p>
35 <p>- Триггеры алертов.</p>
36 <p>Пример: Мы видим, что latency checkout вырос с 150ms до 900ms - и это не просто "кажется", это метрика на графике в Grafana.</p>
36 <p>Пример: Мы видим, что latency checkout вырос с 150ms до 900ms - и это не просто "кажется", это метрика на графике в Grafana.</p>
37 <p><strong>2. Логи</strong></p>
37 <p><strong>2. Логи</strong></p>
38 <p>Что это: текстовые события, часто с контекстом (уровень, время, тред, пользователь).</p>
38 <p>Что это: текстовые события, часто с контекстом (уровень, время, тред, пользователь).</p>
39 <p>Примеры:</p>
39 <p>Примеры:</p>
40 <p>- ERROR Could not connect to DB</p>
40 <p>- ERROR Could not connect to DB</p>
41 <p>- INFO User 123 placed order</p>
41 <p>- INFO User 123 placed order</p>
42 <p>- WARN Timeout during external API call</p>
42 <p>- WARN Timeout during external API call</p>
43 <p>Где полезны:</p>
43 <p>Где полезны:</p>
44 <p>- Разбор инцидентов.</p>
44 <p>- Разбор инцидентов.</p>
45 <p>- Отладка (дебаг, траблшутинг)</p>
45 <p>- Отладка (дебаг, траблшутинг)</p>
46 <p>- Поиск аномалий.</p>
46 <p>- Поиск аномалий.</p>
47 <p>Пример: Логи показывают, что ошибка NullPointerException началась ровно после релиза версии 1.4.2.</p>
47 <p>Пример: Логи показывают, что ошибка NullPointerException началась ровно после релиза версии 1.4.2.</p>
48 <p><strong>3. Трассировки (distributed tracing)</strong></p>
48 <p><strong>3. Трассировки (distributed tracing)</strong></p>
49 <p>Что это: хронология вызовов между компонентами системы.</p>
49 <p>Что это: хронология вызовов между компонентами системы.</p>
50 <p>Примеры:</p>
50 <p>Примеры:</p>
51 <p>- запрос от клиента → API Gateway → backend → сервис оплаты → база.</p>
51 <p>- запрос от клиента → API Gateway → backend → сервис оплаты → база.</p>
52 <p>Где полезны:</p>
52 <p>Где полезны:</p>
53 <p>- Понимание сложных связей в микросервисах.</p>
53 <p>- Понимание сложных связей в микросервисах.</p>
54 <p>- Выявление "долго думающих" компонентов.</p>
54 <p>- Выявление "долго думающих" компонентов.</p>
55 <p>- Оптимизация цепочек.</p>
55 <p>- Оптимизация цепочек.</p>
56 <p>Пример: Вы видите, что 70% времени на оплату тратится в вызове к стороннему платежному API. И это видно в одном клике - потому что трассировка это зафиксировала.</p>
56 <p>Пример: Вы видите, что 70% времени на оплату тратится в вызове к стороннему платежному API. И это видно в одном клике - потому что трассировка это зафиксировала.</p>
57 <p><strong>Инструменты: с чего начинается наблюдаемость</strong></p>
57 <p><strong>Инструменты: с чего начинается наблюдаемость</strong></p>
58 <p>Prometheus - сбор и хранение метрик. Альтернатив много - от Zabbix до платных облачных сервисов типа Datadog</p>
58 <p>Prometheus - сбор и хранение метрик. Альтернатив много - от Zabbix до платных облачных сервисов типа Datadog</p>
59 <p>Grafana - визуализация, алерты. Есть альтернативы но будем честны - стандарт де-факто.</p>
59 <p>Grafana - визуализация, алерты. Есть альтернативы но будем честны - стандарт де-факто.</p>
60 <p>OpenTelemetry - относительно новый, открытый стандарт для сбора логов, метрик и трассировок.</p>
60 <p>OpenTelemetry - относительно новый, открытый стандарт для сбора логов, метрик и трассировок.</p>
61 <p>Jaeger / Zipkin - трассировки.</p>
61 <p>Jaeger / Zipkin - трассировки.</p>
62 <p>Elastic stack - логи, метрики, APM. Альтернатив много, например Loki - лог-агрегатор от Grafana.</p>
62 <p>Elastic stack - логи, метрики, APM. Альтернатив много, например Loki - лог-агрегатор от Grafana.</p>
63 <p>Важно: инструменты вторичны. Сначала - понимание, какие вопросы мы хотим уметь задавать системе.</p>
63 <p>Важно: инструменты вторичны. Сначала - понимание, какие вопросы мы хотим уметь задавать системе.</p>
64 <p>Пример: есть ли у нас наблюдаемость?</p>
64 <p>Пример: есть ли у нас наблюдаемость?</p>
65 <p>Представим гипотетический инцидент:</p>
65 <p>Представим гипотетический инцидент:</p>
66 <p><em>В 03:14 начались ошибки 502 Bad Gateway. Через 7 минут алерт. На поиск причины ушло ещё 40 минут (оптимистично). Смотрели логи ряда сервисов, по документации вспоминали флоу и т.д. Параллельно смотрели а что сегодня выкатывалось (слава богам если у нас поставлен процесс change-management)! В итоге оказалось - обновили сервис расчёта доставки, и он стал отдавать 500ые ошибки из-за несовместимости с новой схемой данных, потом это другим, зависимым от него сервисом конвертнулось в 503, потому что разработчик того сервиса так решил и в итоге на API gateway мы получили 502 что и зафиксировал клиент.</em></p>
66 <p><em>В 03:14 начались ошибки 502 Bad Gateway. Через 7 минут алерт. На поиск причины ушло ещё 40 минут (оптимистично). Смотрели логи ряда сервисов, по документации вспоминали флоу и т.д. Параллельно смотрели а что сегодня выкатывалось (слава богам если у нас поставлен процесс change-management)! В итоге оказалось - обновили сервис расчёта доставки, и он стал отдавать 500ые ошибки из-за несовместимости с новой схемой данных, потом это другим, зависимым от него сервисом конвертнулось в 503, потому что разработчик того сервиса так решил и в итоге на API gateway мы получили 502 что и зафиксировал клиент.</em></p>
67 <p>Вопрос: Могли бы мы выяснить это быстрее? С меньшими усилиями? С меньшим ущербом для конечного опыта пользователей?</p>
67 <p>Вопрос: Могли бы мы выяснить это быстрее? С меньшими усилиями? С меньшим ущербом для конечного опыта пользователей?</p>
68 <p>Да, могли. Если бы мы сразу получили ответ в формате цепочки сервисов - кто от кого зависит, кто начал сбоить, когда и что в это время происходило еще (какие события могли к этому привести).</p>
68 <p>Да, могли. Если бы мы сразу получили ответ в формате цепочки сервисов - кто от кого зависит, кто начал сбоить, когда и что в это время происходило еще (какие события могли к этому привести).</p>
69 <p><strong>Что тут могло пригодиться:</strong></p>
69 <p><strong>Что тут могло пригодиться:</strong></p>
70 <p>- логи разных компонент связаны за счет единого trace-id/request-id</p>
70 <p>- логи разных компонент связаны за счет единого trace-id/request-id</p>
71 <p>- в идеале есть трейсинг запроса между компонентами. Не обязательно трейсить каждый. Можно каждый 100-ый, например, или вообще динамически включать</p>
71 <p>- в идеале есть трейсинг запроса между компонентами. Не обязательно трейсить каждый. Можно каждый 100-ый, например, или вообще динамически включать</p>
72 <p>- все компоненты отдают метрики и у нас есть выборка скажем топ 10, которые вероятнее расскажут о проблеме. Эти метрики точно покрыты триггерами. Например latency, error rate, request rate, duration и тд. Привет USE, RED, 4GS.</p>
72 <p>- все компоненты отдают метрики и у нас есть выборка скажем топ 10, которые вероятнее расскажут о проблеме. Эти метрики точно покрыты триггерами. Например latency, error rate, request rate, duration и тд. Привет USE, RED, 4GS.</p>
73 <p>Если же у вас:</p>
73 <p>Если же у вас:</p>
74 <p>- нет трассировок между компонентами,</p>
74 <p>- нет трассировок между компонентами,</p>
75 <p>- логи разрозненные и не связаны по trace-id,</p>
75 <p>- логи разрозненные и не связаны по trace-id,</p>
76 <p>- метрики, например, есть только у Nginx…</p>
76 <p>- метрики, например, есть только у Nginx…</p>
77 <p>то у вас плохая наблюдаемость.</p>
77 <p>то у вас плохая наблюдаемость.</p>
78 <p><strong>Blind spots - невидимые зоны</strong></p>
78 <p><strong>Blind spots - невидимые зоны</strong></p>
79 <p><em>"Всё, что не логируется и не мониторится - исчезает в момент инцидента"</em></p>
79 <p><em>"Всё, что не логируется и не мониторится - исчезает в момент инцидента"</em></p>
80 <p>Blind spot - это участок системы, по которому мы ничего не знаем.</p>
80 <p>Blind spot - это участок системы, по которому мы ничего не знаем.</p>
81 <p>Примеры:</p>
81 <p>Примеры:</p>
82 <p>- Вызов к стороннему API, который мы не мониторим.</p>
82 <p>- Вызов к стороннему API, который мы не мониторим.</p>
83 <p>- Скрипт, который запускается по cron и не логирует ни свою работу, ни результат. К тому же не мониторится.</p>
83 <p>- Скрипт, который запускается по cron и не логирует ни свою работу, ни результат. К тому же не мониторится.</p>
84 <p>- Внутренний сервис, который пишет в stdout, а не в централизованную систему логов (забыли мы с него настроить сбор логов)</p>
84 <p>- Внутренний сервис, который пишет в stdout, а не в централизованную систему логов (забыли мы с него настроить сбор логов)</p>
85 <p>Как искать такие зоны:</p>
85 <p>Как искать такие зоны:</p>
86 <p>- Составить карту компонентов и зависимостей.</p>
86 <p>- Составить карту компонентов и зависимостей.</p>
87 <p>- Пройтись по запросу от клиента до базы: на каждом этапе - есть ли логика, метрики, трассировки?</p>
87 <p>- Пройтись по запросу от клиента до базы: на каждом этапе - есть ли логика, метрики, трассировки?</p>
88 <p>- Если нет - это и есть blind spot.</p>
88 <p>- Если нет - это и есть blind spot.</p>
89 <p>Что отличает хорошую Observability от плохой</p>
89 <p>Что отличает хорошую Observability от плохой</p>
90 <p>Хорошая:</p>
90 <p>Хорошая:</p>
91 <p>- Система отвечает на вопросы: "что происходит", "почему", "когда началось", "что ещё пострадало".</p>
91 <p>- Система отвечает на вопросы: "что происходит", "почему", "когда началось", "что ещё пострадало".</p>
92 <p>- Лёгкий доступ к данным.</p>
92 <p>- Лёгкий доступ к данным.</p>
93 <p>- Консистентные trace-id между логами, метриками, трассировками.</p>
93 <p>- Консистентные trace-id между логами, метриками, трассировками.</p>
94 <p>- История событий доступна хотя бы за неделю. В идеале пусть даже с некоторым усреднением есть статистика за месяц-квартал-год.</p>
94 <p>- История событий доступна хотя бы за неделю. В идеале пусть даже с некоторым усреднением есть статистика за месяц-квартал-год.</p>
95 <p>Плохая:</p>
95 <p>Плохая:</p>
96 <p>- Есть только дашборд "всё зелёное" (или все красное. Светофор)</p>
96 <p>- Есть только дашборд "всё зелёное" (или все красное. Светофор)</p>
97 <p>- Нет trace-id, но есть 200 Gb логов в plaintext без таймстампов.</p>
97 <p>- Нет trace-id, но есть 200 Gb логов в plaintext без таймстампов.</p>
98 <p>- Метрики только у сторонних компонент, типа Redis, MySQL, Nginx и то просто потому что их по дефолту экспортирует мониторинг агент</p>
98 <p>- Метрики только у сторонних компонент, типа Redis, MySQL, Nginx и то просто потому что их по дефолту экспортирует мониторинг агент</p>
99 <p>- Никто не знает, откуда взять трассировку, если она вообще есть.</p>
99 <p>- Никто не знает, откуда взять трассировку, если она вообще есть.</p>
100 <p>- Вы никогда не проверяли теорию о том что выход из строя компонента Х может быть найден за Y времени с тратой Z человеческих ресурсов.</p>
100 <p>- Вы никогда не проверяли теорию о том что выход из строя компонента Х может быть найден за Y времени с тратой Z человеческих ресурсов.</p>
101 <p>Observability - это культура</p>
101 <p>Observability - это культура</p>
102 <p>Наблюдаемость - не библиотека, не тул, не плагин.</p>
102 <p>Наблюдаемость - не библиотека, не тул, не плагин.</p>
103 <p>Это подход:</p>
103 <p>Это подход:</p>
104 <p>- Придумывать, какие сигналы система должна излучать.</p>
104 <p>- Придумывать, какие сигналы система должна излучать.</p>
105 <p>- Проектировать фичи с вопросом: "а как мы поймем, что она работает?". И самое главное - “когда и почему она НЕ работает”</p>
105 <p>- Проектировать фичи с вопросом: "а как мы поймем, что она работает?". И самое главное - “когда и почему она НЕ работает”</p>
106 <p>- Не верить, что "если запрос вернул 200 - всё хорошо". Потому что видели мы JSON: 200ok {Status: “Request failed”}.</p>
106 <p>- Не верить, что "если запрос вернул 200 - всё хорошо". Потому что видели мы JSON: 200ok {Status: “Request failed”}.</p>
107 <p><strong>Итоги</strong></p>
107 <p><strong>Итоги</strong></p>
108 <p>Observability - это не про "если что, посмотрим по логам". Это про систему, которая сама себя объясняет. Начинайте с вопросов, на которые вы хотите уметь отвечать.</p>
108 <p>Observability - это не про "если что, посмотрим по логам". Это про систему, которая сама себя объясняет. Начинайте с вопросов, на которые вы хотите уметь отвечать.</p>
109 <p><strong>Чеклист: как понять, что у вас плохое observability</strong></p>
109 <p><strong>Чеклист: как понять, что у вас плохое observability</strong></p>
110 <p>1. 🔍 Есть только метрики на уровне ingress-а, но не внутри приложения.</p>
110 <p>1. 🔍 Есть только метрики на уровне ingress-а, но не внутри приложения.</p>
111 <p>2. ❓ Вы не можете за 5 минут понять, почему выросли ошибки 5xx.</p>
111 <p>2. ❓ Вы не можете за 5 минут понять, почему выросли ошибки 5xx.</p>
112 <p>3. 🧩 Логи разрознены, нет trace-id или они не совпадают между сервисами.</p>
112 <p>3. 🧩 Логи разрознены, нет trace-id или они не совпадают между сервисами.</p>
113 <p>4. 📉 У вас есть дашборды, но вы на них не смотрите (и никто не знает, что они показывают).</p>
113 <p>4. 📉 У вас есть дашборды, но вы на них не смотрите (и никто не знает, что они показывают).</p>
114 <p>5. 🌪️ В случае инцидента все бегают с kubectl logs по разным подам и грепают в надежде найти "что-то странное".</p>
114 <p>5. 🌪️ В случае инцидента все бегают с kubectl logs по разным подам и грепают в надежде найти "что-то странное".</p>
115 <p>6. 🛠️ Алёрты приходят, но вы не знаете, что с ними делать.</p>
115 <p>6. 🛠️ Алёрты приходят, но вы не знаете, что с ними делать.</p>
116 <p>7. 🔧 У новых фич нет логирования или метрик вообще.</p>
116 <p>7. 🔧 У новых фич нет логирования или метрик вообще.</p>
117 <p>8. 🔐 Запрос через 3 микросервиса нельзя восстановить end-to-end.</p>
117 <p>8. 🔐 Запрос через 3 микросервиса нельзя восстановить end-to-end.</p>
118 <p>9. 🧱 Вы не знаете, какие компоненты у вас в системе и как они связаны.</p>
118 <p>9. 🧱 Вы не знаете, какие компоненты у вас в системе и как они связаны.</p>
119 <p>10. 🐛 "Сейчас вроде работает - давайте не трогать".</p>
119 <p>10. 🐛 "Сейчас вроде работает - давайте не трогать".</p>