Документация для администратора по расширенному поиску в Deckhouse Code: эксплуатация индексации после подключения OpenSearch. Инструкции для пользователей — в руководстве пользователя.
Эксплуатация
Управление индексацией, мониторинг и устранение неполадок.
Управление на уровне инстанса
Чтобы управлять индексацией на уровне инстанса, перейдите в «Admin» → «Настройки» → «Поиск».
Раздел доступен после подключения OpenSearch.
Приостановка индексации
Установите флаг «Приостановить индексирование OpenSearch», чтобы приостановить фоновые задачи индексации и переиндексации. Чтобы снова включить индексацию, отключите флаг «Приостановить индексирование OpenSearch». После этого Sidekiq pause control автоматически возобновит работу в течение нескольких минут.
Режим индексации веток
В проектах могут использоваться следующие режимы индексации веток:
| Режим | Описание |
|---|---|
| Только ветка по умолчанию | Индексируется только ветка по умолчанию для всех проектов |
| Разрешить регулярное выражение для веток на уровне проекта | Для проектов можно задать regex для индексации дополнительных веток |
После смены режима индексации веток выполните ручную переиндексацию кода. Результаты поиска могут быть неполными до завершения индексации.
Статус индексов OpenSearch
На странице отображается таблица индексов:
| Суффикс индекса | Область поиска |
|---|---|
code |
Код (blobs) |
commits |
Коммиты |
wiki |
Wiki-страницы |
notes |
Комментарии |
milestones |
Этапы (milestones) |
merge-requests |
Запросы на слияние |
work-items |
Задачи (work items) |
Имя индекса в OpenSearch состоит из общего префикса инстанса и суффикса из таблицы, например deckhouse-development-code.
Для каждого индекса показаны: имя в OpenSearch, наличие, количество документов, состояние индекса.
Операции над индексами
На той же странице доступны следующие операции:
- Переиндексировать — переиндексация одного индекса (удаляет существующие документы и ставит фоновые задачи).
- Переиндексировать все индексы — переиндексация всех индексов.
Операция «Переиндексировать» удаляет существующие документы. Результаты поиска могут быть неполными до завершения фоновой индексации.
Индекс commits переиндексируется вместе с индексом code: отдельной операции для коммитов нет.
По этой же причине у коммитов нет отдельного значения schema_class.
Операции над индексами также можно выполнять с помощью запросов к API OpenSearch.
Мониторинг
Метрики
Обращения к OpenSearch учитываются в Prometheus отдельно для HTTP-запросов (поиск в UI и API) и для фоновых задач Sidekiq (индексация).
Имена метрик содержат elasticsearch — это историческое название в GitLab, метрики относятся к OpenSearch.
HTTP-запросы (поиск пользователей):
| Метрика | Описание |
|---|---|
http_elasticsearch_requests_total |
Число обращений к OpenSearch за один HTTP-запрос |
http_elasticsearch_requests_duration_seconds |
Суммарное время обращений к OpenSearch за один HTTP-запрос |
http_elasticsearch_requests_failed_total |
Число неудачных обращений за один HTTP-запрос (ошибки подключения или авторизации) — добавлено в Deckhouse Code |
Sidekiq (фоновая индексация):
| Метрика | Описание |
|---|---|
sidekiq_elasticsearch_requests_total |
Число обращений к OpenSearch за выполнение одного Sidekiq-задания |
sidekiq_elasticsearch_requests_duration_seconds |
Суммарное время обращений к OpenSearch за выполнение одного Sidekiq-задания |
sidekiq_elasticsearch_requests_failed_total |
Число неудачных обращений за выполнение одного Sidekiq-задания (ошибки подключения или авторизации) — добавлено в Deckhouse Code |
Индексатор репозиториев (Search::RepositoryIndexerWorker — код, коммиты, wiki):
| Метрика | Лейблы | Описание |
|---|---|---|
search_repository_indexer_starts_total |
indexer_class |
Число запусков индексации после прохождения проверки advanced_search_enabled |
search_repository_indexer_runs_total |
outcome, indexer_class |
Число завершённых запусков после получения exclusive lock (outcome: success или error) |
search_repository_indexer_duration_seconds |
outcome, indexer_class |
Длительность фазы индексации под exclusive lock |
search_repository_indexer_lock_contention_total |
— | Число случаев, когда lock не получен и задание перенесено |
Значение indexer_class — тип выполняемой индексации:
indexer_class |
Когда используется |
|---|---|
Search::RepositoryIndexer::IncrementalIndexService |
Инкрементальная индексация после изменений в репозитории |
Search::RepositoryIndexer::FullIndexService |
Полная переиндексация (force) |
Search::RepositoryIndexer::MaintainsService |
Обновление индекса по событию |
Search::RepositoryIndexer::DeleteService |
Удаление документов из индекса (пустой или удалённый репозиторий/wiki) |
Рост search_repository_indexer_lock_contention_total — признак конкуренции за lock между заданиями одного проекта.
Рост search_repository_indexer_runs_total{outcome="error"} — ошибки go-indexer или сервисов индексации; детали в логах Sidekiq.
Метрики *_failed_total увеличиваются при ошибках подключения к OpenSearch или ошибках авторизации.
Рост *_failed_total указывает на недоступность OpenSearch или на использование неверных данных для доступа.
Рост *_duration_seconds при стабильном *_total — на медленные ответы OpenSearch.
Для мониторинга индексации репозиториев ориентируйтесь на search_repository_indexer_*, для обращений к OpenSearch из Sidekiq — на sidekiq_elasticsearch_*.
Для мониторинга пользовательского поиска — на http_elasticsearch_*.
На странице «Admin» → «Настройки» → «Поиск» виджет прогресса индексации показывает число оставшихся задач переиндексации.
Те же данные доступны через эндпоинт indexing_queue_stats.
Очередь Sidekiq
Задачи индексации OpenSearch выполняются в отдельной очереди global-search-indexing, а не в общей очереди default.
Маршрутизация настраивается правилом Sidekiq: все воркеры с категорией fe_global_search попадают в эту очередь.
Отдельная очередь изолирует нагрузку индексации от остальных фоновых задач Deckhouse Code.
Cron-задачи
Для автоматизации индексации регулярно выполняются следующие cron-задачи:
| Расписание | Назначение |
|---|---|
| Каждую минуту | Индексация комментариев — обрабатывает накопившуюся очередь изменений notes |
| Ежедневно в 03:00 | Запускает индексацию проектов |
Cron-задачи не выполняют индексацию напрямую: они запускают или возобновляют соответствующие воркеры в очереди global-search-indexing.
Логи
Задачи индексации OpenSearch пишутся в логи Sidekiq. Для фильтрации используйте имя очереди global-search-indexing.
Устранение неполадок
OpenSearch недоступен
- Проверьте настройки подключения. Подробнее — в документации модуля
code. - На странице «Admin» → «Настройки» → «Поиск» появится сообщение о невозможности подключения.
- Поиск вернёт ошибку.
Неполные результаты поиска
- Дождитесь завершения фоновой индексации (виджет прогресса на странице «Admin» → «Настройки» → «Поиск»).
- Запустите переиндексацию на уровне проекта или операцию «Переиндексировать» для нужного индекса в «Admin» → «Настройки» → «Поиск».
Задачи индексации не появляются
Если новые задачи не ставятся в очередь global-search-indexing:
- Проверьте, не включена ли пауза (включён флаг «Приостановить индексирование OpenSearch») в «Admin» → «Настройки» → «Поиск». Снимите флаг и дождитесь возобновления (cron-задача выполняется каждые 5 минут).
-
Если пауза снята, а задачи по-прежнему не появляются, выполните очистку Redis — возможны зависшие lease или duplicate-ключи Sidekiq:
bundle exec rails runner fe/scripts/clear_search_opensearch_worker_redis.rbСкрипт снимает exclusive lease для
Search::RepositoryIndexerWorker, concurrency limit и dedup-ключи очередиglobal-search-indexing.
API OpenSearch
В этом разделе описаны административные OpenSearch-эндпоинты Deckhouse Code. Параметры пользовательского поиска — в разделе «API поиска».
POST /api/v4/admin/opensearch/recreate_indices
Синхронно пересоздаёт индекс(ы) OpenSearch и ставит фоновые задачи повторной индексации. Чтобы пересоздать (переиндексировать) все индексы, выполните запрос без тела. Чтобы пересоздать конкретный индекс, укажите его в теле запроса.
Права доступа: только администратор (authenticated_as_admin!).
Тело запроса
| Поле | Тип | Обязательное | Допустимые значения |
|---|---|---|---|
schema_class |
string | Да | recreate_all, Search::Opensearch::IndicesSchema::Code, Search::Opensearch::IndicesSchema::Wiki, Search::Opensearch::IndicesSchema::Note, Search::Opensearch::IndicesSchema::Milestone, Search::Opensearch::IndicesSchema::WorkItem, Search::Opensearch::IndicesSchema::MergeRequest |
Ответы
Тексты полей message в примерах ниже возвращаются API на английском языке.
202 Accepted
{
"message": "OpenSearch indices were reset; reindex jobs were enqueued."
}
400 Bad Request(например, OpenSearch выключен или сервис вернул ошибку)
{
"message": "OpenSearch is disabled"
}
Пример запроса
Этот запрос пересоздает все индексы:
curl --request POST \
--header "PRIVATE-TOKEN: <your_access_token>" \
--header "Content-Type: application/json" \
--data '{"schema_class":"recreate_all"}' \
--url "https://gitlab.example.com/api/v4/admin/opensearch/recreate_indices"
GET /api/v4/admin/opensearch/indexing_queue_stats
Возвращает статистику Sidekiq-очереди индексации OpenSearch.
Права доступа: пользователь с правом read_admin_search_indexing_queue_stats на :global.
Ответ (200 OK)
{
"total": 42,
"updated_at": "2026-07-01T12:34:56.789Z"
}
Поля ответа:
total— общее количество задач индексации в очереди;updated_at— timestamp ISO8601 с миллисекундами (илиnull).
Пример запроса
curl --request GET \
--header "PRIVATE-TOKEN: <your_access_token>" \
--url "https://gitlab.example.com/api/v4/admin/opensearch/indexing_queue_stats"