Skip to main content

GMS lite

Run the production war.war locally without Docker, Kafka, or a database server. Requires Python 3.10+, a POSIX system (Linux or macOS), and JDK 25. Python uses only the standard library. The first Gradle build downloads JVM dependencies.

export JAVA_HOME=~/.local/share/mise/installs/java/25.0.2
python3 metadata-service/gms-lite/bin/gms-lite-stack.py

The launcher builds the GMS and upgrade jars plus the embedded OpenSearch installDist, gets or starts the shared OpenSearch node, then runs datahub-upgrade.jar -u SystemUpdate and -u RestoreIndices for each new instance. Upgrade processes run serially to limit memory use. GMS processes start after bootstrap finishes. Readiness requires HTTP health and, when authentication is enabled, the bootstrap user's policies.

Use --skip-build after building those artifacts. --heap 1g sets each GMS/upgrade heap cap. One OpenSearch JVM, with a 4 GB default heap, serves all local stacks. Set EMBEDDED_OPENSEARCH_HEAP when building its distribution to change that cap, then stop and start the shared node to apply it:

EMBEDDED_OPENSEARCH_HEAP=6g ./gradlew :metadata-service:opensearch-embedded:installDist
python3 metadata-service/gms-lite/bin/_opensearch_manager.py stop
python3 metadata-service/gms-lite/bin/_opensearch_manager.py start

The shared node keeps its data, logs, port, pid, and startup.lock under ~/.datahub/local/opensearch-3/. This versioned directory separates major versions because OpenSearch data directories are not portable across major versions. Override it with --shared-opensearch-dir /path/to/state on the launcher or GMS_LITE_OPENSEARCH_DIR for both entry points. Manager commands accept --dir /path/to/state. Always use the same directory to manage a node.

The manager serializes start/stop with an exclusive file lock, verifies process identity before signalling, and reuses only a healthy OpenSearch 3.x node. A dead node or a verified node whose connection is refused is replaced while retaining its data; a different major version or an unrelated PID is refused. For a live node, readiness waits up to 600 seconds for yellow health. Override this with GMS_LITE_OPENSEARCH_HEALTH_TIMEOUT_SECONDS. An unresponsive or slow node that reaches the deadline causes a clear error and is left running, with its recorded PID and port unchanged. This also applies to a newly started node: once it reports READY, its port is recorded before waiting for yellow. Retry start to reuse it and wait again. A child that exits, fails to report READY within 900 seconds, or reports the wrong major version is stopped and its PID/port files are removed. Interrupting startup also cleans up the new child; an already running node being reused is left alone. Data is always retained; choose a different state directory or repair the data explicitly if it cannot recover. status snapshots PID/port under the lock, then probes outside it with one-second HTTP timeouts and no readiness wait. It returns JSON with healthy: false and a short reason for a red, paused, unreachable, or incompatible node. There is no automatic deletion of other stacks' indices.

Both HTTP and transport ports are ephemeral. Use --private-opensearch for a node owned by this stack, with data under <data-dir>/opensearch/, that stops with the launcher. Supplying --opensearch-port N also selects private mode (0 means ephemeral); occupied ports are refused. Private mode is useful for CI and self-contained runs.

python3 metadata-service/gms-lite/bin/gms-lite-stack.py \
--skip-build --data-dir /tmp/my-gms --port-base 18090 --processes 2

--processes defaults to 1. Instances are named gms-0, gms-1, etc. Each has its own H2 file, queue spool, object-storage directory, HTTP port, and index prefix. Prefixes include a hash of the absolute data-directory path and the instance name, avoiding collisions between identically named directories. Instances share one OpenSearch node but never an index. By default the shared node runs in its own session and outlives every launcher that uses it; stopping one stack leaves other stacks running. The launcher prints the command to stop the shared node:

python3 metadata-service/gms-lite/bin/_opensearch_manager.py status
python3 metadata-service/gms-lite/bin/_opensearch_manager.py stop

