The HTTP server is the only ingest path in precompute_engine, and it is hardcoded directly in engine.rs::run(). There is no trait or interface representing an ingest source.
The closest shared logic is route_decoded_samples() in ingest_handler.rs, which both HTTP handlers call. However, this function is private and coupled to the private IngestState struct, making it inaccessible to any alternative ingest path. SeriesRouter has a clean public interface (route_group_batch, broadcast_flush, broadcast_shutdown), but there is no abstraction above it that unifies how sources push data into the router.
As a result, adding any new ingest source (file, Kafka-native, etc.) requires modifying engine.rs::run() directly and duplicating routing logic, rather than implementing a defined interface. This makes the engine difficult to extend and tests each new source in isolation from the common routing path.
The HTTP server is the only ingest path in
precompute_engine, and it is hardcoded directly inengine.rs::run(). There is no trait or interface representing an ingest source.The closest shared logic is
route_decoded_samples()iningest_handler.rs, which both HTTP handlers call. However, this function is private and coupled to the privateIngestStatestruct, making it inaccessible to any alternative ingest path.SeriesRouterhas a clean public interface (route_group_batch,broadcast_flush,broadcast_shutdown), but there is no abstraction above it that unifies how sources push data into the router.As a result, adding any new ingest source (file, Kafka-native, etc.) requires modifying
engine.rs::run()directly and duplicating routing logic, rather than implementing a defined interface. This makes the engine difficult to extend and tests each new source in isolation from the common routing path.