Portal Community

Three Pillars

PillarInterfaceAuto-emitted?Surfaces In
Structured LogsINodeLoggerLifecycle messages (started, completed, failed)Observer Panel Logs tab, Loki
MetricsINodeMetricsexecutionDurationMs, retryCount, resultStatusObserver Panel Inspector, Prometheus, Grafana
Distributed TracesOpenTelemetryOne span per node, under parent execution spanBizFirst 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

PageTopic
Structured LogsINodeLogger, log levels, structured fields
Node MetricsAuto-emitted metrics: duration, retry, result
OpenTelemetry TracesSpan per node, propagation, Tempo integration
Correlation IDsexecutionId + nodeId as correlation, TraceId in logs
Emitting Custom Logsctx.Logger.LogXxx(), do/don't patterns
Emitting Custom Metricsctx.Metrics.Record(), counter vs. gauge, naming
Observer Panel DisplayHow signals from backend surface in the UI