Stopping the shared node interrupts search for every stack using it. Stop stacks first. The manager sends SIGTERM, waits for shutdown, and uses SIGKILL only if necessary. start can also prewarm the node without starting GMS.

An optional --env-file /path/to/overrides.env accepts literal KEY=VALUE lines, optional export prefixes, quoted values, and whole-line comments. There is no default env file. The launcher inherits the shell environment, applies this file, and then pins its local connection settings. Search URI, credentials, TLS, proxy, routing, and per-cluster prefix overrides are neutralised for both GMS and upgrades so the embedded node and instance prefix always win. The full variable-to-YAML mapping appears in the environment contract below. The generated gms-N/env.sh records settings that differ from the inherited environment, using shell-safe quoting. It is an output file and is never read back automatically.

Discovery and authentication​

Once ready, <data-dir>/stack.json is published atomically, with mode 0600:

{
"bootId": "unique-random-id-for-this-start",
"opensearchPort": 54321,
"opensearchShared": true,
"default": "gms-0",
"instances": {
"gms-0": "http://localhost:18090",
"gms-1": "http://localhost:18091"
},
"indexPrefixes": {
"gms-0": "gmslite0123456789abgms0",
"gms-1": "gmslite0123456789abgms1"
},
"auth": true,
"adminTokens": {
"gms-0": "<personal-access-token>",
"gms-1": "<personal-access-token>"
},
"adminTokenExpiresAt": {
"gms-0": "2026-01-02T12:00:00Z",
"gms-1": "2026-01-02T12:00:01Z"
}
}

opensearchShared says whether stopping this launcher leaves the node running. default is a key in instances. indexPrefixes contains the configured INDEX_PREFIX values; GMS appends an underscore before index names. bootId changes on every start. adminTokens contains a one-day personal token for the existing bootstrap user datahub in each instance. adminTokenExpiresAt maps the same instance names to the server-issued token expiry in ISO-8601 UTC. After expiry, authenticated requests return 401 even if /health still succeeds. Restart the stack with the same data directory to mint new tokens, then reread stack.json; tokens are not refreshed while the launcher runs. The launcher uses OSS's shipped bootstrap policies without adding or replacing any policy. No frontend or password login is started.

Pass the instance token as Authorization: Bearer <token>, or use it with the DataHub CLI as DATAHUB_GMS_TOKEN alongside DATAHUB_GMS_URL. /health and /config are public. For example:

curl -fsS http://localhost:18090/health
curl -fsS http://localhost:18090/config

--no-auth disables token authentication and publishes auth: false with empty adminTokens and adminTokenExpiresAt objects. GMS binds to loopback. The system credentials and token keys are randomly generated, saved in <data-dir>/.secrets.json with mode 0600, and reused on restart. Neither credentials nor tokens are printed to stdout.

Persistence and recovery​

Stop with Ctrl-C or SIGTERM to the launcher PID. It stops GMS and active upgrade processes, waits for JVM shutdown, and kills remaining children in their owned process groups if they do not exit. Shared OpenSearch stays up. In private mode, GMS stops before the owned OpenSearch node. The spool is saved during orderly JVM shutdown; SIGKILL or power loss can lose queued events. This is a local development stack.

Restart with the same absolute data-directory path. H2, search indices, credentials, and queue snapshots persist. A gms-N/system-update-done marker is written only after both upgrade commands succeed; it records the instance's non-usage-event index names observed at that point. Existing H2 tables are never recreated on a retry. Upgrades are skipped only when H2 exists, this marker contains a nonempty recorded index set, and every recorded index still exists. If any recorded index is missing, both upgrades run again to restore search from H2. The usage-event index is ensured separately on every start. Older text markers trigger one upgrade run to record the set. Remove the marker to rerun upgrades after changing bootstrap code.

