From 7a1cf3c557863a08416af3ecd0edeb99b3e00c97 Mon Sep 17 00:00:00 2001
From: scarletmerlin123 <242427742+scarletmerlin123@users.noreply.github.com>
Date: Fri, 4 Sep 2026 07:24:55 -0500
Subject: [PATCH] feat(metrics): add page for viewing data index metrics
(#18070)
feat(metrics): Create data table display of index metrics (#18070)
feat(metrics): update with copilot recommendations (#18070)
---
.../opencti-front/lang/front/de.json | 8 ++
.../opencti-front/lang/front/en.json | 8 ++
.../opencti-front/lang/front/es.json | 8 ++
.../opencti-front/lang/front/fr.json | 8 ++
.../opencti-front/lang/front/it.json | 8 ++
.../opencti-front/lang/front/ja.json | 8 ++
.../opencti-front/lang/front/ko.json | 8 ++
.../opencti-front/lang/front/ru.json | 8 ++
.../opencti-front/lang/front/zh.json | 8 ++
.../src/private/components/nav/useNavMenu.tsx | 1 +
.../src/private/components/settings/Root.tsx | 12 ++
.../settings/index_metrics/IndexMetrics.tsx | 37 ++++++
.../index_metrics/IndexMetricsSummary.tsx | 67 ++++++++++
.../index_metrics/IndexMetricsTable.tsx | 123 ++++++++++++++++++
.../src/schema/relay.schema.graphql | 19 +++
.../config/schema/opencti.graphql | 16 +++
.../opencti-graphql/src/database/engine.ts | 27 ++++
.../src/domain/searchMetrics.js | 6 +-
.../opencti-graphql/src/generated/graphql.ts | 50 +++++++
.../src/resolvers/elasticSearchMetrics.js | 3 +-
20 files changed, 431 insertions(+), 2 deletions(-)
create mode 100644 opencti-platform/opencti-front/src/private/components/settings/index_metrics/IndexMetrics.tsx
create mode 100644 opencti-platform/opencti-front/src/private/components/settings/index_metrics/IndexMetricsSummary.tsx
create mode 100644 opencti-platform/opencti-front/src/private/components/settings/index_metrics/IndexMetricsTable.tsx
diff --git a/opencti-platform/opencti-front/lang/front/de.json b/opencti-platform/opencti-front/lang/front/de.json
index 6456ef123f42..8ed621c796c1 100644
--- a/opencti-platform/opencti-front/lang/front/de.json
+++ b/opencti-platform/opencti-front/lang/front/de.json
@@ -695,6 +695,7 @@
"Close disconnection process?": "Verbindungsabbruch?",
"Close registration process?": "Den Registrierungsprozess abschließen?",
"Close unregistration process?": "Den Abmeldevorgang abschließen?",
+ "Closed": "Geschlossen",
"Cloud": "Wolke",
"Cloud Control Plane": "Cloud Control Plane",
"club": "Informelle Gruppe",
@@ -1618,7 +1619,9 @@
"Do you want to unlink this task ?": "Möchten Sie die Verknüpfung dieser Aufgabe aufheben?",
"Do you want to unlink this task template ?": "Möchten Sie die Verknüpfung dieser Aufgabenvorlage aufheben?",
"Do you want to unlink this task?": "Möchten Sie die Verknüpfung dieser Aufgabe aufheben?",
+ "Document count": "Anzahl der Dokumente",
"documentation": "dokumentation",
+ "Documents": "Dokumente",
"does not exist in the main knowledge base": "nicht in der Hauptwissensbasis vorhanden ist",
"Domain": "Bereich",
"Domain names": "Domänennamen",
@@ -2575,6 +2578,11 @@
"Incorporating your message…": "Einbindung Ihrer Nachricht…",
"Increasing": "Steigend",
"independent": "unabhängig",
+ "Index health": "Indexgesundheit",
+ "Index metrics": "Indexmetriken",
+ "Index name": "Index Name",
+ "Index size": "Indexgröße",
+ "Index status": "Index-Status",
"Indexed files": "Indizierte Dateien",
"Indexing": "Indizierung",
"Indexing manager start": "Indizierungsmanager Start",
diff --git a/opencti-platform/opencti-front/lang/front/en.json b/opencti-platform/opencti-front/lang/front/en.json
index 82ee7bfaa1b9..541fda580148 100644
--- a/opencti-platform/opencti-front/lang/front/en.json
+++ b/opencti-platform/opencti-front/lang/front/en.json
@@ -695,6 +695,7 @@
"Close disconnection process?": "Close disconnection process?",
"Close registration process?": "Close registration process?",
"Close unregistration process?": "Close unregistration process?",
+ "Closed": "Closed",
"Cloud": "Cloud",
"Cloud Control Plane": "Cloud Control Plane",
"club": "Informal group",
@@ -1618,7 +1619,9 @@
"Do you want to unlink this task ?": "Do you want to unlink this task ?",
"Do you want to unlink this task template ?": "Do you want to unlink this task template ?",
"Do you want to unlink this task?": "Do you want to unlink this task?",
+ "Document count": "Document count",
"documentation": "documentation",
+ "Documents": "Documents",
"does not exist in the main knowledge base": "does not exist in the main knowledge base",
"Domain": "Domain",
"Domain names": "Domain names",
@@ -2575,6 +2578,11 @@
"Incorporating your message…": "Incorporating your message…",
"Increasing": "Increasing",
"independent": "independent",
+ "Index health": "Index health",
+ "Index metrics": "Index metrics",
+ "Index name": "Index name",
+ "Index size": "Index size",
+ "Index status": "Index status",
"Indexed files": "Indexed files",
"Indexing": "Indexing",
"Indexing manager start": "Indexing manager start",
diff --git a/opencti-platform/opencti-front/lang/front/es.json b/opencti-platform/opencti-front/lang/front/es.json
index fdc3db47522a..371f7151132d 100644
--- a/opencti-platform/opencti-front/lang/front/es.json
+++ b/opencti-platform/opencti-front/lang/front/es.json
@@ -695,6 +695,7 @@
"Close disconnection process?": "¿Cerrar el proceso de desconexión?",
"Close registration process?": "Cerrar el proceso de registro",
"Close unregistration process?": "¿Cerrar el proceso de desregistro?",
+ "Closed": "Cerrado",
"Cloud": "Nube",
"Cloud Control Plane": "Plano de control de nube",
"club": "Grupo informal",
@@ -1618,7 +1619,9 @@
"Do you want to unlink this task ?": "¿Desea desvincular esta tarea?",
"Do you want to unlink this task template ?": "¿Desea desvincular esta plantilla de tarea?",
"Do you want to unlink this task?": "¿Quieres desvincular esta tarea?",
+ "Document count": "Recuento de documentos",
"documentation": "documentación",
+ "Documents": "Documentos",
"does not exist in the main knowledge base": "no existe en la base de conocimiento principal",
"Domain": "Nombre de dominio",
"Domain names": "Nombres de dominio",
@@ -2575,6 +2578,11 @@
"Incorporating your message…": "Incorporando tu mensaje…",
"Increasing": "Aumentando",
"independent": "Independiente",
+ "Index health": "Índice de salud",
+ "Index metrics": "Métricas del índice",
+ "Index name": "Índice nombre",
+ "Index size": "Tamaño del índice",
+ "Index status": "Estado del índice",
"Indexed files": "Ficheros indexados",
"Indexing": "Indexación",
"Indexing manager start": "Inicio del gestor de indexación",
diff --git a/opencti-platform/opencti-front/lang/front/fr.json b/opencti-platform/opencti-front/lang/front/fr.json
index 9922f5673617..b0084b7f7205 100644
--- a/opencti-platform/opencti-front/lang/front/fr.json
+++ b/opencti-platform/opencti-front/lang/front/fr.json
@@ -695,6 +695,7 @@
"Close disconnection process?": "Fermer le processus de déconnexion ?",
"Close registration process?": "Fermer le processus d'enregistrement ?",
"Close unregistration process?": "Fermer le processus de désenregistrement ?",
+ "Closed": "Fermés",
"Cloud": "Nuage",
"Cloud Control Plane": "Plan de contrôle Cloud",
"club": "Groupe informel",
@@ -1618,7 +1619,9 @@
"Do you want to unlink this task ?": "Voulez-vous dissocier cette tâche ?",
"Do you want to unlink this task template ?": "Voulez-vous dissocier ce modèle de tâche ?",
"Do you want to unlink this task?": "Voulez-vous dissocier cette tâche ?",
+ "Document count": "Nombre de documents",
"documentation": "documentation",
+ "Documents": "Documents",
"does not exist in the main knowledge base": "n'existe pas dans la base de connaissances principale",
"Domain": "Nom de domaine",
"Domain names": "Noms de domaine",
@@ -2575,6 +2578,11 @@
"Incorporating your message…": "Intégration de votre message…",
"Increasing": "En hausse",
"independent": "indépendant",
+ "Index health": "Indice santé",
+ "Index metrics": "Indicateurs de l'indice",
+ "Index name": "Nom de l’index",
+ "Index size": "Taille de l’index",
+ "Index status": "Index Status",
"Indexed files": "Fichiers indexés",
"Indexing": "Indexation",
"Indexing manager start": "Démarrage du moteur d'indexation",
diff --git a/opencti-platform/opencti-front/lang/front/it.json b/opencti-platform/opencti-front/lang/front/it.json
index fbb4c8409053..8c511e6a7b66 100644
--- a/opencti-platform/opencti-front/lang/front/it.json
+++ b/opencti-platform/opencti-front/lang/front/it.json
@@ -695,6 +695,7 @@
"Close disconnection process?": "Chiudere la procedura di disconnessione?",
"Close registration process?": "Chiudere il processo di registrazione?",
"Close unregistration process?": "Chiudere il processo di disregistrazione?",
+ "Closed": "Chiuso",
"Cloud": "Nuvola",
"Cloud Control Plane": "Piano di controllo cloud",
"club": "Club",
@@ -1618,7 +1619,9 @@
"Do you want to unlink this task ?": "Vuoi scollegare questo task ?",
"Do you want to unlink this task template ?": "Vuoi scollegare questo template di task ?",
"Do you want to unlink this task?": "Vuoi scollegare questo task?",
+ "Document count": "Conteggio documenti",
"documentation": "documentazione",
+ "Documents": "Documenti",
"does not exist in the main knowledge base": "non esiste nella base di conoscenza principale",
"Domain": "Dominio",
"Domain names": "Nomi di dominio",
@@ -2575,6 +2578,11 @@
"Incorporating your message…": "Inserimento del messaggio…",
"Increasing": "Crescente",
"independent": "indipendente",
+ "Index health": "Indice salute",
+ "Index metrics": "Indice metriche",
+ "Index name": "Nome indice",
+ "Index size": "Dimensioni dell'indice",
+ "Index status": "Stato indice",
"Indexed files": "File indicizzati",
"Indexing": "Indicizzazione",
"Indexing manager start": "Avvio del gestore dell'indicizzazione",
diff --git a/opencti-platform/opencti-front/lang/front/ja.json b/opencti-platform/opencti-front/lang/front/ja.json
index 3c24758d64b8..f09308c93227 100644
--- a/opencti-platform/opencti-front/lang/front/ja.json
+++ b/opencti-platform/opencti-front/lang/front/ja.json
@@ -695,6 +695,7 @@
"Close disconnection process?": "切断プロセスを終了しますか?",
"Close registration process?": "登録プロセスを終了しますか?",
"Close unregistration process?": "登録を解除しますか?",
+ "Closed": "閉じた",
"Cloud": "クラウド",
"Cloud Control Plane": "クラウドコントロールプレーン",
"club": "インフォーマルグループ",
@@ -1618,7 +1619,9 @@
"Do you want to unlink this task ?": "このタスクのリンクを解除しますか?",
"Do you want to unlink this task template ?": "このタスクテンプレートのリンクを解除しますか?",
"Do you want to unlink this task?": "このタスクのリンクを解除しますか?",
+ "Document count": "文書リストカウント",
"documentation": "ドキュメンテーション",
+ "Documents": "ドキュメント",
"does not exist in the main knowledge base": "メイン知識ベースに存在しない",
"Domain": "ドメイン",
"Domain names": "ドメイン名",
@@ -2575,6 +2578,11 @@
"Incorporating your message…": "メッセージを組み込んでいます…",
"Increasing": "増加",
"independent": "無所属",
+ "Index health": "インデックスの健全性",
+ "Index metrics": "インデックスメトリクス",
+ "Index name": "インデックス名",
+ "Index size": "インデックスサイズ",
+ "Index status": "インデックスの状態",
"Indexed files": "索引的文件",
"Indexing": "インデックス作成",
"Indexing manager start": "インデックスマネージャ開始",
diff --git a/opencti-platform/opencti-front/lang/front/ko.json b/opencti-platform/opencti-front/lang/front/ko.json
index 56186620ae2d..5e982f85c492 100644
--- a/opencti-platform/opencti-front/lang/front/ko.json
+++ b/opencti-platform/opencti-front/lang/front/ko.json
@@ -695,6 +695,7 @@
"Close disconnection process?": "연결 해제 과정을 종료하시겠습니까?",
"Close registration process?": "등록 절차를 닫으시겠습니까?",
"Close unregistration process?": "등록 취소 프로세스를 닫으시겠습니까?",
+ "Closed": "닫힘",
"Cloud": "클라우드",
"Cloud Control Plane": "클라우드 제어 평면",
"club": "비공식 그룹",
@@ -1618,7 +1619,9 @@
"Do you want to unlink this task ?": "이 작업의 연결을 해제하시겠습니까?",
"Do you want to unlink this task template ?": "이 작업 템플릿의 연결을 해제하시겠습니까?",
"Do you want to unlink this task?": "이 작업의 연결을 해제하시겠습니까?",
+ "Document count": "문서 수",
"documentation": "문서",
+ "Documents": "문서",
"does not exist in the main knowledge base": "기본 지식창고에 존재하지 않음",
"Domain": "도메인",
"Domain names": "도메인 이름",
@@ -2575,6 +2578,11 @@
"Incorporating your message…": "메시지를 반영 중…",
"Increasing": "증가",
"independent": "독립적",
+ "Index health": "색인 상태",
+ "Index metrics": "색인 메트릭",
+ "Index name": "색인 이름",
+ "Index size": "인덱스 크기",
+ "Index status": "인덱스 상태",
"Indexed files": "인덱싱된 파일",
"Indexing": "인덱싱",
"Indexing manager start": "인덱싱 관리자 시작",
diff --git a/opencti-platform/opencti-front/lang/front/ru.json b/opencti-platform/opencti-front/lang/front/ru.json
index 79b98d6c202c..46b2b432bda4 100644
--- a/opencti-platform/opencti-front/lang/front/ru.json
+++ b/opencti-platform/opencti-front/lang/front/ru.json
@@ -695,6 +695,7 @@
"Close disconnection process?": "Закрыть процесс отключения?",
"Close registration process?": "Закрыть процесс регистрации?",
"Close unregistration process?": "Закрыть процесс снятия с регистрации?",
+ "Closed": "Закрыт",
"Cloud": "Облако",
"Cloud Control Plane": "Плоскость управления облаками",
"club": "клуб",
@@ -1618,7 +1619,9 @@
"Do you want to unlink this task ?": "Вы хотите отвязать эту задачу?",
"Do you want to unlink this task template ?": "Вы хотите отвязать этот шаблон задачи?",
"Do you want to unlink this task?": "Вы хотите отвязать эту задачу?",
+ "Document count": "Подсчет количества документов",
"documentation": "документация",
+ "Documents": "документации",
"does not exist in the main knowledge base": "не существует в основной базе знаний",
"Domain": "Домен",
"Domain names": "Доменные имена",
@@ -2575,6 +2578,11 @@
"Incorporating your message…": "Включение вашего сообщения…",
"Increasing": "Увеличение",
"independent": "независимый",
+ "Index health": "Индекс работоспособности",
+ "Index metrics": "Метрики индекса",
+ "Index name": "Имя индекса",
+ "Index size": "Размер индекса",
+ "Index status": "Статус индекса",
"Indexed files": "Индексированные файлы",
"Indexing": "Индексирование",
"Indexing manager start": "Запуск менеджера индексирования",
diff --git a/opencti-platform/opencti-front/lang/front/zh.json b/opencti-platform/opencti-front/lang/front/zh.json
index f92dff994ee7..7e4e02e32972 100644
--- a/opencti-platform/opencti-front/lang/front/zh.json
+++ b/opencti-platform/opencti-front/lang/front/zh.json
@@ -695,6 +695,7 @@
"Close disconnection process?": "关闭断开连接过程?",
"Close registration process?": "关闭注册程序?",
"Close unregistration process?": "关闭取消注册程序?",
+ "Closed": "闭门",
"Cloud": "云",
"Cloud Control Plane": "云控制平面",
"club": "俱乐部",
@@ -1618,7 +1619,9 @@
"Do you want to unlink this task ?": "您要取消链接此任务吗?",
"Do you want to unlink this task template ?": "要取消链接此任务模板吗?",
"Do you want to unlink this task?": "您想取消这项任务的链接吗?",
+ "Document count": "文档相对计数",
"documentation": "文档",
+ "Documents": "文档",
"does not exist in the main knowledge base": "在主知识库中不存在",
"Domain": "域",
"Domain names": "域名",
@@ -2575,6 +2578,11 @@
"Incorporating your message…": "正在整合您的消息……",
"Increasing": "增加",
"independent": "独立研究员",
+ "Index health": "索引健康状况",
+ "Index metrics": "索引指标",
+ "Index name": "索引名称",
+ "Index size": "索引大小",
+ "Index status": "索引状态",
"Indexed files": "索引文件",
"Indexing": "索引",
"Indexing manager start": "索引管理器启动",
diff --git a/opencti-platform/opencti-front/src/private/components/nav/useNavMenu.tsx b/opencti-platform/opencti-front/src/private/components/nav/useNavMenu.tsx
index 1efa8edd23a1..5aa3862dba2d 100644
--- a/opencti-platform/opencti-front/src/private/components/nav/useNavMenu.tsx
+++ b/opencti-platform/opencti-front/src/private/components/nav/useNavMenu.tsx
@@ -392,6 +392,7 @@ const useNavMenu = (): NavGroup[] => {
{ granted: isGrantedToTaxonomies, link: '/dashboard/settings/vocabularies', label: t_i18n('Taxonomies') },
{ granted: isGrantedToAudit, link: '/dashboard/settings/activity', label: t_i18n('Activity') },
{ granted: isGrantedToFileIndexing, link: '/dashboard/settings/file_indexing', label: t_i18n('File indexing') },
+ { granted: isGrantedToManage, link: '/dashboard/settings/indexmetrics', label: t_i18n('Index metrics') },
{ granted: isGrantedToExperience, link: '/dashboard/settings/experience', label: t_i18n('Filigran Experience') },
],
},
diff --git a/opencti-platform/opencti-front/src/private/components/settings/Root.tsx b/opencti-platform/opencti-front/src/private/components/settings/Root.tsx
index 8478a9cd8bbe..e7a38fabbf74 100644
--- a/opencti-platform/opencti-front/src/private/components/settings/Root.tsx
+++ b/opencti-platform/opencti-front/src/private/components/settings/Root.tsx
@@ -30,6 +30,7 @@ const RootAccesses = lazy(() => import('./accesses/Root'));
const RootActivity = lazy(() => import('./activity/Root'));
const RootCustomization = lazy(() => import('./customization/Root'));
const RootVocabularies = lazy(() => import('./vocabularies/Root'));
+const IndexMetrics = lazy(() => import('./index_metrics/IndexMetrics'));
const ExperienceUnauthorizedRedirect = ({ fallbackUrl }: { fallbackUrl: string }) => {
const location = useLocation();
@@ -123,6 +124,17 @@ const Root = () => {
)}
/>
+