Repository navigation
Closed
Labels
P2: mediumMinor bug, missing validation, metric inaccuracyMinor bug, missing validation, metric inaccuracyarchitectureSystemic design improvements that eliminate classes of bugsSystemic design improvements that eliminate classes of bugscomponent:diagnosticsDiagnostics endpoints, dashboard, health, probes, and trace explorerDiagnostics endpoints, dashboard, health, probes, and trace explorercomponent:input/commonCross-cutting input behavior spanning multiple input typesCross-cutting input behavior spanning multiple input typescomponent:pipelinePipeline orchestration, batching, runtime flow, and worker coordinationPipeline orchestration, batching, runtime flow, and worker coordinationenhancementNew feature or requestNew feature or requestproductionRequired for production readinessRequired for production readinesswork-unitScheduling ticket for one agent runScheduling ticket for one agent run
Description
work-unit: control plane — input lifecycle status wiring
Purpose
Wire input-side lifecycle truth into the shared control-plane model after the shared status types and probe semantics are established.
This batch is intentionally downstream of #1414 and #1413: it plugs receiver and tailer lifecycle state into the control-plane surface rather than defining that surface.
Repo footprint
crates/logfwd-io/src/input.rscrates/logfwd-io/src/framed.rscrates/logfwd-io/src/otlp_receiver.rscrates/logfwd-io/src/arrow_ipc_receiver.rscrates/logfwd-io/src/tail.rsor adjacent tail modules touched by lifecycle wiringcrates/logfwd/src/pipeline.rs- targeted input / diagnostics tests
In scope
| # | Type | Why included |
|---|---|---|
| #1306 | architecture | input-side lifecycle is part of the shared control-plane substrate |
| #1310 | architecture | tailer lifecycle should feed the shared status model |
| #1311 | architecture | receiver lifecycle should become explicit instead of thread-lifetime inference |
Related metas / phases
- should follow
#1414shared status model and#1413probe truth - broader I/O umbrella:
#1315 - temporary cleanup-wave coordination only:
#1450
Non-goals
- no sink-side degradation or failure wiring (that stays in
#1416) - no full receiver substrate rewrite or axum migration
- no full tailer modularization / typestate implementation
- no retry/backoff semantics changes
Done when
- OTLP, Arrow IPC, framed inputs, and tailer-owned inputs report explicit lifecycle state through the shared model
- quiet-but-healthy or idle inputs do not fail readiness by themselves
- start, stop, and fatal input failure transitions are visible in diagnostics
- tests cover representative healthy, idle, stopping, and failed input states
Metadata
Metadata
Assignees
Labels
P2: mediumMinor bug, missing validation, metric inaccuracyMinor bug, missing validation, metric inaccuracyarchitectureSystemic design improvements that eliminate classes of bugsSystemic design improvements that eliminate classes of bugscomponent:diagnosticsDiagnostics endpoints, dashboard, health, probes, and trace explorerDiagnostics endpoints, dashboard, health, probes, and trace explorercomponent:input/commonCross-cutting input behavior spanning multiple input typesCross-cutting input behavior spanning multiple input typescomponent:pipelinePipeline orchestration, batching, runtime flow, and worker coordinationPipeline orchestration, batching, runtime flow, and worker coordinationenhancementNew feature or requestNew feature or requestproductionRequired for production readinessRequired for production readinesswork-unitScheduling ticket for one agent runScheduling ticket for one agent run
Activity
github-actions commentedon Apr 6, 2026
tl;dr: Outcome A — ready for implementation: input lifecycle state is currently invisible at the shared control-plane boundary, and this can be fixed mechanically by adding per-input lifecycle status to shared diagnostics and wiring explicit transitions in the input loops/receivers.
Recommendation
Implement this as a focused wiring slice: add a shared input lifecycle state model, attach it to
PipelineMetricsinput entries, emit transitions from input poll loops + receiver shutdown/error paths, and expose state in diagnostics JSON while preserving the current quiet-source readiness rule.Findings
Core gaps (verified in code):
crates/logfwd-io/src/input.rs:43(pub trait InputSource: Send) has onlypoll,name,checkpoint_data,set_offset_by_source; there is no lifecycle/status API.crates/logfwd-io/src/diagnostics.rs:39stores pipeline inputs asVec<(String, String, Arc(ComponentStats))>(name/type/stats only).crates/logfwd-io/src/diagnostics.rs:545-555readiness islet ready = !self.pipelines.is_empty();(no per-input health/lifecycle influence).crates/logfwd-io/src/diagnostics.rs:1650-1655test explicitly asserts quiet/no-data pipeline remains ready.crates/logfwd/src/pipeline.rs:1059-1065poll errors are logged/slept (input.poll_error) but no lifecycle transition is published.crates/logfwd-io/src/otlp_receiver.rs:279-289andcrates/logfwd-io/src/arrow_ipc_receiver.rs:239-244return empty on no data; no shared lifecycle state updates are emitted.crates/logfwd-io/src/tail.rs:759-766emitsEndOfFile(idle-like signal) but this is not surfaced into diagnostics lifecycle state.Related architecture issues (context):
Verification
This confirms the current readiness contract: pipeline existence gates readiness, not data freshness.
Detailed Action Plan (mechanical)
Files to modify (with current anchors)
crates/logfwd-types/src/diagnostics.rs:10—pub struct ComponentStatscrates/logfwd-io/src/diagnostics.rs:39—pub inputs: Vec<(String, String, Arc(ComponentStats))>crates/logfwd/src/pipeline.rs:1316—fn build_input_state(...) -> Result(InputState, String)crates/logfwd/src/pipeline.rs:1038and:1195— both input poll loopscrates/logfwd-io/src/otlp_receiver.rs:278—impl InputSource for OtlpReceiverInputcrates/logfwd-io/src/arrow_ipc_receiver.rs:32—pub struct ArrowIpcReceiver/ receiver lifecycle hookscrates/logfwd-io/src/input.rs:43—pub trait InputSource: SendExact changes
Add shared input lifecycle model in
logfwd-typescrates/logfwd-types/src/diagnostics.rs, add:enum InputLifecycleState { Starting, Healthy, Idle, Stopping, Stopped, Failed }state,reason(optional), andstate_changed_at_ns.Attach lifecycle to per-input diagnostics entries
crates/logfwd-io/src/diagnostics.rs, replace input tuple storage with a named struct (e.g.InputMetricsEntry) containing:name,type,stats,lifecycle./api/pipelinesJSON serializer to include input lifecycle fields (state,reason,state_changed_at_ns).Wire lifecycle handle through pipeline input construction
crates/logfwd/src/pipeline.rs:InputStateto include lifecycle handle.build_input_state, initializeStartingthen setHealthyonce source is successfully constructed.Emit transitions in both input loops (
input_poll_loop,input_poll_loop_async)events.is_empty()following prior healthy activity: setIdle.Healthy.input.poll_error): setFailedwith reason.Stopping, thenStoppedafter drain send attempt.Receiver-specific stop/failure visibility
crates/logfwd-io/src/otlp_receiver.rsandcrates/logfwd-io/src/arrow_ipc_receiver.rs:Drop) can surfaceStopping/Stoppedthrough shared lifecycle handle.Preserve quiet-source readiness semantics
/readysemantics such thatIdledoes not fail readiness.Test to write/update
crates/logfwd-io/src/diagnostics.rstests:test_pipelines_endpointstyle assertions to verify lifecycle fields are present for each input.healthy,idle,stopping,failed.test_ready_endpoint_with_pipeline_returns_200).crates/logfwd/src/pipeline.rstests:Receiver tests:
crates/logfwd-io/src/otlp_receiver.rs/arrow_ipc_receiver.rs: assert disconnect/stop transitions are reflected.Verification commands
Related Items
crates/logfwd-io/src/input.rs:43crates/logfwd-io/src/diagnostics.rs:39crates/logfwd/src/pipeline.rs:1059pipeline.rscontrol flowNote
🔒 Integrity filtering filtered 10 items
Integrity filtering activated and filtered the following items during workflow execution.
This happens when a tool call accesses a resource that does not meet the required integrity or secrecy level of the workflow.
issue_read: has lower integrity than agent requires. The agent cannot read data with integrity below "approved".)issue_read: has lower integrity than agent requires. The agent cannot read data with integrity below "approved".)search_pull_requests: has lower integrity than agent requires. The agent cannot read data with integrity below "approved".)issue_read: has lower integrity than agent requires. The agent cannot read data with integrity below "approved".)issue_read: has lower integrity than agent requires. The agent cannot read data with integrity below "approved".)issue_read: has lower integrity than agent requires. The agent cannot read data with integrity below "approved".)pull_request_read: has lower integrity than agent requires. The agent cannot read data with integrity below "approved".)pull_request_read: has lower integrity than agent requires. The agent cannot read data with integrity below "approved".)pull_request_read: has lower integrity than agent requires. The agent cannot read data with integrity below "approved".)pull_request_read: has lower integrity than agent requires. The agent cannot read data with integrity below "approved".)What is this? | From workflow: Issue Triage
Give us feedback! React with 🚀 if perfect, 👍 if helpful, 👎 if not.
[-]work-unit: logfwd-io inputs — lifecycle status wiring for receivers and tailers[/-][+]work-unit: control plane — input lifecycle status wiring[/+]