An exclusive lock prevents concurrent launchers from using the same data directory, including with --fresh. Old stack.json files are removed under that lock before startup; the discovery file is removed again on exit. --fresh clears only a directory previously marked as belonging to this launcher (or an empty directory). With shared OpenSearch it also deletes the exact index prefixes of this stack's current and previously persisted instances, followed by _, including matching aliases, data streams, and templates. Names are enumerated before deletion; no wildcard DELETE is sent. Other prefixes are preserved. Without --fresh, the same prefixes and data are reused. Do not move an active data directory or remove its sibling .gms-lite.lock file. The launcher never removes H2/OpenSearch lock files or reclaims other processes' ports. Startup errors retain data and logs for diagnosis.

Usage-event indices use the mappings from the upgrade jar's source template, without ISM lifecycle settings. Automatic usage-event rollover and retention are unavailable on this minimal node. The embedded distribution includes the matching custom-codecs plugin because GMS selects zstd_no_dict for ordinary indices. Semantic search remains disabled by default; the launcher does not request k-NN.

Verification​

./gradlew :metadata-service:gms-lite:check
./gradlew :metadata-ingestion:lintFix
./gradlew :metadata-service:gms-lite:stressTest
# New results directory (previous results are otherwise resumed):
./gradlew :metadata-service:gms-lite:stressTest -PstressDataDir=/tmp/gms-lite-check
# Select cases:
./gradlew :metadata-service:gms-lite:stressTest -PstressTests="persistence parallel stale"
# Or build and verify with a fresh temporary results directory:
metadata-service/gms-lite/bin/verify-stack.sh

launcherSafetyTest runs fast, offline safety tests and is part of check. The module's lint and lintFix Gradle tasks use the repository's pinned Python tool and ruff.toml; check includes lint. A repository pre-commit hook runs the module's lintFix task for Python/config changes.

The opt-in stress suite checks authenticated ingest/read/search, H2 and spool restart persistence, same-PID warm starts, parallel instance isolation, concurrent cold launches of two separate stacks, replacement of dead nodes, timeout without replacement of a paused live node, private-node shutdown, prefix-scoped --fresh, restoration after total or single-core-index loss, SIGTERM during upgrades, closed owned ports, stale discovery recovery, and explicit manager shutdown. It always uses a temporary shared state directory and stops that node in teardown, including after failures. Each case's verdict is appended and flushed immediately to build/stress/results.jsonl. Re-running skips already recorded cases, including failures; use a new --data-dir or remove that results file to rerun them. Results and service logs are retained on failure. Use a port base with two free consecutive ports (default 18090).

tail -f metadata-service/gms-lite/build/stress/results.jsonl
python3 metadata-service/gms-lite/tests/summarize.py \
metadata-service/gms-lite/build/stress/results.jsonl

Environment contract​

All settings below are read by metadata-service/configuration/src/main/resources/application.yaml, except the explicit Java/Spring bindings noted in the final column. Both GMS and upgrades receive this environment; an option applying to only one application is inert in the other. Unlisted inherited or user-supplied settings keep their normal OSS meaning.

VariableLauncher valueReader
EBEAN_DATASOURCE_URLjdbc:h2:file:<data-dir>/<instance>/gms;MODE=MySQLebean.url
EBEAN_DATASOURCE_DRIVERorg.h2.Driverebean.driver
EBEAN_DATASOURCE_USERNAMEsaebean.username
EBEAN_DATASOURCE_PASSWORDemptyebean.password
EBEAN_AUTOCREATEtrue only for SystemUpdate on a missing H2 database; otherwise falseebean.autoCreateDdl
DATAHUB_SQL_SETUP_ENABLEDfalseSqlSetupCondition Java
DATAHUB_MESSAGING_TRANSPORTpgqueuedatahub.messaging.transport
DATAHUB_PGQUEUE_ENABLEDtruepostgres.pgQueue.enabled
DATAHUB_PGQUEUE_STOREinmemorypostgres.pgQueue.store
DATAHUB_PGQUEUE_INMEMORY_SPOOL_FILE<data-dir>/<instance>/queue-spool.jsonpostgres.pgQueue.inmemorySpoolFile
SCHEMA_REGISTRY_TYPEINTERNALkafka.schemaRegistry.type
KAFKA_SCHEMAREGISTRY_URLhttp://localhost:<gms-port>/schema-registry/apikafka.schemaRegistry.url
MAE_CONSUMER_ENABLEDtruemaeConsumer.enabled
MCE_CONSUMER_ENABLEDtrueMetadataChangeProposalProcessorCondition and related Java conditions
PE_CONSUMER_ENABLEDtruePlatformEventProcessorCondition Java
DATAHUB_OBJECT_STORAGE_URIinstance-local file: URIdatahub.objectStorage.uri
ELASTICSEARCH_HOSTlocalhostelasticsearch.host
ELASTICSEARCH_PORTembedded HTTP portelasticsearch.port
ELASTICSEARCH_SHIM_ENGINE_TYPEOPENSEARCH_3elasticsearch.clusters.primary.shim.engineType
ELASTICSEARCH_SHIM_AUTO_DETECTfalseelasticsearch.clusters.primary.shim.autoDetectEngine
ELASTICSEARCH_INDEX_DOC_IDS_SCHEMA_FIELD_HASH_ID_ENABLEDtrueelasticsearch.entityIndex.v2.docIds.schemaField.hashIdEnabled
INDEX_PREFIXpath hash + instance nameelasticsearch.index.prefix
GRAPH_SERVICE_IMPLelasticsearchgraphService.type
ELASTICSEARCH_NUM_SHARDS_PER_INDEX1elasticsearch.clusters.primary.index.numShards
ELASTICSEARCH_NUM_REPLICAS_PER_INDEX0elasticsearch.clusters.primary.index.numReplicas
SKIP_CREATE_USAGE_EVENT_INDICES_STEPtrueCreateUsageEventIndicesStep Java
BOOTSTRAP_SYSTEM_UPDATE_WAIT_FOR_SYSTEM_UPDATEfalsebootstrap.waitForSystemUpdate
METADATA_SERVICE_AUTH_ENABLEDtrue; false with --no-authauthentication.enabled
POLICY_CACHE_REFRESH_INTERVAL_SECONDS10authorization.defaultAuthorizer.cacheRefreshIntervalSecs
DATAHUB_SYSTEM_CLIENT_ID__datahub_systemauthentication.systemClientId
DATAHUB_SYSTEM_CLIENT_SECRETrandom, persistedauthentication.systemClientSecret
DATAHUB_TOKEN_SERVICE_SIGNING_KEYrandom, persistedauthentication.tokenService.signingKey
DATAHUB_TOKEN_SERVICE_SALTrandom, persistedauthentication.tokenService.salt
ENTITY_REGISTRY_CONFIG_PATHOSS entity-registry YAMLentityRegistry.path
DATAHUB_GMS_HOSTlocalhostdatahub.gms.host
DATAHUB_GMS_PORTinstance HTTP portdatahub.gms.port
SERVER_PORTinstance HTTP portSpring Boot server.port
SERVER_ADDRESS127.0.0.1Spring Boot server.address
SPRING_PROFILES_ACTIVEexisting profiles plus upgrade, upgrade JVMs onlySpring Boot profile binding

Neutralised search overrides​

These values override both the shell and --env-file. Each YAML property is protected by clearing or pinning both its placeholder names and its canonical environment name. Names are generated from the paths below using Spring Boot's environment mapping: replace dots with underscores, remove dashes, uppercase, and surround list indices with underscores. Camel-case words stay joined (e.g. pathPrefix becomes PATHPREFIX). same means the canonical name is already a listed placeholder.

Empty URI values let ElasticSearchConfiguration.normalizeClusters() synthesize the primary URI from the pinned host/port and leave the secondary unconfigured. elasticsearch.host and .port already map to ELASTICSEARCH_HOST and ELASTICSEARCH_PORT, pinned to localhost and the embedded port. Neither the YAML nor SearchClusterSettings defines clusters.primary.host or .port; nested host/port names cannot override the connection. Boolean switches use false; proxy schemes use http.

