Сбор метрик и трейсов в Reindexer

В Reindexer интегрировано несколько механизмов трассировки выполнения запросов и сборка различных метрик:

  • клиентские метрики Prometheus (только для Go),
  • клиентские трейсы OpenTelemetry (только для Go),
  • серверные метрики Prometheus.

OpenTelemetry

Go-байндинг Reindexer’а имеет интеграцию с OpenTelemetry.

Трейсы собираются для всех пользовательских обращений к API (OpenNamespace, Upsert и т.д.) во всех доступных режимах (built-in, built-in server, standalone). Для включения сбора трейсов требуется передать опцию reindexer.WithOpenTelemetry() при создании инстанса БД:

db := reindexer.NewReindex("cproto://user:pass@127.0.0.1:6534/testdb", reindexer.WithOpenTelemetry())

Все обращения к клиентскому API генерируют спаны OpenTelemetry с именем вызванной операции, DSN, неймспейсом и т.д. Например, для такого вызова:

db.OpenNamespace("items", reindexer.DefaultNamespaceOptions(), Item{})

будет создан спан OpenTelemetry с именем Reindexer.OpenNamespace и со следующими атрибутами:

  • rx.dsn: cproto://user:pass@127.0.0.1:6534/testdb,
  • rx.ns: items.

Для экспортирования трейсов из reindexer’а в клиентском приложении можно использовать, например, модуль opentelemetry-go. Более подробное описания интеграции OpenTelemetry в приложение можно найти в разделе Getting Started в описании модуля.

Prometheus

Метрики reindexer можно собирать как из клиентского приложения, так и непосредственно с сервера. Как серверные, так и клиентские метрики содержат показатель latency, клиентская latency включает в себя всё время, которое приложение расходует на внутренние очереди go-байндинга, сетевое взаимодействие (в случае CPROTO) и сериализацию/десериализацю. В то время как серверное значение latency относится непосредственно ко времени выполнения запроса в ядре. Таким образом, значение latency, полученное из клиентского байндинга может быть более информативным.

Со стороны клиента (Go)

Go-байндинг Reindexer’а использует модуль prometheus/client_golang для сбора базовых метрик запросов (например, по latency или по количеству запросов в секунду). Для включения сбора метрик требуется передать опцию reindexer.WithPrometheusMetrics() при создании инстанса БД:

db := reindexer.NewReindex("cproto://user:pass@127.0.0.1:6534/testdb", reindexer.WithPrometheusMetrics())
// Регистрация обработчика prometheus для клиентского HTTP-сервера, чтобы иметь возможно получать метрики из клиентского приложения
http.Handle("/metrics", promhttp.Handler())

Со стороны сервера

Все метрики экспортируются в DefaultRegistry. Пример базового использования prometheus можно найти здесь.

Метрики доступны через HTTP по URL /metrics (например, http://localhost:9088/metrics). По умолчанию сбор метрик выключен. Для их включения требуется передать флаг --prometheus при запуске reindexer_server (или установить флаг metrics:prometheus в файле конфигурации). Более подробное описание флагов в разделе «Конфигурация сервера Reindexer».

На текущий момент сервер предоставляет следующий набор метрик:

  • reindexer_qps_total - общее количество запросов в секунду (разделённых по БД, неймспейсам и типам);
  • reindexer_avg_latency - среднее значение latency запросов (разделённых по БД, неймспейсам и типам);
  • reindexer_caches_size_bytes, reindexer_indexes_size_bytes, reindexer_data_size_bytes - размер данных, индексов и кэшей для каждого неймспейса;
  • reindexer_items_count - количество документов в каждом неймспейсе;
  • reindexer_memory_allocated_bytes - текущее количество аллоцированной памяти (по данным из tcmalloc/jemalloc);
  • reindexer_rpc_clients_count - текущее количество RPC-подключений к каждой БД;
  • reindexer_input_traffic_total_bytes, reindexer_output_traffic_total_bytes - общий объём входящего/исходящего траффика для каждой БД (RPC/HTTP);
  • reindexer_info - общая информация об инстансе (на текущий момент это просто номер версии).