ElasticGraph Configuration Settings Reference
ElasticGraph has an extensive configuration system. Configuration settings files conventionally go in config/settings
:
config
└── settings
├── local.yaml
├── production.yaml
└── staging.yaml
Different configuration settings files can then be used in different environments.
This document provides a comprehensive reference for configuring ElasticGraph applications.
Example Configuration Settings
Here's a complete example configuration settings file with inline comments explaining each section. Alternately, you can download this example.
---
# Required. Configuration for datastore connections and index definitions used by all parts of
# ElasticGraph.
datastore:
# Configuration of the faraday adapter to use with the datastore client.
# Default: {"name" => nil, "require" => nil}
client_faraday_adapter:
# The faraday adapter to use with the datastore client, such as `httpx` or `typhoeus`.
# Default: null
name: "httpx"
# A Ruby library to require which provides the named adapter (optional).
# Default: null
require: "httpx/adapters/faraday"
# Required. Map of datastore cluster definitions, keyed by cluster name. The names will be
# referenced within `index_definitions` by `query_cluster` and `index_into_clusters` to identify
# datastore clusters.
clusters:
# Configuration for a specific datastore cluster.
main:
# Required. The URL of the datastore cluster.
url: "http://localhost:9200"
# Required. Determines whether `elasticgraph-elasticsearch` or `elasticgraph-opensearch` is
# used for the datastore client.
backend: "elasticsearch"
# Datastore settings in flattened (i.e. dot-separated) name form.
# Default: {}
settings:
cluster.max_shards_per_node: 2000
# Required. Map of index definition names to `IndexDefinition` objects containing customizations
# for the named index definitions for this environment.
index_definitions:
# Configuration for a specific index definition.
widgets:
# Required. Named search cluster to be used for queries on this index. The value must match be
# a key in the `clusters` map.
query_cluster: "main"
# Required. Named search clusters to index data into. The values must match keys in the
# `clusters` map.
index_into_clusters:
- "main"
# Shard routing values for which the data should be spread across all shards instead of
# concentrating it on a single shard. This is intended to be used when a handful of known
# routing value contain such a large portion of the dataset that it extremely lopsided shards
# would result. Spreading the data across all shards may perform better.
# Default: []
ignore_routing_values:
- "ABC1234567"
# Overrides for index (or index template) settings. The settings specified here will override
# any settings specified on the Ruby schema definition. This is commonly used to configure a
# different `number_of_shards` in each environment. An `index.` prefix will be added to the
# names of all settings before submitting them to the datastore.
# Default: {}
setting_overrides:
number_of_shards: 256
# Overrides for index template settings for specific dates, allowing variation of settings for
# different rollover indices. This is commonly used to configure a different
# `number_of_shards` for each year or month when using yearly or monthly rollover.
# Default: {}
setting_overrides_by_timestamp:
'2022-01-01T00:00:00Z':
number_of_shards: 64
'2023-01-01T00:00:00Z':
number_of_shards: 96
'2024-01-01T00:00:00Z':
number_of_shards: 128
# Array of custom timestamp ranges that allow different index settings for specific time
# periods.
# Default: []
custom_timestamp_ranges:
- # Array item 1
# Required. Suffix to append to the index name for this custom range.
index_name_suffix: "before_2022"
# Less than timestamp boundary (ISO 8601 format).
# Default: null
lt: "2022-01-01T00:00:00Z"
# Required. Setting overrides for this custom timestamp range.
setting_overrides:
number_of_shards: 32
- # Array item 2
# Required. Suffix to append to the index name for this custom range.
index_name_suffix: "after_2026"
# Greater than or equal timestamp boundary (ISO 8601 format).
# Default: null
gte: "2027-01-01T00:00:00Z"
# Required. Setting overrides for this custom timestamp range.
setting_overrides:
number_of_shards: 32
# Determines if we log requests/responses to/from the datastore.
# Default: false
log_traffic: false
# Passed down to the datastore client. Controls the number of times ElasticGraph attempts a call
# against the datastore before failing. Retrying a handful of times is generally advantageous,
# since some sporadic failures are expected during the course of operation, and better to retry
# than fail the entire call.
# Default: 3
max_client_retries: 3
# Required. Configuration for GraphQL behavior used by `elasticgraph-graphql`.
graphql:
# Determines the `size` of our datastore search requests if the query does not specify via `first`
# or `last`.
# Default: 50
default_page_size: 25
# Determines the maximum size of a requested page. If the client requests a page larger than this
# value, the `size` will be capped by this value.
# Default: 500
max_page_size: 100
# Queries that take longer than this configured threshold will have a sanitized version logged so
# that they can be investigated.
# Default: 5000
slow_query_latency_warning_threshold_in_ms: 3000
# Object used to identify the client of a GraphQL query based on the HTTP request.
# Default: {}
client_resolver:
# Name of the client resolver class.
# Default: null
name: "ElasticGraph::GraphQL::ClientResolvers::ViaHTTPHeader"
# The path to require to load the client resolver class.
# Default: null
require_path: "support/client_resolvers"
header_name: "X-Client-Name"
# Array of modules that will be extended onto the `GraphQL` instance to support extension
# libraries.
# Default: []
extension_modules:
- # Array item 1
# Required. The name of the extension module class to load.
name: "MyExtensionModule"
# Required. The path to require to load the extension module.
require_path: "./my_extension_module"
# Required. Configuration for indexing operations and metrics used by `elasticgraph-indexer`.
indexer:
# Map of indexing latency thresholds (in milliseconds), keyed by the name of the indexing latency
# metric. When an event is indexed with an indexing latency exceeding the threshold, a warning
# with the event type, id, and version will be logged, so the issue can be investigated.
# Default: {}
latency_slo_thresholds_by_timestamp_in_ms:
ingested_from_topic_at: 10000
entity_updated_at: 15000
# Setting that can be used to specify some derived indexing type updates that should be skipped.
# This setting should be a map keyed by the name of the derived indexing type, and the values
# should be sets of ids. This can be useful when you have a "hot spot" of a single derived
# document that is receiving a ton of updates. During a backfill (or whatever) you may want to
# skip the derived type updates.
# Default: {}
skip_derived_indexing_type_updates:
WidgetWorkspace:
- "ABC12345678"
# Required. Configuration for logging used by all parts of ElasticGraph.
logger:
# Determines what severity level we log.
# Default: "INFO"
level: "INFO"
# Determines where we log to. "stdout" or "stderr" are interpreted as being those output streams;
# any other value is assumed to be a file path.
# Default: "stdout"
device: "logs/development.log"
# Class used to format log messages.
# Default: "ElasticGraph::Support::Logger::JSONAwareFormatter"
formatter: "ElasticGraph::Support::Logger::JSONAwareFormatter"
# Required. Configuration for schema artifact management used by all parts of ElasticGraph.
schema_artifacts:
# Path to the directory where schema artifacts are stored.
# Default: "config/schema/artifacts"
directory: "config/schema/artifacts"
# Configuration for health checks used by `elasticgraph-health_check`.
health_check:
# The list of clusters to perform datastore status health checks on. A `green` status maps to
# `healthy`, a `yellow` status maps to `degraded`, and a `red` status maps to `unhealthy`. The
# returned status is the minimum status from all clusters in the list (a `yellow` cluster and a
# `green` cluster will result in a `degraded` status).
# Default: []
clusters_to_consider:
- "cluster-one"
- "cluster-two"
# A map of types to perform recency checks on. If no new records for that type have been indexed
# within the specified period, a `degraded` status will be returned.
# Default: {}
data_recency_checks:
# Configuration for data recency checks on a specific type.
Widget:
# Required. The name of the timestamp field to use for recency checks.
timestamp_field: "createdAt"
# Required. The maximum number of seconds since the last record was indexed for this type
# before considering it stale.
expected_max_recency_seconds: 30
# Configuration of datastore query interceptors used by `elasticgraph-query_interceptor`.
query_interceptor:
# List of query interceptors to apply to datastore queries before they are executed.
# Default: []
interceptors:
- # Array item 1
# Required. The name of the interceptor extension class.
name: "HideInternalRecordsInterceptor"
# Required. The path to require to load the interceptor extension. This should be a relative
# path from a directory on the Ruby `$LOAD_PATH` or a a relative path from the ElasticGraph
# application root.
require_path: "./lib/interceptors/hide_internal_records_interceptor"
# Configuration for client and query registration used by `elasticgraph-query_registry`.
query_registry:
# Required. Path to the directory containing the query registry files.
path_to_registry: "config/queries"
# Whether to allow clients that are not registered in the registry.
# Default: true
allow_unregistered_clients: true
# List of client names that are allowed to execute any query, even if not registered.
# Default: []
allow_any_query_for_clients:
- "admin"
- "internal"
Configuration Settings Schema
ElasticGraph validates configuration settings using the JSON schema shown below. It can also be downloaded as YAML or JSON for local usage (e.g. in an IDE).
---
"$schema": http://json-schema.org/draft-07/schema#
title: ElasticGraph Configuration
description: Complete configuration schema for ElasticGraph applications
type: object
required:
- datastore
- graphql
- indexer
- schema_artifacts
- logger
properties:
datastore:
description: Configuration for datastore connections and index definitions used
by all parts of ElasticGraph.
properties:
client_faraday_adapter:
type: object
description: Configuration of the faraday adapter to use with the datastore
client.
properties:
name:
type:
- string
- 'null'
minLength: 1
description: The faraday adapter to use with the datastore client, such
as `httpx` or `typhoeus`.
examples:
- net_http
- httpx
- typhoeus
-
default:
require:
type:
- string
- 'null'
minLength: 1
description: A Ruby library to require which provides the named adapter
(optional).
examples:
- httpx/adapters/faraday
default:
default:
name:
require:
examples:
- name: net_http
- name: httpx
require: httpx/adapters/faraday
additionalProperties: false
clusters:
type: object
description: Map of datastore cluster definitions, keyed by cluster name.
The names will be referenced within `index_definitions` by `query_cluster`
and `index_into_clusters` to identify datastore clusters.
patternProperties:
".+":
type: object
description: Configuration for a specific datastore cluster.
examples:
- url: http://localhost:9200
backend: elasticsearch
settings:
cluster.max_shards_per_node: 2000
properties:
url:
type: string
minLength: 1
description: The URL of the datastore cluster.
examples:
- http://localhost:9200
- https://my-cluster.example.com:9200
backend:
enum:
- elasticsearch
- opensearch
description: Determines whether `elasticgraph-elasticsearch` or `elasticgraph-opensearch`
is used for the datastore client.
examples:
- elasticsearch
- opensearch
settings:
type: object
description: Datastore settings in flattened (i.e. dot-separated)
name form.
patternProperties:
".+":
type:
- array
- string
- number
- boolean
- object
- 'null'
examples:
- cluster.max_shards_per_node: 2000
default: {}
required:
- url
- backend
additionalProperties: false
examples:
- main:
url: http://localhost:9200
backend: elasticsearch
settings:
cluster.max_shards_per_node: 2000
index_definitions:
type: object
description: Map of index definition names to `IndexDefinition` objects containing
customizations for the named index definitions for this environment.
patternProperties:
".+":
type: object
description: Configuration for a specific index definition.
examples:
- query_cluster: main
index_into_clusters:
- main
ignore_routing_values:
- ABC1234567
setting_overrides:
number_of_shards: 256
setting_overrides_by_timestamp:
'2022-01-01T00:00:00Z':
number_of_shards: 64
'2023-01-01T00:00:00Z':
number_of_shards: 96
'2024-01-01T00:00:00Z':
number_of_shards: 128
custom_timestamp_ranges:
- index_name_suffix: before_2022
lt: '2022-01-01T00:00:00Z'
setting_overrides:
number_of_shards: 32
- index_name_suffix: after_2026
gte: '2027-01-01T00:00:00Z'
setting_overrides:
number_of_shards: 32
properties:
query_cluster:
type: string
description: Named search cluster to be used for queries on this index.
The value must match be a key in the `clusters` map.
examples:
- main
- search_cluster
index_into_clusters:
type: array
items:
type: string
minLength: 1
description: Named search clusters to index data into. The values
must match keys in the `clusters` map.
examples:
- - main
- - cluster1
- cluster2
ignore_routing_values:
type: array
items:
type: string
description: Shard routing values for which the data should be spread
across all shards instead of concentrating it on a single shard.
This is intended to be used when a handful of known routing value
contain such a large portion of the dataset that it extremely lopsided
shards would result. Spreading the data across all shards may perform
better.
default: []
examples:
- []
- - mega_tenant1
- mega_tenant2
setting_overrides:
type: object
description: Overrides for index (or index template) settings. The
settings specified here will override any settings specified on
the Ruby schema definition. This is commonly used to configure a
different `number_of_shards` in each environment. An `index.` prefix
will be added to the names of all settings before submitting them
to the datastore.
patternProperties:
".+":
type:
- array
- string
- number
- boolean
- object
- 'null'
default: {}
examples:
- number_of_shards: 5
setting_overrides_by_timestamp:
type: object
description: Overrides for index template settings for specific dates,
allowing variation of settings for different rollover indices. This
is commonly used to configure a different `number_of_shards` for
each year or month when using yearly or monthly rollover.
propertyNames:
type: string
format: date-time
additionalProperties:
type: object
patternProperties:
".+":
type:
- array
- string
- number
- boolean
- object
- 'null'
default: {}
examples:
- '2025-01-01T00:00:00Z':
number_of_shards: 10
custom_timestamp_ranges:
type: array
description: Array of custom timestamp ranges that allow different
index settings for specific time periods.
items:
type: object
properties:
index_name_suffix:
type: string
description: Suffix to append to the index name for this custom
range.
examples:
- before_2020
- after_2027
setting_overrides:
type: object
description: Setting overrides for this custom timestamp range.
patternProperties:
".+":
type:
- array
- string
- number
- boolean
- object
- 'null'
examples:
- number_of_shards: 17
- number_of_replicas: 2
lt:
type:
- string
- 'null'
format: date-time
description: Less than timestamp boundary (ISO 8601 format).
examples:
- '2015-01-01T00:00:00Z'
- '2020-12-31T23:59:59Z'
default:
lte:
type:
- string
- 'null'
format: date-time
description: Less than or equal timestamp boundary (ISO 8601
format).
examples:
- '2015-01-01T00:00:00Z'
- '2020-12-31T23:59:59Z'
default:
gt:
type:
- string
- 'null'
format: date-time
description: Greater than timestamp boundary (ISO 8601 format).
examples:
- '2015-01-01T00:00:00Z'
- '2020-01-01T00:00:00Z'
default:
gte:
type:
- string
- 'null'
format: date-time
description: Greater than or equal timestamp boundary (ISO 8601
format).
examples:
- '2015-01-01T00:00:00Z'
- '2020-01-01T00:00:00Z'
default:
required:
- index_name_suffix
- setting_overrides
anyOf:
- required:
- lt
- required:
- lte
- required:
- gt
- required:
- gte
additionalProperties: false
default: []
examples:
- - index_name_suffix: before_2015
lt: '2015-01-01T00:00:00Z'
setting_overrides:
number_of_shards: 17
required:
- query_cluster
- index_into_clusters
additionalProperties: false
examples:
- widgets:
query_cluster: main
index_into_clusters:
- main
ignore_routing_values:
- ABC1234567
setting_overrides:
number_of_shards: 256
setting_overrides_by_timestamp:
'2022-01-01T00:00:00Z':
number_of_shards: 64
'2023-01-01T00:00:00Z':
number_of_shards: 96
'2024-01-01T00:00:00Z':
number_of_shards: 128
custom_timestamp_ranges:
- index_name_suffix: before_2022
lt: '2022-01-01T00:00:00Z'
setting_overrides:
number_of_shards: 32
- index_name_suffix: after_2026
gte: '2027-01-01T00:00:00Z'
setting_overrides:
number_of_shards: 32
log_traffic:
type: boolean
description: Determines if we log requests/responses to/from the datastore.
default: false
examples:
- false
- true
max_client_retries:
type: integer
description: Passed down to the datastore client. Controls the number of times
ElasticGraph attempts a call against the datastore before failing. Retrying
a handful of times is generally advantageous, since some sporadic failures
are expected during the course of operation, and better to retry than fail
the entire call.
default: 3
minimum: 0
examples:
- 3
- 5
- 10
required:
- clusters
- index_definitions
additionalProperties: false
graphql:
description: Configuration for GraphQL behavior used by `elasticgraph-graphql`.
properties:
default_page_size:
description: Determines the `size` of our datastore search requests if the
query does not specify via `first` or `last`.
type: integer
minimum: 1
default: 50
examples:
- 25
- 50
- 100
max_page_size:
description: Determines the maximum size of a requested page. If the client
requests a page larger than this value, the `size` will be capped by this
value.
type: integer
minimum: 1
default: 500
examples:
- 100
- 500
- 1000
slow_query_latency_warning_threshold_in_ms:
description: Queries that take longer than this configured threshold will
have a sanitized version logged so that they can be investigated.
type: integer
minimum: 0
default: 5000
examples:
- 3000
- 5000
- 10000
client_resolver:
description: Object used to identify the client of a GraphQL query based on
the HTTP request.
type: object
properties:
name:
description: Name of the client resolver class.
type:
- string
- 'null'
minLength: 1
default:
examples:
-
- MyCompany::ElasticGraphClientResolver
require_path:
description: The path to require to load the client resolver class.
type:
- string
- 'null'
minLength: 1
default:
examples:
-
- "./lib/my_company/elastic_graph/client_resolver"
patternProperties:
".+":
type:
- array
- string
- number
- boolean
- object
- 'null'
default: {}
examples:
- {}
- name: ElasticGraph::GraphQL::ClientResolvers::ViaHTTPHeader
require_path: support/client_resolvers
header_name: X-Client-Name
additionalProperties: false
extension_modules:
description: Array of modules that will be extended onto the `GraphQL` instance
to support extension libraries.
type: array
items:
type: object
properties:
name:
type: string
minLength: 1
description: The name of the extension module class to load.
examples:
- MyExtensionModule
- ElasticGraph::MyExtension
require_path:
type: string
minLength: 1
description: The path to require to load the extension module.
examples:
- "./my_extension_module"
- elastic_graph/my_extension
required:
- name
- require_path
additionalProperties: false
default: []
examples:
- []
- - name: MyExtensionModule
require_path: "./my_extension_module"
additionalProperties: false
indexer:
description: Configuration for indexing operations and metrics used by `elasticgraph-indexer`.
properties:
latency_slo_thresholds_by_timestamp_in_ms:
description: Map of indexing latency thresholds (in milliseconds), keyed by
the name of the indexing latency metric. When an event is indexed with an
indexing latency exceeding the threshold, a warning with the event type,
id, and version will be logged, so the issue can be investigated.
type: object
patternProperties:
".+":
type: integer
minimum: 0
default: {}
examples:
- {}
- ingested_from_topic_at: 10000
entity_updated_at: 15000
skip_derived_indexing_type_updates:
description: Setting that can be used to specify some derived indexing type
updates that should be skipped. This setting should be a map keyed by the
name of the derived indexing type, and the values should be sets of ids.
This can be useful when you have a "hot spot" of a single derived document
that is receiving a ton of updates. During a backfill (or whatever) you
may want to skip the derived type updates.
type: object
patternProperties:
"^[A-Z]\\w*$":
type: array
items:
type: string
minLength: 1
default: {}
examples:
- {}
- WidgetWorkspace:
- ABC12345678
additionalProperties: false
logger:
description: Configuration for logging used by all parts of ElasticGraph.
properties:
level:
description: Determines what severity level we log.
examples:
- INFO
- WARN
enum:
- DEBUG
- debug
- INFO
- info
- WARN
- warn
- ERROR
- error
- FATAL
- fatal
- UNKNOWN
- unknown
default: INFO
device:
description: Determines where we log to. "stdout" or "stderr" are interpreted
as being those output streams; any other value is assumed to be a file path.
examples:
- stdout
- logs/development.log
default: stdout
type: string
minLength: 1
formatter:
description: Class used to format log messages.
examples:
- ElasticGraph::Support::Logger::JSONAwareFormatter
- MyAlternateFormatter
type: string
pattern: "^[A-Z]\\w+(::[A-Z]\\w+)*$"
default: ElasticGraph::Support::Logger::JSONAwareFormatter
additionalProperties: false
schema_artifacts:
description: Configuration for schema artifact management used by all parts of
ElasticGraph.
properties:
directory:
description: Path to the directory where schema artifacts are stored.
examples:
- config/schema/artifacts
default: config/schema/artifacts
type: string
minLength: 1
additionalProperties: false
health_check:
description: Configuration for health checks used by `elasticgraph-health_check`.
properties:
clusters_to_consider:
description: The list of clusters to perform datastore status health checks
on. A `green` status maps to `healthy`, a `yellow` status maps to `degraded`,
and a `red` status maps to `unhealthy`. The returned status is the minimum
status from all clusters in the list (a `yellow` cluster and a `green` cluster
will result in a `degraded` status).
type: array
items:
type: string
minLength: 1
default: []
examples:
- []
- - cluster-one
- cluster-two
data_recency_checks:
description: A map of types to perform recency checks on. If no new records
for that type have been indexed within the specified period, a `degraded`
status will be returned.
type: object
patternProperties:
"^[A-Z]\\w*$":
type: object
description: Configuration for data recency checks on a specific type.
examples:
- timestamp_field: createdAt
expected_max_recency_seconds: 30
properties:
expected_max_recency_seconds:
type: integer
minimum: 0
description: The maximum number of seconds since the last record was
indexed for this type before considering it stale.
examples:
- 30
- 300
- 3600
timestamp_field:
type: string
minLength: 1
description: The name of the timestamp field to use for recency checks.
examples:
- createdAt
- updatedAt
required:
- expected_max_recency_seconds
- timestamp_field
additionalProperties: false
default: {}
examples:
- {}
- Widget:
timestamp_field: createdAt
expected_max_recency_seconds: 30
additionalProperties: false
query_interceptor:
description: Configuration of datastore query interceptors used by `elasticgraph-query_interceptor`.
properties:
interceptors:
description: List of query interceptors to apply to datastore queries before
they are executed.
type: array
items:
type: object
properties:
name:
description: The name of the interceptor extension class.
type: string
pattern: "^[A-Z]\\w+(::[A-Z]\\w+)*$"
examples:
- HideInternalRecordsInterceptor
require_path:
description: The path to require to load the interceptor extension.
This should be a relative path from a directory on the Ruby `$LOAD_PATH`
or a a relative path from the ElasticGraph application root.
type: string
minLength: 1
examples:
- "./lib/interceptors/hide_internal_records_interceptor"
config:
description: Configuration for the interceptor. Will be passed into
the interceptors `#initialize` method.
type: object
examples:
- {}
- timeout: 30
default: {}
required:
- name
- require_path
additionalProperties: false
examples:
- []
- - name: HideInternalRecordsInterceptor
require_path: "./lib/interceptors/hide_internal_records_interceptor"
default: []
additionalProperties: false
query_registry:
description: Configuration for client and query registration used by `elasticgraph-query_registry`.
properties:
path_to_registry:
description: Path to the directory containing the query registry files.
type: string
examples:
- config/queries
allow_unregistered_clients:
description: Whether to allow clients that are not registered in the registry.
type: boolean
examples:
- true
- false
default: true
allow_any_query_for_clients:
description: List of client names that are allowed to execute any query, even
if not registered.
type: array
items:
type: string
examples:
- []
- - admin
- internal
default: []
required:
- path_to_registry
additionalProperties: false
additionalProperties: true