Сбор метрик и трейсов в 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
- общая информация об инстансе (на текущий момент это просто номер версии).