Skip to content

Move JSON ingestion into elasticgraph-json_ingestion via an indexer extension#1302

Open
jwils wants to merge 1 commit into
joshuaw/ingestion-adapter-seamfrom
joshuaw/json-ingestion-adapter
Open

Move JSON ingestion into elasticgraph-json_ingestion via an indexer extension#1302
jwils wants to merge 1 commit into
joshuaw/ingestion-adapter-seamfrom
joshuaw/json-ingestion-adapter

Conversation

@jwils

@jwils jwils commented Jul 7, 2026

Copy link
Copy Markdown
Collaborator

Why

JSON parsing and validation has never conceptually belonged to elasticgraph-indexer--it should live in elasticgraph-json_ingestion alongside the JSON schema generation, with the indexer staying ingestion-format-neutral so elasticgraph-proto_ingestion (and others) can plug in the same way.

What

  • Move the JSON ingestion adapter and the JSON-schema-based record preparer factory into elasticgraph-json_ingestion (JSONIngestion::IngestionAdapter, JSONIngestion::RecordPreparerFactory)
  • JSONIngestion::SchemaDefinition::APIExtension registers a JSONIngestion::IndexerExtension via register_indexer_extension, which contributes the adapter to Indexer#ingestion_adapters. Zero configuration: any schema defined with JSON ingestion support automatically gets JSON event ingestion at indexing time, activated through the schema artifacts' runtime metadata
  • elasticgraph-indexer no longer contains or references any JSON-specific ingestion logic; Indexer#record_preparer_factory is removed, and operation_factory raises a clear ConfigError when a schema has no ingestion extensions
  • The be_a_valid_elastic_graph_event matcher moves to elastic_graph/json_ingestion/spec_support/event_matcher (breaking require-path change)
  • Suites that build indexers from the shared test artifacts gain development dependencies on elasticgraph-json_ingestion

Remaining follow-up

Indexer::TestSupport::Converters still builds JSON-envelope events (json_schema_version); moving it requires touching elasticgraph-local's runtime fake-data indexing, so it's deferred to a follow-up PR.

Verification

  • script/quick_build (5160 examples, 0 failures, plus site validation with doctests)
  • Every gem suite run individually in its isolated per-gem bundle (the run_each_gem_spec CI mode), all green with 100% coverage

Stack

Current PR is marked with ->.

@jwils
jwils force-pushed the joshuaw/json-ingestion-adapter branch 2 times, most recently from bd53a07 to bcc1c1a Compare July 7, 2026 21:47
@jwils
jwils force-pushed the joshuaw/ingestion-adapter-seam branch from 1f731a7 to 6e17704 Compare July 7, 2026 21:47
@jwils
jwils force-pushed the joshuaw/json-ingestion-adapter branch from bcc1c1a to 4724804 Compare July 8, 2026 02:10
@jwils
jwils force-pushed the joshuaw/ingestion-adapter-seam branch from 6e17704 to a9d37cc Compare July 8, 2026 02:10
jwils added a commit that referenced this pull request Jul 8, 2026
## Why

To support ingestion in any data format while keeping format-specific
logic in its own gem (`elasticgraph-json_ingestion`, the upcoming
`elasticgraph-proto_ingestion`), the indexer needs an extension
mechanism analogous to the GraphQL one: schema definition extensions
register runtime extensions in the schema artifacts, and the runtime
component applies them at boot. This PR adds the runtime metadata
storage for that.

## What

- Add `indexer_extension_modules` to `RuntimeMetadata::Schema`,
mirroring `graphql_extension_modules`
- Add a `RuntimeMetadata::IndexerExtension` wrapper (twin of
`GraphQLExtension`)
- Nothing registers or consumes these yet, and empty lists are pruned
from dumped YAML, so no schema artifacts change

## Verification

- `script/lint`, `script/type_check`
- `script/run_gem_specs elasticgraph-schema_artifacts` (100% coverage)
- `script/run_gem_specs elasticgraph-schema_definition`
- `bundle exec rake schema_artifacts:check` (no artifact changes)
## Stack
Current PR is marked with `->`.