YAML keyPlaceholder name(s)Canonical env nameValue
elasticsearch.pathPrefixELASTICSEARCH_PATH_PREFIXELASTICSEARCH_PATHPREFIXempty
elasticsearch.useSSLELASTICSEARCH_USE_SSLELASTICSEARCH_USESSLfalse
postgres.pgCron.iam.awsRegionAWS_REGIONPOSTGRES_PGCRON_IAM_AWSREGIONempty
elasticsearch.clusters.primary.uriELASTICSEARCH_URIELASTICSEARCH_CLUSTERS_PRIMARY_URIempty
elasticsearch.clusters.primary.usernameELASTICSEARCH_USERNAMEELASTICSEARCH_CLUSTERS_PRIMARY_USERNAMEempty
elasticsearch.clusters.primary.passwordELASTICSEARCH_PASSWORDELASTICSEARCH_CLUSTERS_PRIMARY_PASSWORDempty
elasticsearch.clusters.primary.regionAWS_REGIONELASTICSEARCH_CLUSTERS_PRIMARY_REGIONempty
elasticsearch.clusters.primary.opensearchUseAwsIamAuthOPENSEARCH_USE_AWS_IAM_AUTHELASTICSEARCH_CLUSTERS_PRIMARY_OPENSEARCHUSEAWSIAMAUTHfalse
elasticsearch.clusters.secondary.uriELASTICSEARCH_CLUSTERS_SECONDARY_URIsameempty
elasticsearch.clusters.secondary.usernameELASTICSEARCH_CLUSTERS_SECONDARY_USERNAMEsameempty
elasticsearch.clusters.secondary.passwordELASTICSEARCH_CLUSTERS_SECONDARY_PASSWORDsameempty
elasticsearch.clusters.secondary.regionELASTICSEARCH_CLUSTERS_SECONDARY_REGIONsameempty
elasticsearch.clusters.secondary.opensearchUseAwsIamAuthELASTICSEARCH_CLUSTERS_SECONDARY_OPENSEARCH_USE_AWS_IAM_AUTHELASTICSEARCH_CLUSTERS_SECONDARY_OPENSEARCHUSEAWSIAMAUTHfalse
elasticsearch.clusters.primary.sslContext.protocolELASTICSEARCH_SSL_PROTOCOLELASTICSEARCH_CLUSTERS_PRIMARY_SSLCONTEXT_PROTOCOLempty
elasticsearch.clusters.primary.sslContext.secureRandomImplementationELASTICSEARCH_SSL_SECURE_RANDOM_IMPLELASTICSEARCH_CLUSTERS_PRIMARY_SSLCONTEXT_SECURERANDOMIMPLEMENTATIONempty
elasticsearch.clusters.primary.sslContext.trustStoreFileELASTICSEARCH_SSL_TRUSTSTORE_FILEELASTICSEARCH_CLUSTERS_PRIMARY_SSLCONTEXT_TRUSTSTOREFILEempty
elasticsearch.clusters.primary.sslContext.trustStoreTypeELASTICSEARCH_SSL_TRUSTSTORE_TYPEELASTICSEARCH_CLUSTERS_PRIMARY_SSLCONTEXT_TRUSTSTORETYPEempty
elasticsearch.clusters.primary.sslContext.trustStorePasswordELASTICSEARCH_SSL_TRUSTSTORE_PASSWORDELASTICSEARCH_CLUSTERS_PRIMARY_SSLCONTEXT_TRUSTSTOREPASSWORDempty
elasticsearch.clusters.primary.sslContext.keyStoreFileELASTICSEARCH_SSL_KEYSTORE_FILEELASTICSEARCH_CLUSTERS_PRIMARY_SSLCONTEXT_KEYSTOREFILEempty
elasticsearch.clusters.primary.sslContext.keyStoreTypeELASTICSEARCH_SSL_KEYSTORE_TYPEELASTICSEARCH_CLUSTERS_PRIMARY_SSLCONTEXT_KEYSTORETYPEempty
elasticsearch.clusters.primary.sslContext.keyStorePasswordELASTICSEARCH_SSL_KEYSTORE_PASSWORDELASTICSEARCH_CLUSTERS_PRIMARY_SSLCONTEXT_KEYSTOREPASSWORDempty
elasticsearch.clusters.primary.sslContext.keyPasswordELASTICSEARCH_SSL_KEY_PASSWORDELASTICSEARCH_CLUSTERS_PRIMARY_SSLCONTEXT_KEYPASSWORDempty
elasticsearch.clusters.secondary.sslContext.protocolELASTICSEARCH_CLUSTERS_SECONDARY_SSL_PROTOCOLELASTICSEARCH_CLUSTERS_SECONDARY_SSLCONTEXT_PROTOCOLempty
elasticsearch.clusters.secondary.sslContext.secureRandomImplementationELASTICSEARCH_CLUSTERS_SECONDARY_SSL_SECURE_RANDOM_IMPLELASTICSEARCH_CLUSTERS_SECONDARY_SSLCONTEXT_SECURERANDOMIMPLEMENTATIONempty
elasticsearch.clusters.secondary.sslContext.trustStoreFileELASTICSEARCH_CLUSTERS_SECONDARY_SSL_TRUSTSTORE_FILEELASTICSEARCH_CLUSTERS_SECONDARY_SSLCONTEXT_TRUSTSTOREFILEempty
elasticsearch.clusters.secondary.sslContext.trustStoreTypeELASTICSEARCH_CLUSTERS_SECONDARY_SSL_TRUSTSTORE_TYPEELASTICSEARCH_CLUSTERS_SECONDARY_SSLCONTEXT_TRUSTSTORETYPEempty
elasticsearch.clusters.secondary.sslContext.trustStorePasswordELASTICSEARCH_CLUSTERS_SECONDARY_SSL_TRUSTSTORE_PASSWORDELASTICSEARCH_CLUSTERS_SECONDARY_SSLCONTEXT_TRUSTSTOREPASSWORDempty
elasticsearch.clusters.secondary.sslContext.keyStoreFileELASTICSEARCH_CLUSTERS_SECONDARY_SSL_KEYSTORE_FILEELASTICSEARCH_CLUSTERS_SECONDARY_SSLCONTEXT_KEYSTOREFILEempty
elasticsearch.clusters.secondary.sslContext.keyStoreTypeELASTICSEARCH_CLUSTERS_SECONDARY_SSL_KEYSTORE_TYPEELASTICSEARCH_CLUSTERS_SECONDARY_SSLCONTEXT_KEYSTORETYPEempty
elasticsearch.clusters.secondary.sslContext.keyStorePasswordELASTICSEARCH_CLUSTERS_SECONDARY_SSL_KEYSTORE_PASSWORDELASTICSEARCH_CLUSTERS_SECONDARY_SSLCONTEXT_KEYSTOREPASSWORDempty
elasticsearch.clusters.secondary.sslContext.keyPasswordELASTICSEARCH_CLUSTERS_SECONDARY_SSL_KEY_PASSWORDELASTICSEARCH_CLUSTERS_SECONDARY_SSLCONTEXT_KEYPASSWORDempty
elasticsearch.clusters.primary.proxy.hostELASTICSEARCH_CLUSTERS_PRIMARY_PROXY_HOST, ELASTICSEARCH_PROXY_HOSTsameempty
elasticsearch.clusters.primary.proxy.portELASTICSEARCH_CLUSTERS_PRIMARY_PROXY_PORT, ELASTICSEARCH_PROXY_PORTsameempty
elasticsearch.clusters.primary.proxy.schemeELASTICSEARCH_CLUSTERS_PRIMARY_PROXY_SCHEME, ELASTICSEARCH_PROXY_SCHEMEsamehttp
elasticsearch.clusters.primary.proxy.usernameELASTICSEARCH_CLUSTERS_PRIMARY_PROXY_USERNAME, ELASTICSEARCH_PROXY_USERNAMEsameempty
elasticsearch.clusters.primary.proxy.passwordELASTICSEARCH_CLUSTERS_PRIMARY_PROXY_PASSWORD, ELASTICSEARCH_PROXY_PASSWORDsameempty
elasticsearch.clusters.secondary.proxy.hostELASTICSEARCH_CLUSTERS_SECONDARY_PROXY_HOSTsameempty
elasticsearch.clusters.secondary.proxy.portELASTICSEARCH_CLUSTERS_SECONDARY_PROXY_PORTsameempty
elasticsearch.clusters.secondary.proxy.schemeELASTICSEARCH_CLUSTERS_SECONDARY_PROXY_SCHEMEsamehttp
elasticsearch.clusters.secondary.proxy.usernameELASTICSEARCH_CLUSTERS_SECONDARY_PROXY_USERNAMEsameempty
elasticsearch.clusters.secondary.proxy.passwordELASTICSEARCH_CLUSTERS_SECONDARY_PROXY_PASSWORDsameempty
elasticsearch.clusters.primary.proxy.useSystemProxyPropertiesELASTICSEARCH_CLUSTERS_PRIMARY_PROXY_USE_SYSTEM_PROXY_PROPERTIESELASTICSEARCH_CLUSTERS_PRIMARY_PROXY_USESYSTEMPROXYPROPERTIESfalse
elasticsearch.clusters.primary.index.prefixELASTICSEARCH_CLUSTERS_PRIMARY_INDEX_PREFIXsameempty
elasticsearch.clusters.secondary.proxy.useSystemProxyPropertiesELASTICSEARCH_CLUSTERS_SECONDARY_PROXY_USE_SYSTEM_PROXY_PROPERTIESELASTICSEARCH_CLUSTERS_SECONDARY_PROXY_USESYSTEMPROXYPROPERTIESfalse
elasticsearch.clusters.secondary.index.prefixELASTICSEARCH_CLUSTERS_SECONDARY_INDEX_PREFIXsameempty
elasticsearch.componentCluster.searchV2ELASTICSEARCH_COMPONENT_CLUSTER_SEARCH_V2ELASTICSEARCH_COMPONENTCLUSTER_SEARCHV2primary
elasticsearch.componentCluster.searchV3ELASTICSEARCH_COMPONENT_CLUSTER_SEARCH_V3ELASTICSEARCH_COMPONENTCLUSTER_SEARCHV3primary
elasticsearch.componentCluster.semanticELASTICSEARCH_COMPONENT_CLUSTER_SEMANTICELASTICSEARCH_COMPONENTCLUSTER_SEMANTICprimary
elasticsearch.componentCluster.graphELASTICSEARCH_COMPONENT_CLUSTER_GRAPHELASTICSEARCH_COMPONENTCLUSTER_GRAPHprimary
elasticsearch.componentCluster.timeseriesELASTICSEARCH_COMPONENT_CLUSTER_TIMESERIESELASTICSEARCH_COMPONENTCLUSTER_TIMESERIESprimary
elasticsearch.componentCluster.systemMetadataELASTICSEARCH_COMPONENT_CLUSTER_SYSTEM_METADATAELASTICSEARCH_COMPONENTCLUSTER_SYSTEMMETADATAprimary
elasticsearch.componentCluster.usageELASTICSEARCH_COMPONENT_CLUSTER_USAGEELASTICSEARCH_COMPONENTCLUSTER_USAGEprimary
elasticsearch.clusterMigration.graph.targetClusterELASTICSEARCH_CLUSTER_MIGRATION_GRAPH_TARGET_CLUSTERELASTICSEARCH_CLUSTERMIGRATION_GRAPH_TARGETCLUSTERempty
elasticsearch.clusterMigration.graph.copy.remote.hostELASTICSEARCH_CLUSTER_MIGRATION_GRAPH_COPY_REMOTE_HOSTELASTICSEARCH_CLUSTERMIGRATION_GRAPH_COPY_REMOTE_HOSTempty
elasticsearch.clusterMigration.graph.copy.remote.usernameELASTICSEARCH_CLUSTER_MIGRATION_GRAPH_COPY_REMOTE_USERNAMEELASTICSEARCH_CLUSTERMIGRATION_GRAPH_COPY_REMOTE_USERNAMEempty
elasticsearch.clusterMigration.graph.copy.remote.passwordELASTICSEARCH_CLUSTER_MIGRATION_GRAPH_COPY_REMOTE_PASSWORDELASTICSEARCH_CLUSTERMIGRATION_GRAPH_COPY_REMOTE_PASSWORDempty
elasticsearch.clusterMigration.timeseries.targetClusterELASTICSEARCH_CLUSTER_MIGRATION_TIMESERIES_TARGET_CLUSTERELASTICSEARCH_CLUSTERMIGRATION_TIMESERIES_TARGETCLUSTERempty
elasticsearch.clusterMigration.timeseries.copy.remote.hostELASTICSEARCH_CLUSTER_MIGRATION_TIMESERIES_COPY_REMOTE_HOSTELASTICSEARCH_CLUSTERMIGRATION_TIMESERIES_COPY_REMOTE_HOSTempty
elasticsearch.clusterMigration.timeseries.copy.remote.usernameELASTICSEARCH_CLUSTER_MIGRATION_TIMESERIES_COPY_REMOTE_USERNAMEELASTICSEARCH_CLUSTERMIGRATION_TIMESERIES_COPY_REMOTE_USERNAMEempty
elasticsearch.clusterMigration.timeseries.copy.remote.passwordELASTICSEARCH_CLUSTER_MIGRATION_TIMESERIES_COPY_REMOTE_PASSWORDELASTICSEARCH_CLUSTERMIGRATION_TIMESERIES_COPY_REMOTE_PASSWORDempty
elasticsearch.clusterMigration.systemMetadata.targetClusterELASTICSEARCH_CLUSTER_MIGRATION_SYSTEM_METADATA_TARGET_CLUSTERELASTICSEARCH_CLUSTERMIGRATION_SYSTEMMETADATA_TARGETCLUSTERempty
elasticsearch.clusterMigration.systemMetadata.copy.remote.hostELASTICSEARCH_CLUSTER_MIGRATION_SYSTEM_METADATA_COPY_REMOTE_HOSTELASTICSEARCH_CLUSTERMIGRATION_SYSTEMMETADATA_COPY_REMOTE_HOSTempty
elasticsearch.clusterMigration.systemMetadata.copy.remote.usernameELASTICSEARCH_CLUSTER_MIGRATION_SYSTEM_METADATA_COPY_REMOTE_USERNAMEELASTICSEARCH_CLUSTERMIGRATION_SYSTEMMETADATA_COPY_REMOTE_USERNAMEempty
elasticsearch.clusterMigration.systemMetadata.copy.remote.passwordELASTICSEARCH_CLUSTER_MIGRATION_SYSTEM_METADATA_COPY_REMOTE_PASSWORDELASTICSEARCH_CLUSTERMIGRATION_SYSTEMMETADATA_COPY_REMOTE_PASSWORDempty
elasticsearch.clusterMigration.usage.targetClusterELASTICSEARCH_CLUSTER_MIGRATION_USAGE_TARGET_CLUSTERELASTICSEARCH_CLUSTERMIGRATION_USAGE_TARGETCLUSTERempty
elasticsearch.clusterMigration.usage.copy.remote.hostELASTICSEARCH_CLUSTER_MIGRATION_USAGE_COPY_REMOTE_HOSTELASTICSEARCH_CLUSTERMIGRATION_USAGE_COPY_REMOTE_HOSTempty
elasticsearch.clusterMigration.usage.copy.remote.usernameELASTICSEARCH_CLUSTER_MIGRATION_USAGE_COPY_REMOTE_USERNAMEELASTICSEARCH_CLUSTERMIGRATION_USAGE_COPY_REMOTE_USERNAMEempty
elasticsearch.clusterMigration.usage.copy.remote.passwordELASTICSEARCH_CLUSTER_MIGRATION_USAGE_COPY_REMOTE_PASSWORDELASTICSEARCH_CLUSTERMIGRATION_USAGE_COPY_REMOTE_PASSWORDempty