Ответ
В 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).