Open the console
The engine has been running since Chapter 1. Start the console, a browser UI for inspecting it:iii-http into link and
back:

iii project init added the iii-observability worker to config.yaml, and from then on every
request gets a trace and every Logger line is collected automatically, across workers. That is the
point worth pausing on: in iii, end-to-end observability is a property of the system, not a
per-service add-on.
iii-observability emits OpenTelemetry. Its traces, metrics, and logs are emitted as OTel, so
you aren’t locked into the console. Point the worker at Honeycomb, Grafana, Datadog, or any other
OTel-compatible backend and your iii traces flow straight in. See the worker’s configuration on
workers.iii.dev/workers/iii-observability.
Use the console
The common path. Watch logs and traces in the console and continue to Chapter 3.
Go deeper
Read on to pull the same logs and traces from the engine with
iii trigger.Log the resolve
link::create already logs. Add a matching line to link::resolve so every lookup is recorded.
Edit link/src/index.ts:
src/index.ts
Read the logs
The
jq pipe filters the response down to the link resolved entries and keeps the parts that
matter for this tutorial, try removing it to see all the information the iii engine can provide.log.data is exactly what you passed to logger.info. The trace_id ties the log to the trace it
came from, which is where you look next.
Follow a redirect across workers
Every request is also a trace. Grab the most recent redirect:trace_id from the result and walk the whole request as a tree:
The
jq pipe walks the nested roots tree, indenting each span by depth and printing its
service_name and duration in milliseconds. You get the full path of one redirect, across two
workers:iii-http, calling http::redirect in link, which calls
link::resolve back through the engine. The per-span timing shows where the request spends its
time: the view you reach for when a link feels slow.
Worker spans export on a short delay, so a brand-new request’s trace can look truncated for a
second or two. Give it a moment, or read a slightly older trace.
Find the slowest links
To compare many requests, list the redirect spans sorted by duration, slowest first:trace_id with engine::traces::tree to see
which hop is responsible.
Conclusion
Linkly is now observable: the console shows every worker, trace, and log as it happens, and you can read the same data from the engine withiii trigger. The links are still kept only in memory,
though, so restarting the engine clears them. Next, in
Ch. 3: Persist everything, you move them into durable storage.