curl.
Every event of a run goes into one ordered queue, and progress, history, logs, the live streams, MCP and the web UI all read from it, so they agree. To see why, read How runs work.
Watch one run
1
Start with the status
-o json for every node’s status. A node that ended FAILURE or TIMED_OUT carries its reason, so you can often skip the logs. Nodes behind a failed one end UPSTREAM_FAILED: look for the node that failed, not for them. Over REST this is GET /api/executions/{executionId}.2
Follow it live
NODE compile RUNNING, LOG compile: ..., WORKFLOW SUCCESS. Add --quiet to see only problems and the end. Start the watch before the run: the feed does not replay old events. --until-done exits with 0 whatever the outcome, so read the last WORKFLOW line. For a progress snapshot at every change, use yukta-cli workflow status-stream <session-id> <execution-id> (REST: GET /api/executions/{executionId}/status/stream).3
Read the logs
--node, you read part of what one node wrote: --tail, --head, --offset with --limit, --grep with --context, and --stream stdout|stderr|all.4
Read the results
Logs are text. Results are what reached each terminal node, whole and typed:One JSON event per line, ending with
EXECUTION_END. Results live in memory, so they are gone after a restart and bounded per run.5
Watch everything at once
GET /api/events/stream?executionId=&type=, both filters optional). Supervisors and external tools use it. Delivery is best effort and never holds up a run.Scrape the metrics
The server publishes metrics for every governance and execution decision: node executions, durations and retries, execution duration and queue wait, scheduler gauges, refused starts, dropped events, checkpoint bytes and errors, worker and leader gauges, and model usage.1
Read them once by hand
/actuator except /actuator/health needs an unrestricted ADMIN key. With no key set, it is refused, so the server’s dev-only endpoints stay closed.2
Expose a Prometheus endpoint
The build includes the Prometheus registry, but the endpoint is off until you add it to the exposed list (the default is Point Prometheus at
health,info,metrics):/actuator/prometheus and give it the key as a bearer token (authorization in the scrape config).3
Alert on the signals that matter
GET /actuator/metrics lists every meter the server has, and GET /actuator/metrics/{name} shows one with its tags.Export traces and metrics
Each run is an observation namedyukta.run, the parent of one yukta.node observation per node. Export both traces and metrics over OTLP to Jaeger, Tempo, Honeycomb or an OpenTelemetry collector. Both exports are off by default: the server sends nothing until you turn them on.
0.1, which records one run in ten; 1.0 records every run. The trace id is added to log lines, and outbound calls made through Yukta’s HTTP clients carry a W3C traceparent header.
Verify it worked
- Start a run and watch it with
controlbus watch --until-done. You see its nodes and the finalWORKFLOWline. curlthe metrics endpoint with yourADMINkey. You seeyukta.node.executionsafter any run.- With the Prometheus endpoint on,
GET /actuator/prometheusreturns text lines that start withyukta_. - With tracing on, a trace named
yukta.runappears in your collector within a minute of a sampled run.
Variations that matter
- A log line is missing. Node log lines stay in memory for 30 minutes by default (
yukta.logs.store.retention.default-period-minutes, from 1 minute to 24 hours) and are lost on restart. When more than 10,000 lines wait to be recorded, the extra ones are dropped and counted inyukta.tracker.dropped{type=log}. A node that wrote no live logs has its output logged cut to 2,048 characters. Lines a plugin writes on a remote worker do not reach the stream. - An event stream disconnects. A restart or takeover drops every open stream. Reconnect with the
Last-Event-IDheader. Streams send a keep-alive comment every 15 seconds, so a proxy idle timeout above that keeps them open. A client that connects late catches up from a history kept for 5 minutes. - Keep ended runs in memory longer. Live state of ended runs is kept 10 minutes (
yukta.tracker.cleanup-ttl). See Tune capacity and limits. - Who steered it.
GET /api/control/auditlists control commands newest first, with the sender. See Secure the server.
Related
- Troubleshoot
- Tune capacity and limits
- How runs work
- REST streams
- Configuration reference: the tracker, streaming, results and log retention settings