Osy#the first language built for agents
Agents firstAgentic appsWorkflowsDurable Execution — built inSecurityTestingThe editorThe UI modelOne program

Reference / Local

Seeing what a page cost

Ctrl+Shift+D → Net · window.__osy.net

Every call your app makes to the local platform reports how many database round trips answered it, beside how long it took. A duration alone cannot tell one query from nineteen, and that difference is usually the thing to fix.

stablelocaldiagnosticsperformance

Summary#

The dev panel's Net tab shows, for every call your app made: how long it took and what the server did to answer it — the database round trips, the statements they carried, and how much of the time was spent waiting on SQL.

A millisecond number on its own cannot tell you whether 340ms was one query or nineteen, and that is usually the question worth asking. The count makes it visible without having to suspect it first.

Signature#

Ctrl+Shift+D  →  Net           the panel, on any page served by the local platform
window.__osy.net                the same rows as data, for a script or an agent

Each row reads:

GET   200   /api/data/Contact       41ms   19rt/27q   23ms sql   9f3c…
                                    └ wall  └ round     └ of which  └ correlation id
                                      clock   trips       waiting
                                              /statements on SQL

Description#

19rt is the number: NETWORK ROUND TRIPS. Not statements, and the two are not the same count — the platform pipelines, so a batch of forty statements is one trip. The row shows the statements alongside whenever they differ (1rt/40q), because that gap is the batching and 1rt on its own reads better than it deserves.

Do not call either of them "queries". Round trips are what latency is made of and what this page is about; the statement count is a different question, and a read-in-a-loop that got batched hides in the first and shows in the second.

23ms sql tells you which of two problems you have. Close to the row's total: the time is round-trip latency, and the fix is fewer, bigger queries. Far below it: the time went somewhere else — CPU, or waiting on something that is not the database — and the query count is not your bug however large it looks.

A count is only meaningful against what the call was for. Nineteen queries to paint a report page is ordinary; nineteen behind a button press is usually a read inside a loop. The panel tints a high count as a nudge to look, not as a verdict.

The query shapes are deliberately not here. They are in the server log, under the correlation id on the same row:

make logs-corr ID=9f3c1a2b-…

That line carries the top shapes by frequency and by rows — the second ranking matters because one unfiltered read of a big table is a single round trip and never appears in a by-frequency list, while being most of the work. Keeping one copy of the shapes is why the panel shows the number and the log shows the detail.

Local dev host only. The X-Osy-Db header this reads is emitted only by a platform started with osy launch / osyrin dev, on the same gate as the panel itself. A deployed host sends nothing: in production a query-shape description is free information to anyone with a browser, for the benefit of nobody. On a host that does not send it the field reads as not measured, never as zero.

What it counts is the request, all of it — everything the call awaited, including work in functions it invoked. The one thing outside the number is a query issued while the response body is being written; nothing in the platform does that today (rows are materialised before they are serialised).

Examples#

Find the page that got slow, from a script:

// syntax — the dev handle is a browser global, not Osy# source.
window.__osy.net
  .filter((c) => c.db && c.db.net >= 10)
  .map((c) => `${c.method} ${c.url} — ${c.ms}ms, ${c.db.net} queries, ${c.db.sqlMs}ms sql`);

Then read the shapes behind the worst one:

make logs-corr ID=<the correlation id on that row>

See also#

Related

Seeing what happened when your code ran

Opens a finished run and shows what it did — each step named and pointed at its source line, the values that crossed…

Recording a run

Turns on step recording, so a trace carries the steps that LED to a failure and not only the failure itself. Faults are…

Running a local platform

Runs a full platform on your own machine — its own database, no account, no cloud, reachable only from your computer…