Context
Next-steps discussion from Slack (Milind, 2026-08-24):
- PoC of sketch creation, merging, and estimation dataflow processors with the specified control plane configs
- Implement sketch protocol on top of the self-describing sketch format, and integrate with OTAP metrics
- Start with single node, multiple topics; test multiple nodes later
- Add support for live reconfiguration scoped to a single dataflow processor (currently pipeline-wide in OTAP)
- Distributed shuffle (repartitioning sketches across hosts by a different label than they were originally grouped by, e.g. re-key
host×process sketches by process) is not supported in OTAP yet, though most of the underlying functionality (associative sketch merge) already exists.
Status
Two unreviewed PRs already cover most of items (1) and the "self-describing format" half of (2):
What's still missing, from reading the code directly:
AsapSketchesProcessor::process() in otap-patch/all/mod.rs:244-266 is a deliberate pass-through — Message::PData is forwarded unchanged, never routed through the plugin. There is no OtapPdata ↔ OtapMetricRecords conversion yet (only OtapMetricRecords ↔ RecordBatch exists, in otap/records.rs).
Message::Control(NodeControlMsg::Config { .. }) (otap-patch/all/mod.rs:261) is handled with a no-op Ok(()) — never wired to Precompute::update_config, even though that path is already scoped per plugin instance (lifecycle.rs:547), not pipeline-wide.
- Only a no-op
StubChannel implements ControlChannel (control_channel.rs) — no real transport (e.g. OpAMP, flagged as the natural fit in docs/data_model.md's "Control plane vs. data plane" section).
- No "topic" concept exists anywhere in the codebase/docs — needs to be defined before item 3 below can be built.
- Nothing in the repo addresses distributed shuffle (item 5) — it's new design work, not just wiring.
Next steps
Context
Next-steps discussion from Slack (Milind, 2026-08-24):
host×processsketches byprocess) is not supported in OTAP yet, though most of the underlying functionality (associative sketch merge) already exists.Status
Two unreviewed PRs already cover most of items (1) and the "self-describing format" half of (2):
feat/schema-dictionary-record-codec— implements the SCHEMA/DICTIONARY/RECORD codec (otap::dictionary::SeriesDictionary/SeriesDictionaryDecoder) perdocs/data_model.md. Proven in-process only (examples/sketch_pipeline_demo.rs).feat/otap-plugin-and-network-transport— stacked on otap: implement Schema/Dictionary/Record codec from data_model.md #5. Adds Arrow-IPC-over-TCP transport (otap::wire) and runs the realAsapSketchesPluginlifecycle in producer and receiver roles over a socket (examples/sketch_producer_node.rs/sketch_receiver_node.rs).What's still missing, from reading the code directly:
AsapSketchesProcessor::process()inotap-patch/all/mod.rs:244-266is a deliberate pass-through —Message::PDatais forwarded unchanged, never routed through the plugin. There is noOtapPdata ↔ OtapMetricRecordsconversion yet (onlyOtapMetricRecords ↔ RecordBatchexists, inotap/records.rs).Message::Control(NodeControlMsg::Config { .. })(otap-patch/all/mod.rs:261) is handled with a no-opOk(())— never wired toPrecompute::update_config, even though that path is already scoped per plugin instance (lifecycle.rs:547), not pipeline-wide.StubChannelimplementsControlChannel(control_channel.rs) — no real transport (e.g. OpAMP, flagged as the natural fit indocs/data_model.md's "Control plane vs. data plane" section).Next steps
OtapPdata → OtapMetricRecordsconversion (the "one seam left" the README calls out) sootap/records.rs::flatten/lifthas something to operate on.process()callback model toAsapSketchesPlugin::start()'s long-runningStreammodel — e.g. anmpscchannel fed byprocess(), withplugin.start(...)spawned once at processor construction, and a task drainingEmitReceiverback out througheffect_handler.rolefield (producer/receiver) toAsapSketchesUserConfigsocreate_asap_sketches_processorknows whether to callplugin.start()(raw observations in) orplugin.start_from_envelopes()(upstreamSketchStreamBatches in, merge viaobserve_envelope).OtapPdatacarries: the existing Strategy-Bencode_batch/decode_batch(otap/encode.rs/decode.rs, disguises sketch data as ordinary OTAP metrics so it can transit generic pipeline hops) vs. otap: implement Schema/Dictionary/Record codec from data_model.md #5's SCHEMA/DICTIONARY/RECORD dictionary economics (currently used by otap: real plugin integration + Arrow IPC network transport #6'sotap::wireTCP transport, scoped toasap_sketches→asap_sketcheshops).urn:asap:processor:asap_sketches(not just the standalone example binaries) — this is the README's Phase E "cross-host parity" milestone.NodeControlMsg::Config(otap-patch/all/mod.rs:261) toPrecompute::update_configinstead ofOk(()); pick and implement a realControlChanneltransport (OpAMP is the leading candidate perdocs/data_model.md) to replaceStubChannel.agg_id? something else?) — confirm with Milind — then drive multiple concurrent series through one producer→receiver pair on one machine, reusingsketch_producer_node/sketch_receiver_nodefrom otap: real plugin integration + Arrow IPC network transport #6 as the harness.otap::wiretransport once single-node/multi-topic works.observe_envelopemerge primitive — OTAP has no support for this today, so this needs design work before implementation.