With @vzn/vx-otel, each task sends its span, metrics and output tail the moment it ends. Your dashboard follows the build live, for the same CPU as one send at the end.
telemetry
telemetry
A trace that arrives after the build is a report. A trace that arrives
while the build runs is a window. @vzn/vx-otel sends as it goes, so the
slow task shows up in Grafana or Honeycomb while you can still do
something about it.
flowchart LR
S[run starts] -->|log| C[(OTLP collector)]
A[task A ends] -->|span, metrics, output tail| C
B[task B ends] -->|span, metrics, output tail| C
E[run ends] -->|run span, stage spans, run metrics| C
C --> D[dashboard, live]
style D stroke:#c6f84e,stroke-width:2px
When the run starts, and when each task starts, a log record
(vx.run.start, vx.task.start) linked to the trace.
When a task ends, its span, its metrics and the tail of its output.
While a task runs, its process samples as they are taken.
When the run ends, the vx.run span, the stage spans and the run’s
metrics.
Every record names the run, the host, the commit, the repository and, on
CI, the pipeline and the pull request. A chart opens the trace, and a
span opens its output.
A task’s end only queues its records. Sends are batched: at most one per
second, one in flight at a time, each taking everything that ended
meanwhile. A refused send warns once per signal, and the build goes on.
On 60 tasks against a local collector, live export burned the same CPU as
one send at the end: 815 ms both, median of 10 runs.
To send everything at the end instead, use otel({ live: false }). Why
telemetry can never fail a build is its own story:
Observability that cannot break a run.
The full attribute list is in the
vx-otel README.
vx prune --production leaves out the workspace packages only dev dependencies pull in, and strikes them from the copied manifests and lockfile, so the image that runs your app installs frozen without them.
vx run picks the project you stand in. Off a terminal it never waits on a picker. On GitHub Actions every task folds into its own log group. Plus colors that respect FORCE_COLOR=0, and a build edge for packages that ship as source.
vx prune copies one project and the workspace packages it needs into a clean folder, with the lockfile cut to match. Your Docker build installs only what it ships, and a change in another app no longer busts the install layer.
Turborepo, Nx and other product names are trademarks of their owners. vx is not affiliated with or endorsed by them.