[{"data":1,"prerenderedAt":489},["ShallowReactive",2],{"content:\u002F11-observability\u002F00-intro":3},{"title":4,"description":5,"path":6,"body":7},"Введение в observability","Observability - это способность понять состояние системы по сигналам, которые она сама отдает наружу: логам, метрикам, трейсам, профилям, health\u002Freadiness checks и событиям в инфраструктуре.","\u002F11-observability\u002F00-intro",{"type":8,"value":9,"toc":478},"minimark",[10,14,17,20,25,28,41,44,48,127,131,134,199,202,206,209,219,226,319,323,326,332,335,339,342,366,370,381,384,390,394,397,400],[11,12,4],"h1",{"id":13},"введение-в-observability",[15,16,5],"p",{},[15,18,19],{},"После модулей про HTTP, архитектуру, инфраструктуру, Kafka, Redis и PostgreSQL у вас уже есть почти production-сервис. Но без observability он остается черным ящиком: пользователи жалуются, pipeline зеленый, контейнер живой, а где деградация - непонятно.",[21,22,24],"h2",{"id":23},"три-главных-вопроса","Три главных вопроса",[15,26,27],{},"Хорошая наблюдаемость отвечает не на \"сколько у нас графиков\", а на вопросы:",[29,30,31,35,38],"ul",{},[32,33,34],"li",{},"что сейчас сломано или деградирует;",[32,36,37],{},"почему это произошло;",[32,39,40],{},"кого это затронуло и насколько сильно.",[15,42,43],{},"Если dashboard красивый, но не помогает ответить на эти вопросы, это декор, а не observability.",[21,45,47],{"id":46},"сигналы","Сигналы",[49,50,51,68],"table",{},[52,53,54],"thead",{},[55,56,57,62,65],"tr",{},[58,59,61],"th",{"align":60},"left","Сигнал",[58,63,64],{"align":60},"Для чего нужен",[58,66,67],{"align":60},"Типичная ошибка",[69,70,71,83,94,105,116],"tbody",{},[55,72,73,77,80],{},[74,75,76],"td",{"align":60},"Logs",[74,78,79],{"align":60},"Детали конкретного события: request failed, retry exhausted, migration started.",[74,81,82],{"align":60},"Писать шум без request id, user impact и причины.",[55,84,85,88,91],{},[74,86,87],{"align":60},"Metrics",[74,89,90],{"align":60},"Числа во времени: latency, error rate, queue lag, DB pool usage.",[74,92,93],{"align":60},"Мерить все подряд без SLI и владельца алерта.",[55,95,96,99,102],{},[74,97,98],{"align":60},"Traces",[74,100,101],{"align":60},"Путь запроса через сервисы, БД, cache, broker.",[74,103,104],{"align":60},"Включить tracing, но не прокидывать context.",[55,106,107,110,113],{},[74,108,109],{"align":60},"Profiles",[74,111,112],{"align":60},"CPU, memory, goroutines, mutex\u002Fblock contention.",[74,114,115],{"align":60},"Открывать pprof только после пожара.",[55,117,118,121,124],{},[74,119,120],{"align":60},"Alerts",[74,122,123],{"align":60},"Сигнал человеку, что нужен action.",[74,125,126],{"align":60},"Алертить на симптомы без runbook и порога влияния.",[21,128,130],{"id":129},"monitoring-observability-debugging","Monitoring, observability, debugging",[15,132,133],{},"Эти слова часто смешивают, но в production это разные режимы работы:",[49,135,136,149],{},[52,137,138],{},[55,139,140,143,146],{},[58,141,142],{"align":60},"Режим",[58,144,145],{"align":60},"Вопрос",[58,147,148],{"align":60},"Типичный инструмент",[69,150,151,162,173,184],{},[55,152,153,156,159],{},[74,154,155],{"align":60},"Monitoring",[74,157,158],{"align":60},"\"Система сейчас в норме?\"",[74,160,161],{"align":60},"SLI, dashboards, alerts.",[55,163,164,167,170],{},[74,165,166],{"align":60},"Observability",[74,168,169],{"align":60},"\"Почему система ведет себя именно так?\"",[74,171,172],{"align":60},"Logs, metrics, traces, profiles, events.",[55,174,175,178,181],{},[74,176,177],{"align":60},"Debugging",[74,179,180],{"align":60},"\"Как проверить гипотезу о причине?\"",[74,182,183],{"align":60},"Trace drilldown, LogQL\u002FPromQL, pprof, воспроизведение.",[55,185,186,189,192],{},[74,187,188],{"align":60},"Profiling",[74,190,191],{"align":60},"\"Где тратятся CPU, memory, locks, goroutines?\"",[74,193,194,198],{"align":60},[195,196,197],"code",{},"go tool pprof",", runtime trace, runtime metrics.",[15,200,201],{},"Monitoring первым говорит: \"что-то не так\". Observability дает данные, чтобы не гадать. Debugging - это дисциплина проверки гипотез. Profiling подключается, когда проблема похожа на CPU, memory, goroutine leak, contention или latency без явной внешней зависимости.",[21,203,205],{"id":204},"сквозной-сценарий-ratedesk","Сквозной сценарий RateDesk",[15,207,208],{},"Во всех уроках держим один сервисный путь:",[210,211,217],"pre",{"className":212,"code":214,"language":215,"meta":216},[213],"language-text","client\n  -> POST \u002Fconvert\n  -> HTTP middleware\n  -> usecase.Convert\n  -> Redis cache\n  -> PostgreSQL rates\n  -> external provider or Kafka event\n  -> response\n","text","",[195,218,214],{"__ignoreMap":216},[15,220,221,222,225],{},"И один типовой инцидент: после релиза поменялся cache key prefix, Redis hit ratio упал, PostgreSQL получил резкий рост запросов, ",[195,223,224],{},"\u002Fconvert"," стал медленным, часть клиентов начала получать timeout.",[49,227,228,240],{},[52,229,230],{},[55,231,232,235,237],{},[58,233,234],{"align":60},"Шаг",[58,236,61],{"align":60},[58,238,239],{"align":60},"Что ищем",[69,241,242,253,264,275,297,308],{},[55,243,244,247,250],{},[74,245,246],{"align":60},"Alert",[74,248,249],{"align":60},"SLO\u002Fburn rate или p95 latency",[74,251,252],{"align":60},"Есть ли user impact и насколько большой.",[55,254,255,258,261],{},[74,256,257],{"align":60},"Dashboard",[74,259,260],{"align":60},"RED\u002FUSE metrics",[74,262,263],{"align":60},"Какая route и какая зависимость деградирует.",[55,265,266,269,272],{},[74,267,268],{"align":60},"Trace",[74,270,271],{"align":60},"OpenTelemetry spans",[74,273,274],{"align":60},"Где набирается latency: cache miss, DB query, provider call.",[55,276,277,279,294],{},[74,278,76],{"align":60},[74,280,281,284,285,284,288,284,291],{"align":60},[195,282,283],{},"request_id",", ",[195,286,287],{},"trace_id",[195,289,290],{},"event",[195,292,293],{},"error.kind",[74,295,296],{"align":60},"Конкретные события вокруг запроса.",[55,298,299,302,305],{},[74,300,301],{"align":60},"Profile",[74,303,304],{"align":60},"pprof\u002Fruntime metrics",[74,306,307],{"align":60},"CPU\u002Fmemory\u002Fgoroutine проблемы, если зависимости здоровы.",[55,309,310,313,316],{},[74,311,312],{"align":60},"Runbook",[74,314,315],{"align":60},"Готовые действия",[74,317,318],{"align":60},"Rollback, stale cache, prewarm, TTL jitter, escalation.",[21,320,322],{"id":321},"что-появится-в-репозитории","Что появится в репозитории",[15,324,325],{},"К концу модуля студент должен собрать сопровождаемый observability-контур:",[210,327,330],{"className":328,"code":329,"language":215,"meta":216},[213],"internal\u002Fobservability\u002F\n  logger.go\n  request_id.go\n  metrics.go\n  tracing.go\n\ninfra\u002F\n  prometheus.yml\n  otel-collector.yml\n  grafana\u002F\n    provisioning\u002F\n    dashboards\u002F\n  alloy\u002F or fluent-bit\u002F\n  alerts\u002F\n\ndocs\u002F\n  runbooks\u002F\n  postmortems\u002F\n",[195,331,329],{"__ignoreMap":216},[15,333,334],{},"К каждому артефакту нужна проверка: пример JSON log, PromQL-запрос, trace id, dashboard panel, alert rule, runbook step или pprof-команда. Observability без evidence быстро превращается в \"кажется, оно работает\".",[21,336,338],{"id":337},"prerequisites","Prerequisites",[15,340,341],{},"Перед модулем полезно уверенно понимать:",[29,343,344,351,354,357,360,363],{},[32,345,346,347,350],{},"HTTP middleware и ",[195,348,349],{},"context.Context",";",[32,352,353],{},"Clean Architecture boundaries: transport, usecase, repository, adapter;",[32,355,356],{},"Docker Compose и сетевые имена сервисов;",[32,358,359],{},"базовую модель Prometheus: metric name, labels, samples;",[32,361,362],{},"latency percentile и отличие p95\u002Fp99 от average;",[32,364,365],{},"как сервис ходит в PostgreSQL, Redis, Kafka\u002Fprovider.",[21,367,369],{"id":368},"что-будет-в-модуле","Что будет в модуле",[15,371,372,373,376,377,380],{},"Разберем structured logging в Go через ",[195,374,375],{},"slog",", pipeline логов в Loki и ELK\u002FEFK, метрики Prometheus, tracing через OpenTelemetry, OpenTelemetry Collector как единый telemetry router, SLI\u002FSLO и alerting, ",[195,378,379],{},"pprof",", локальный stack для разработки и incident workflow.",[15,382,383],{},"Общая логика:",[210,385,388],{"className":386,"code":387,"language":215,"meta":216},[213],"instrument code -> collect signals -> build dashboards -> alert on symptoms -> debug incidents -> improve runbooks\n",[195,389,387],{"__ignoreMap":216},[21,391,393],{"id":392},"как-понять-что-освоил","Как понять, что освоил",[15,395,396],{},"Вы освоили модуль, если можете добавить в Go-сервис request id, structured logs, Prometheus metrics, trace propagation, OTel Collector pipelines для traces\u002Fmetrics\u002Flogs, базовые dashboards, pprof endpoint для закрытого контура и алерт, который ведет к понятному runbook.",[15,398,399],{},"Мини-самопроверка:",[49,401,402,415],{},[52,403,404],{},[55,405,406,409,412],{},[58,407,408],{"align":60},"Симптом",[58,410,411],{"align":60},"Первый вопрос",[58,413,414],{"align":60},"Первый сигнал",[69,416,417,431,442,456,467],{},[55,418,419,425,428],{},[74,420,421,422,424],{"align":60},"p95 ",[195,423,224],{}," вырос",[74,426,427],{"align":60},"Это все routes или одна?",[74,429,430],{"align":60},"RED dashboard и trace slow request.",[55,432,433,436,439],{},[74,434,435],{"align":60},"Данные устарели",[74,437,438],{"align":60},"API живой, но freshness нарушен?",[74,440,441],{"align":60},"Domain freshness metric.",[55,443,444,447,450],{},[74,445,446],{"align":60},"5xx выросли",[74,448,449],{"align":60},"Это системная ошибка или bad input?",[74,451,452,453,455],{"align":60},"Error ratio + ",[195,454,293],{}," в logs\u002Ftraces.",[55,457,458,461,464],{},[74,459,460],{"align":60},"Memory растет",[74,462,463],{"align":60},"Это heap, goroutines или cache cardinality?",[74,465,466],{"align":60},"runtime metrics и heap\u002Fgoroutine profile.",[55,468,469,472,475],{},[74,470,471],{"align":60},"Kafka lag растет",[74,473,474],{"align":60},"Consumer медленный или rebalance\u002Fpoison message?",[74,476,477],{"align":60},"Lag, handler duration, retry\u002FDLQ metrics.",{"title":216,"searchDepth":479,"depth":479,"links":480},2,[481,482,483,484,485,486,487,488],{"id":23,"depth":479,"text":24},{"id":46,"depth":479,"text":47},{"id":129,"depth":479,"text":130},{"id":204,"depth":479,"text":205},{"id":321,"depth":479,"text":322},{"id":337,"depth":479,"text":338},{"id":368,"depth":479,"text":369},{"id":392,"depth":479,"text":393},1781022063207]