Документация для администратора по расширенному поиску в Deckhouse Code: эксплуатация индексации после подключения OpenSearch. В модуле Deckhouse Kubernetes Platform OpenSearch подключается в ресурсе CodeInstance, это описано в разделе «Расширенный поиск» документации модуля. Инструкции для пользователей — в руководстве пользователя.

Эксплуатация

Управление индексацией, мониторинг и устранение неполадок.

Управление на уровне инстанса

Чтобы управлять индексацией на уровне инстанса, перейдите в «Admin» → «Настройки» → «Поиск».

Раздел доступен после подключения OpenSearch.

Приостановка индексации

Установите флаг «Приостановить индексирование OpenSearch», чтобы приостановить фоновые задачи индексации и переиндексации. Чтобы снова включить индексацию, отключите флаг «Приостановить индексирование OpenSearch». После этого Sidekiq pause control автоматически возобновит работу в течение нескольких минут.

Режим индексации веток

В проектах могут использоваться следующие режимы индексации веток:

РежимОписание
Только ветка по умолчаниюИндексируется только ветка по умолчанию для всех проектов
Разрешить регулярное выражение для веток на уровне проектаДля проектов можно задать regex для индексации дополнительных веток

После смены режима индексации веток выполните ручную переиндексацию кода. Результаты поиска могут быть неполными до завершения индексации.

Статус индексов OpenSearch

На странице отображается таблица индексов:

Суффикс индексаОбласть поиска
codeКод (blobs)
commitsКоммиты
wikiWiki-страницы
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_totalindexer_classЧисло запусков индексации после прохождения проверки advanced_search_enabled
search_repository_indexer_runs_totaloutcome, indexer_classЧисло завершённых запусков после получения exclusive lock (outcome: success или error)
search_repository_indexer_duration_secondsoutcome, 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 недоступен

  • На странице «Admin» → «Настройки» → «Поиск» появится сообщение о невозможности подключения.
  • Поиск вернёт ошибку.

Адрес и учётные данные OpenSearch задаются в конфигурации типа установки, а не в интерфейсе:

  • Пакет для ОС Linux
  • Omnibus Docker
  • Helm-чарт
  • Модуль Deckhouse Kubernetes Platform
Ключ gitlab_rails['fe_search'] в файле /etc/gitlab/gitlab.rb, применяется командой sudo gitlab-ctl reconfigure.
Тот же ключ в файле /etc/gitlab/gitlab.rb в томе с конфигурацией, применяется командой docker exec code gitlab-ctl reconfigure.

Значения global.appConfig.search релиза, применяются командой helm upgrade.

Ресурс CodeInstance, описан в разделе «Расширенный поиск» документации модуля.

Неполные результаты поиска

  • Дождитесь завершения фоновой индексации (виджет прогресса на странице «Admin» → «Настройки» → «Поиск»).
  • Запустите переиндексацию на уровне проекта или операцию «Переиндексировать» для нужного индекса в «Admin» → «Настройки» → «Поиск».

Задачи индексации не появляются

Если новые задачи не ставятся в очередь global-search-indexing:

  1. Проверьте, не включена ли пауза (включён флаг «Приостановить индексирование OpenSearch») в «Admin» → «Настройки» → «Поиск». Снимите флаг и дождитесь возобновления (cron-задача выполняется каждые 5 минут).

  2. Если пауза снята, а задачи по-прежнему не появляются, выполните очистку Redis — возможны зависшие lease или duplicate-ключи Sidekiq:

    • Пакет для ОС Linux
    • Omnibus Docker
    • Helm-чарт
    • Модуль Deckhouse Kubernetes Platform
    sudo gitlab-rails runner /opt/gitlab/embedded/service/gitlab-rails/fe/scripts/clear_search_opensearch_worker_redis.rb
    docker exec code gitlab-rails runner /opt/gitlab/embedded/service/gitlab-rails/fe/scripts/clear_search_opensearch_worker_redis.rb
    d8 k -n code exec deploy/code-toolbox -- gitlab-rails runner /srv/gitlab/fe/scripts/clear_search_opensearch_worker_redis.rb
    d8 k -n d8-code exec -it -c toolbox deploy/toolbox -- gitlab-rails runner /srv/gitlab/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_classstringДа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: <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: <ACCESS_TOKEN>" \
  --url "https://gitlab.example.com/api/v4/admin/opensearch/indexing_queue_stats"

Дополнительные ресурсы