- -> [#1298 Add indexer_extension_modules to runtime
metadata](#1298)
- [#1299 Add register_indexer_extension schema definition
API](#1299)
- [#1300 Apply indexer extension modules when the Indexer
boots](#1300)
- [#1301 Extract an ingestion adapter seam inside
elasticgraph-indexer](#1301)
- [#1302 Move JSON ingestion into elasticgraph-json_ingestion via an
indexer extension](#1302)
jwils added a commit that referenced this pull request Jul 8, 2026
## Why

Ingestion format gems need a way to ensure their indexer-side behavior
is active whenever a schema is defined with their schema definition
extension--the same guarantee `register_graphql_extension` provides for
GraphQL extensions (e.g. how `elasticgraph-apollo` registers its engine
extension).

## What

- Add `register_indexer_extension` to the schema definition API,
mirroring `register_graphql_extension`
- Registered extensions are dumped into the `indexer_extension_modules`
runtime metadata added in #1298

## Verification

- `script/lint`, `script/type_check`
- `script/run_gem_specs elasticgraph-schema_definition` (100% coverage)
## Stack
Current PR is marked with `->`.

- [#1298 Add indexer_extension_modules to runtime
metadata](#1298)
- -> [#1299 Add register_indexer_extension schema definition
API](#1299)
- [#1300 Apply indexer extension modules when the Indexer
boots](#1300)
- [#1301 Extract an ingestion adapter seam inside
elasticgraph-indexer](#1301)
- [#1302 Move JSON ingestion into elasticgraph-json_ingestion via an
indexer extension](#1302)
@jwils
jwils force-pushed the joshuaw/json-ingestion-adapter branch from 4724804 to f1b5472 Compare July 8, 2026 16:15
@jwils
jwils force-pushed the joshuaw/ingestion-adapter-seam branch from a9d37cc to 73bb297 Compare July 8, 2026 16:15
jwils added a commit that referenced this pull request Jul 8, 2026
## Why

With runtime metadata storage (#1298) and the registration API (#1299)
in place, `elasticgraph-indexer` needs to actually apply registered
extensions--introducing the indexer extension concept, mirroring how
`elasticgraph-graphql` applies GraphQL extension modules from both
settings YAML and runtime metadata.

## What

- `Indexer#initialize` extends configured extension modules onto the
instance: first from the new `indexer.extension_modules` setting
(mirroring `graphql.extension_modules`), then from the runtime
metadata's `indexer_extension_modules`
- Regenerated config schema artifacts for the new setting
- Nothing registers an indexer extension yet, so this is a no-op for all
existing schemas

## Verification

- `script/lint`, `script/type_check`
- `script/run_gem_specs elasticgraph-indexer` (100% coverage)
- `script/run_gem_specs elasticgraph-local`
## Stack
Current PR is marked with `->`.

- [#1298 Add indexer_extension_modules to runtime
metadata](#1298)
- [#1299 Add register_indexer_extension schema definition
API](#1299)
- -> [#1300 Apply indexer extension modules when the Indexer
boots](#1300)
- [#1301 Extract an ingestion adapter seam inside
elasticgraph-indexer](#1301)
- [#1302 Move JSON ingestion into elasticgraph-json_ingestion via an
indexer extension](#1302)
…xtension

The JSON ingestion adapter and JSON-schema-based record preparer factory
move from elasticgraph-indexer to elasticgraph-json_ingestion, and the
JSON ingestion schema definition extension registers an indexer extension
in runtime metadata that makes the adapter available at indexing time.
Any schema defined with JSON ingestion support automatically gets JSON
event ingestion--no settings needed--and elasticgraph-indexer no longer
contains (or refers to) any JSON-specific ingestion logic.

The be_a_valid_elastic_graph_event matcher moves to
elastic_graph/json_ingestion/spec_support/event_matcher, and suites that
build indexers from the shared test schema artifacts gain a development
dependency on elasticgraph-json_ingestion (whose indexer extension those
artifacts now reference).
@jwils
jwils force-pushed the joshuaw/ingestion-adapter-seam branch from 73bb297 to 9b5aa5c Compare July 8, 2026 21:25
@jwils
jwils force-pushed the joshuaw/json-ingestion-adapter branch from f1b5472 to 292fbd2 Compare July 8, 2026 21:25
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant