feat(elasticsearch): add index grouping pattern support
This commit is contained in:
1 parent
cd78c0ae15
commit
901f5ca3d4
11 files changed
+252
-11
No files matched your search
@@ -105,7 +105,7 @@ import { oceanbaseModeConnectionPatch, oceanbaseSubModeFromConfig } from "@/lib/
|
||||
import { translateBackendError } from "@/i18n/backend-errors";
|
||||
import { applyHiveKerberosSubmitConfig, hiveKerberosFormConfig, type HiveKerberosAuthMode } from "@/lib/database/hiveKerberosOptions";
|
||||
import { hasCloudflareD1Credentials, isCloudflareD1Connection, normalizeCloudflareD1Connection } from "@/lib/connection/cloudflareD1";
|
||||
import { buildElasticsearchExternalConfig, elasticsearchConnectionModeFromConfig, elasticsearchConnectivityCheckPathFromConfig, elasticsearchKibanaBasePathFromConfig, type ElasticsearchConnectionMode } from "@/lib/connection/elasticsearchKibanaProxy";
|
||||
import { buildElasticsearchExternalConfig, elasticsearchConnectionModeFromConfig, elasticsearchConnectivityCheckPathFromConfig, elasticsearchIndexGroupingPatternFromConfig, elasticsearchKibanaBasePathFromConfig, type ElasticsearchConnectionMode } from "@/lib/connection/elasticsearchKibanaProxy";
|
||||
import { GAUSSDB_M_JDBC_DRIVER_CLASS, gaussdbConnectionMode, gaussdbIdentifierQuoteStyle, setGaussdbConnectionMode, setGaussdbIdentifierQuoteStyle, supportsGaussdbIdentifierQuoteStyle, type GaussdbConnectionMode, type GaussdbIdentifierQuoteStyle } from "@/lib/database/jdbcDialect";
|
||||
import { normalizeStoredConnectionDatabase } from "@/lib/database/sqliteNamespace";
|
||||
import {
|
||||
@@ -318,6 +318,7 @@ const defaultForm = (): ConnectionForm => ({
|
||||
const elasticsearchConnectionMode = ref<ElasticsearchConnectionMode>("direct");
|
||||
const elasticsearchKibanaBasePath = ref("");
|
||||
const elasticsearchConnectivityCheckPath = ref("");
|
||||
const elasticsearchIndexGroupingPattern = ref("");
|
||||
const elasticsearchConnectionPorts = ref<Record<ElasticsearchConnectionMode, number>>({
|
||||
direct: 9200,
|
||||
kibana: 5601,
|
||||
@@ -328,6 +329,7 @@ function resetElasticsearchProxyFields(externalConfig?: unknown) {
|
||||
elasticsearchConnectionMode.value = mode;
|
||||
elasticsearchKibanaBasePath.value = elasticsearchKibanaBasePathFromConfig(externalConfig);
|
||||
elasticsearchConnectivityCheckPath.value = elasticsearchConnectivityCheckPathFromConfig(externalConfig);
|
||||
elasticsearchIndexGroupingPattern.value = elasticsearchIndexGroupingPatternFromConfig(externalConfig);
|
||||
elasticsearchConnectionPorts.value = {
|
||||
direct: mode === "direct" ? form.value.port : 9200,
|
||||
kibana: mode === "kibana" ? form.value.port : 5601,
|
||||
@@ -3821,7 +3823,7 @@ function connectionConfigForSubmit(id: string, generatedName = ""): ConnectionCo
|
||||
config.database = "metrics";
|
||||
config.username = config.username.trim();
|
||||
} else if (config.db_type === "elasticsearch") {
|
||||
config.external_config = buildElasticsearchExternalConfig(elasticsearchConnectionMode.value, elasticsearchKibanaBasePath.value, elasticsearchConnectivityCheckPath.value);
|
||||
config.external_config = buildElasticsearchExternalConfig(elasticsearchConnectionMode.value, elasticsearchKibanaBasePath.value, elasticsearchConnectivityCheckPath.value, elasticsearchIndexGroupingPattern.value);
|
||||
} else if (config.db_type === "sqlserver") {
|
||||
config.external_config = sqlServerPortExplicitFromConfig(config) ? { portExplicit: true } : undefined;
|
||||
} else if (supportsGaussdbIdentifierQuoteStyle(config)) {
|
||||
@@ -6855,6 +6857,14 @@ function openExternalUrl(url: string) {
|
||||
<Input v-model="elasticsearchConnectivityCheckPath" class="col-span-3" :placeholder="t('connection.elasticsearchConnectivityCheckPathPlaceholder')" @input="resetTestState" />
|
||||
</div>
|
||||
|
||||
<div v-if="form.db_type === 'elasticsearch'" class="grid grid-cols-4 items-center gap-4">
|
||||
<Label :class="connectionLabelSmallClass">{{ t("connection.elasticsearchIndexGroupingPattern") }}</Label>
|
||||
<div class="col-span-3 space-y-1">
|
||||
<Input v-model="elasticsearchIndexGroupingPattern" :placeholder="t('connection.elasticsearchIndexGroupingPatternPlaceholder')" @input="resetTestState" />
|
||||
<p class="text-xs text-muted-foreground">{{ t("connection.elasticsearchIndexGroupingPatternHint") }}</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div v-if="form.driver_profile === 'gbase8s'" class="grid grid-cols-4 items-center gap-4">
|
||||
<Label :class="connectionLabelSmallClass">{{ t("connection.gbaseServer") }}</Label>
|
||||
<div class="col-span-3 space-y-1">
|
||||
|
||||
@@ -417,6 +417,9 @@ export default {
|
||||
elasticsearchKibanaBasePath: "Base Path",
|
||||
elasticsearchConnectivityCheckPath: "Connectivity Path",
|
||||
elasticsearchConnectivityCheckPathPlaceholder: "/ or /my-index/_search",
|
||||
elasticsearchIndexGroupingPattern: "Index grouping regex",
|
||||
elasticsearchIndexGroupingPatternPlaceholder: "off by default; enter a regex to enable",
|
||||
elasticsearchIndexGroupingPatternHint: "Off by default (naming schemes vary). Enter a regular expression to enable: matched rolling or time-series indices are aggregated into one queryable wildcard pattern, hiding per-day detail.",
|
||||
version: "Version",
|
||||
victoriametricsApiPath: "API Path",
|
||||
victoriametricsApiPathHint: "Use /prometheus for single-node deployments, or /select/tenantID/prometheus for clusters.",
|
||||
|
||||
@@ -921,6 +921,9 @@ export default withEnglishFallback({
|
||||
elasticsearchKibanaBasePath: "ruta base",
|
||||
elasticsearchConnectivityCheckPath: "Ruta de conectividad",
|
||||
elasticsearchConnectivityCheckPathPlaceholder: "/ o /my-index/_search",
|
||||
elasticsearchIndexGroupingPattern: "Index grouping regex",
|
||||
elasticsearchIndexGroupingPatternPlaceholder: "off by default; enter a regex to enable",
|
||||
elasticsearchIndexGroupingPatternHint: "Off by default (naming schemes vary). Enter a regular expression to enable: matched rolling or time-series indices are aggregated into one queryable wildcard pattern, hiding per-day detail.",
|
||||
mqSystemRocketMq: "Apache RocketMQ",
|
||||
rocketmqNamesrvAddr: "Dirección de NameServer",
|
||||
rocketmqNamesrvAddrPlaceholder: "127.0.0.1:9876",
|
||||
|
||||
@@ -919,6 +919,9 @@ export default withEnglishFallback({
|
||||
elasticsearchKibanaBasePath: "Percorso base",
|
||||
elasticsearchConnectivityCheckPath: "Percorso di connettività",
|
||||
elasticsearchConnectivityCheckPathPlaceholder: "/ o /my-index/_search",
|
||||
elasticsearchIndexGroupingPattern: "Index grouping regex",
|
||||
elasticsearchIndexGroupingPatternPlaceholder: "off by default; enter a regex to enable",
|
||||
elasticsearchIndexGroupingPatternHint: "Off by default (naming schemes vary). Enter a regular expression to enable: matched rolling or time-series indices are aggregated into one queryable wildcard pattern, hiding per-day detail.",
|
||||
mqSystemRocketMq: "Apache RocketMQ",
|
||||
rocketmqNamesrvAddr: "Indirizzo NameServer",
|
||||
rocketmqNamesrvAddrPlaceholder: "127.0.0.1:9876",
|
||||
|
||||
@@ -919,6 +919,9 @@ export default withEnglishFallback({
|
||||
elasticsearchKibanaBasePath: "ベースパス",
|
||||
elasticsearchConnectivityCheckPath: "接続確認パス",
|
||||
elasticsearchConnectivityCheckPathPlaceholder: "/ または /my-index/_search",
|
||||
elasticsearchIndexGroupingPattern: "Index grouping regex",
|
||||
elasticsearchIndexGroupingPatternPlaceholder: "off by default; enter a regex to enable",
|
||||
elasticsearchIndexGroupingPatternHint: "Off by default (naming schemes vary). Enter a regular expression to enable: matched rolling or time-series indices are aggregated into one queryable wildcard pattern, hiding per-day detail.",
|
||||
mqSystemRocketMq: "Apache RocketMQ",
|
||||
rocketmqNamesrvAddr: "NameServer アドレス",
|
||||
rocketmqNamesrvAddrPlaceholder: "127.0.0.1:9876",
|
||||
|
||||
@@ -411,6 +411,9 @@ export default withEnglishFallback({
|
||||
elasticsearchKibanaBasePath: "기본 경로",
|
||||
elasticsearchConnectivityCheckPath: "연결 확인 경로",
|
||||
elasticsearchConnectivityCheckPathPlaceholder: "/ 또는 /my-index/_search",
|
||||
elasticsearchIndexGroupingPattern: "Index grouping regex",
|
||||
elasticsearchIndexGroupingPatternPlaceholder: "off by default; enter a regex to enable",
|
||||
elasticsearchIndexGroupingPatternHint: "Off by default (naming schemes vary). Enter a regular expression to enable: matched rolling or time-series indices are aggregated into one queryable wildcard pattern, hiding per-day detail.",
|
||||
version: "버전",
|
||||
victoriametricsApiPath: "API 경로",
|
||||
victoriametricsApiPathHint: "단일 노드 배포에는 /prometheus를, 클러스터에는 /select/tenantID/prometheus를 사용하세요.",
|
||||
|
||||
@@ -920,6 +920,9 @@ export default withEnglishFallback({
|
||||
elasticsearchKibanaBasePath: "Caminho Base",
|
||||
elasticsearchConnectivityCheckPath: "Caminho de conectividade",
|
||||
elasticsearchConnectivityCheckPathPlaceholder: "/ ou /my-index/_search",
|
||||
elasticsearchIndexGroupingPattern: "Index grouping regex",
|
||||
elasticsearchIndexGroupingPatternPlaceholder: "off by default; enter a regex to enable",
|
||||
elasticsearchIndexGroupingPatternHint: "Off by default (naming schemes vary). Enter a regular expression to enable: matched rolling or time-series indices are aggregated into one queryable wildcard pattern, hiding per-day detail.",
|
||||
mqSystemRocketMq: "Apache RocketMQ",
|
||||
rocketmqNamesrvAddr: "Endereço do NameServer",
|
||||
rocketmqNamesrvAddrPlaceholder: "127.0.0.1:9876",
|
||||
|
||||
@@ -343,6 +343,9 @@ export default withEnglishFallback({
|
||||
elasticsearchKibanaBasePath: "基础路径",
|
||||
elasticsearchConnectivityCheckPath: "连通性检查路径",
|
||||
elasticsearchConnectivityCheckPathPlaceholder: "/ 或 /my-index/_search",
|
||||
elasticsearchIndexGroupingPattern: "索引聚合正则",
|
||||
elasticsearchIndexGroupingPatternPlaceholder: "默认关闭,填正则表达式开启",
|
||||
elasticsearchIndexGroupingPatternHint: "默认关闭(命名格式因环境而异)。填入正则表达式即可开启:将匹配到的滚动或时间序列索引聚合成一个可查询的通配 pattern,隐藏每日明细。",
|
||||
version: "版本",
|
||||
victoriametricsApiPath: "API 路径",
|
||||
victoriametricsApiPathHint: "单机版通常为 /prometheus;集群版可填写 /select/租户ID/prometheus。",
|
||||
|
||||
@@ -919,6 +919,9 @@ export default withEnglishFallback({
|
||||
elasticsearchKibanaBasePath: "基礎路徑",
|
||||
elasticsearchConnectivityCheckPath: "連通性檢查路徑",
|
||||
elasticsearchConnectivityCheckPathPlaceholder: "/ 或 /my-index/_search",
|
||||
elasticsearchIndexGroupingPattern: "索引聚合正則",
|
||||
elasticsearchIndexGroupingPatternPlaceholder: "預設關閉,填正則表達式開啟",
|
||||
elasticsearchIndexGroupingPatternHint: "預設關閉(命名格式因環境而異)。填入正則表達式即可開啟:將比對到的滾動或時間序列索引聚合成一個可查詢的通配 pattern,隱藏每日明細。",
|
||||
mqSystemRocketMq: "Apache RocketMQ",
|
||||
rocketmqNamesrvAddr: "NameServer 地址",
|
||||
rocketmqNamesrvAddrPlaceholder: "127.0.0.1:9876",
|
||||
|
||||
@@ -5,6 +5,8 @@ export interface ElasticsearchExternalConfig {
|
||||
kibanaBasePath?: string;
|
||||
/** GET path for connect/test/health. Empty means GET /. */
|
||||
connectivityCheckPath?: string;
|
||||
/** Regex collapsing rolling/time-series index suffixes into a `*` pattern. Empty → default; "off" → no grouping. */
|
||||
indexGroupingPattern?: string;
|
||||
}
|
||||
|
||||
function externalConfigRecord(value: unknown): Record<string, unknown> {
|
||||
@@ -44,14 +46,26 @@ export function elasticsearchConnectivityCheckPathFromConfig(value: unknown): st
|
||||
return typeof path === "string" ? normalizeElasticsearchConnectivityCheckPath(path) : "";
|
||||
}
|
||||
|
||||
export function buildElasticsearchExternalConfig(mode: ElasticsearchConnectionMode, kibanaBasePath: string, connectivityCheckPath = ""): ElasticsearchExternalConfig | undefined {
|
||||
export function elasticsearchIndexGroupingPatternFromConfig(value: unknown): string {
|
||||
const config = externalConfigRecord(value);
|
||||
const pattern = config.indexGroupingPattern;
|
||||
return typeof pattern === "string" ? pattern.trim() : "";
|
||||
}
|
||||
|
||||
export function buildElasticsearchExternalConfig(mode: ElasticsearchConnectionMode, kibanaBasePath: string, connectivityCheckPath = "", indexGroupingPattern = ""): ElasticsearchExternalConfig | undefined {
|
||||
const checkPath = normalizeElasticsearchConnectivityCheckPath(connectivityCheckPath);
|
||||
const grouping = indexGroupingPattern.trim();
|
||||
if (mode !== "kibana") {
|
||||
return checkPath ? { connectivityCheckPath: checkPath } : undefined;
|
||||
if (!checkPath && !grouping) return undefined;
|
||||
const config: ElasticsearchExternalConfig = {};
|
||||
if (checkPath) config.connectivityCheckPath = checkPath;
|
||||
if (grouping) config.indexGroupingPattern = grouping;
|
||||
return config;
|
||||
}
|
||||
const normalizedPath = normalizeKibanaBasePath(kibanaBasePath);
|
||||
const config: ElasticsearchExternalConfig = { mode: "kibana" };
|
||||
if (normalizedPath) config.kibanaBasePath = normalizedPath;
|
||||
if (checkPath) config.connectivityCheckPath = checkPath;
|
||||
if (grouping) config.indexGroupingPattern = grouping;
|
||||
return config;
|
||||
}
|
||||
Reference in new issue
Block a user