Portal Community

Push vs. Pull

ScenarioTransportLatency
Live run (in progress)SignalR push (NodeLogEmitted)Near-realtime (buffer flush interval)
Past run (historical)REST pull (GET /logs, paginated)On-demand load

End-to-End Flow

1

Executor calls ctx.Observability.Logger.LogInformation(...)

2

SignalRLogSink receives the log entry

Adds pre-seeded fields (nodeId, executionId, tenantId, traceId)

3

Server-side buffer accumulates entries

Flushes at interval or when buffer reaches N entries

4

ExecutionHub sends NodeLogEmitted to client group

Payload: LogEntry[] (batch for efficiency)

5

Client appends to executionStore.logs[]

Deduplication by logId. Logs tab re-renders via virtual scroller.