Flow Studio
Node Observability Overview
Every node execution is automatically instrumented with three observability pillars: structured logs (via INodeLogger), metrics (via INodeMetrics), and distributed traces (via OpenTelemetry). Executors can emit additional custom signals without managing infrastructure.
Three Pillars
| Pillar | Interface | Auto-emitted? | Surfaces In |
|---|---|---|---|
| Structured Logs | INodeLogger | Lifecycle messages (started, completed, failed) | Observer Panel Logs tab, Loki |
| Metrics | INodeMetrics | executionDurationMs, retryCount, resultStatus | Observer Panel Inspector, Prometheus, Grafana |
| Distributed Traces | OpenTelemetry | One span per node, under parent execution span | BizFirst Observe (Tempo), Inspector traceId link |
NodeObservabilityContext
All three observability interfaces are bundled into a single NodeObservabilityContext that is accessible via ctx.Observability in every executor:
// NodeObservabilityContext.cs
public class NodeObservabilityContext
{
public INodeLogger Logger { get; }
public INodeMetrics Metrics { get; }
public Activity? Span { get; } // Current OTel span
}
// In your executor:
public override async Task<NodeExecutionResult> ExecuteAsync(
NodeExecutionContext ctx, CancellationToken ct)
{
ctx.Observability.Logger.LogInformation("Processing order {OrderId}", orderId);
ctx.Observability.Metrics.IncrementCounter("orders.processed");
// ...
}
What This Guide Covers
| Page | Topic |
|---|---|
| Structured Logs | INodeLogger, log levels, structured fields |
| Node Metrics | Auto-emitted metrics: duration, retry, result |
| OpenTelemetry Traces | Span per node, propagation, Tempo integration |
| Correlation IDs | executionId + nodeId as correlation, TraceId in logs |
| Emitting Custom Logs | ctx.Logger.LogXxx(), do/don't patterns |
| Emitting Custom Metrics | ctx.Metrics.Record(), counter vs. gauge, naming |
| Observer Panel Display | How signals from backend surface in the UI |