Сбор метрик и трейсов в 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- общая информация об инстансе (на текущий момент это просто номер версии);reindexer_embed_last_sec_qps- количество обращений к эмбедеру за последнюю секунду;reindexer_embed_last_sec_dps- количество векторизованных документов за последнюю секунду;reindexer_embed_last_sec_errors_count- количество ошибок автовекторизации за последнюю секунду;reindexer_embed_last_sec_avg_latency_us- среднее время автовекторизации за последнюю секунду;reindexer_embed_conn_in_use- текущее количество используемых подключений для автовекторизации;reindexer_embed_last_sec_avg_embed_latency_us- среднее время автовекторизации при кеш-промахе за последнюю секунду.