Введение в observability

Observability - это способность понять состояние системы по сигналам, которые она сама отдает наружу: логам, метрикам, трейсам, профилям, health/readiness checks и событиям в инфраструктуре.

После модулей про HTTP, архитектуру, инфраструктуру, Kafka, Redis и PostgreSQL у вас уже есть почти production-сервис. Но без observability он остается черным ящиком: пользователи жалуются, pipeline зеленый, контейнер живой, а где деградация - непонятно.

Три главных вопроса

Хорошая наблюдаемость отвечает не на "сколько у нас графиков", а на вопросы:

  • что сейчас сломано или деградирует;
  • почему это произошло;
  • кого это затронуло и насколько сильно.

Если dashboard красивый, но не помогает ответить на эти вопросы, это декор, а не observability.

Сигналы

СигналДля чего нуженТипичная ошибка
LogsДетали конкретного события: request failed, retry exhausted, migration started.Писать шум без request id, user impact и причины.
MetricsЧисла во времени: latency, error rate, queue lag, DB pool usage.Мерить все подряд без SLI и владельца алерта.
TracesПуть запроса через сервисы, БД, cache, broker.Включить tracing, но не прокидывать context.
ProfilesCPU, memory, goroutines, mutex/block contention.Открывать pprof только после пожара.
AlertsСигнал человеку, что нужен action.Алертить на симптомы без runbook и порога влияния.

Monitoring, observability, debugging

Эти слова часто смешивают, но в production это разные режимы работы:

РежимВопросТипичный инструмент
Monitoring"Система сейчас в норме?"SLI, dashboards, alerts.
Observability"Почему система ведет себя именно так?"Logs, metrics, traces, profiles, events.
Debugging"Как проверить гипотезу о причине?"Trace drilldown, LogQL/PromQL, pprof, воспроизведение.
Profiling"Где тратятся CPU, memory, locks, goroutines?"go tool pprof, runtime trace, runtime metrics.

Monitoring первым говорит: "что-то не так". Observability дает данные, чтобы не гадать. Debugging - это дисциплина проверки гипотез. Profiling подключается, когда проблема похожа на CPU, memory, goroutine leak, contention или latency без явной внешней зависимости.

Сквозной сценарий RateDesk

Во всех уроках держим один сервисный путь:

text
client -> POST /convert -> HTTP middleware -> usecase.Convert -> Redis cache -> PostgreSQL rates -> external provider or Kafka event -> response

И один типовой инцидент: после релиза поменялся cache key prefix, Redis hit ratio упал, PostgreSQL получил резкий рост запросов, /convert стал медленным, часть клиентов начала получать timeout.

ШагСигналЧто ищем
AlertSLO/burn rate или p95 latencyЕсть ли user impact и насколько большой.
DashboardRED/USE metricsКакая route и какая зависимость деградирует.
TraceOpenTelemetry spansГде набирается latency: cache miss, DB query, provider call.
Logsrequest_id, trace_id, event, error.kindКонкретные события вокруг запроса.
Profilepprof/runtime metricsCPU/memory/goroutine проблемы, если зависимости здоровы.
RunbookГотовые действияRollback, stale cache, prewarm, TTL jitter, escalation.

Что появится в репозитории

К концу модуля студент должен собрать сопровождаемый observability-контур:

text
internal/observability/ logger.go request_id.go metrics.go tracing.go infra/ prometheus.yml otel-collector.yml grafana/ provisioning/ dashboards/ alloy/ or fluent-bit/ alerts/ docs/ runbooks/ postmortems/

К каждому артефакту нужна проверка: пример JSON log, PromQL-запрос, trace id, dashboard panel, alert rule, runbook step или pprof-команда. Observability без evidence быстро превращается в "кажется, оно работает".

Prerequisites

Перед модулем полезно уверенно понимать:

  • HTTP middleware и context.Context;
  • Clean Architecture boundaries: transport, usecase, repository, adapter;
  • Docker Compose и сетевые имена сервисов;
  • базовую модель Prometheus: metric name, labels, samples;
  • latency percentile и отличие p95/p99 от average;
  • как сервис ходит в PostgreSQL, Redis, Kafka/provider.

Что будет в модуле

Разберем structured logging в Go через slog, pipeline логов в Loki и ELK/EFK, метрики Prometheus, tracing через OpenTelemetry, OpenTelemetry Collector как единый telemetry router, SLI/SLO и alerting, pprof, локальный stack для разработки и incident workflow.

Общая логика:

text
instrument code -> collect signals -> build dashboards -> alert on symptoms -> debug incidents -> improve runbooks

Как понять, что освоил

Вы освоили модуль, если можете добавить в Go-сервис request id, structured logs, Prometheus metrics, trace propagation, OTel Collector pipelines для traces/metrics/logs, базовые dashboards, pprof endpoint для закрытого контура и алерт, который ведет к понятному runbook.

Мини-самопроверка:

СимптомПервый вопросПервый сигнал
p95 /convert выросЭто все routes или одна?RED dashboard и trace slow request.
Данные устарелиAPI живой, но freshness нарушен?Domain freshness metric.
5xx вырослиЭто системная ошибка или bad input?Error ratio + error.kind в logs/traces.
Memory растетЭто heap, goroutines или cache cardinality?runtime metrics и heap/goroutine profile.
Kafka lag растетConsumer медленный или rebalance/poison message?Lag, handler duration, retry/DLQ metrics.