Skip to main content
Use this when you need to see what a run is doing now or did, or you run the server for others and need to know it is healthy. Prerequisites: a server and the CLI set up as in Deploy Yukta. Everything below also works with 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

This shows the run’s status and times. Add -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

You get one line per event: 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

The first command streams stored lines, then live ones. With --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

This is the server-wide event feed (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.
In the web UI, the workflow page shows the same: the graph with node states, a progress panel, a logs panel and the result.

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

With a key set, everything under /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 health,info,metrics):
Point Prometheus at /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 named yukta.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.
The sampling default is 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 final WORKFLOW line.
  • curl the metrics endpoint with your ADMIN key. You see yukta.node.executions after any run.
  • With the Prometheus endpoint on, GET /actuator/prometheus returns text lines that start with yukta_.
  • With tracing on, a trace named yukta.run appears 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 in yukta.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-ID header. 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/audit lists control commands newest first, with the sender. See Secure the server.