В чем разница между мониторингом и трассировкой (tracing)?

«В чем разница между мониторингом и трассировкой (tracing)?» — вопрос из категории Мониторинг и логирование, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В DevOps-практике мониторинг и трассировка — это взаимодополняющие, но разные дисциплины для обеспечения надёжности и наблюдаемости (Observability) системы.

Мониторинг отвечает на вопрос "Что происходит и есть ли проблема?". Он фокусируется на сборе и анализе агрегированных метрик (CPU, память, latency, error rate) для определения состояния системы и срабатывания алертов.

Трассировка (Distributed Tracing) отвечает на вопрос "Почему возникла проблема и как конкретный запрос прошёл через систему?". Она отслеживает путь (трейс) единичного запроса через все микросервисы, позволяя анализировать задержки и зависимости.

Сравнение на практике:

Аспект Мониторинг Трассировка
Данные Агрегированные метрики (Prometheus), логи (Loki). Распределённые трейсы (Jaeger, Tempo).
Уровень Уровень сервиса/инфраструктуры. Уровень отдельного запроса (request).
Инструменты Prometheus, Grafana для дашбордов и алертов. Jaeger, Zipkin, OpenTelemetry для инструментации кода.
Пример проблемы "95-й перцентиль задержки API вырос до 2 секунд". "Запрос к /checkout тормозит из-за медленного вызова сервиса payments на шаге 3".

Пример настройки трассировки с OpenTelemetry для Python-сервиса:

# Установка инструментации для Flask и запросов
from opentelemetry import trace
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor
from opentelemetry.exporter.jaeger.thrift import JaegerExporter
from opentelemetry.instrumentation.flask import FlaskInstrumentor
from opentelemetry.instrumentation.requests import RequestsInstrumentor

app = Flask(__name__)

# Настройка провайдера трейсов и экспорта в Jaeger
trace.set_tracer_provider(TracerProvider())
jaeger_exporter = JaegerExporter(
    agent_host_name="jaeger-agent",
    agent_port=6831,
)
trace.get_tracer_provider().add_span_processor(BatchSpanProcessor(jaeger_exporter))

# Автоматическая инструментация Flask и библиотеки requests
FlaskInstrumentor().instrument_app(app)
RequestsInstrumentor().instrument()

@app.route('/api')
def example_api():
    tracer = trace.get_tracer(__name__)
    with tracer.start_as_current_span("api_work"):
        # Бизнес-логика и вызовы других сервисов
        # Каждый вложенный span будет частью одного трейса
        return "OK"

В современном стеке оба подхода объединяются: метрики и трейсы собираются через OpenTelemetry и визуализируются в единой панели (например, Grafana с Loki, Tempo и Prometheus).