Skip to content

feat(observability): show runs' pods and nodes and serve their logs - #392

Merged
ShubyM merged 4 commits into
openrl-dev:mainfrom
ShubyM:observability/cluster-view-and-logs
Oct 30, 2026
Merged

ShubyM merged 4 commits into
openrl-dev:mainfrom
ShubyM:observability/cluster-view-and-logs

Conversation

@ShubyM

@ShubyM ShubyM commented Oct 29, 2026 •

Copy link
Copy Markdown
Collaborator

Why

Phase 3 of #390. Runs now show where they ran, and their logs can be read without going to the log store by hand.

What changed

  • server.dashboard is renamed to server.observability (first commit, move only).
  • /api/v1/inspect/inventory adds each run's pods, nodes and lifecycle, and a cluster section with nodes, GPU counts and problem pods.
  • /api/v1/inspect/logs?run_id=<id> pages a run's logs from your log store. Add pod=client for the client's logs.

What you configure

To get Do this
Worker logs Set OPEN_RL_LOG_STORE=cloud-logging on the API server. On GKE, worker logs already go to Cloud Logging. Grant the API server roles/logging.viewer (see the GKE setup docs).
A specific log bucket Use OPEN_RL_LOG_STORE=cloud-logging:<log view>. It sees client logs only if that bucket's sink routes them in.
Client logs Set the session tag openrl.client_log_id=<id>, and ship the client's logs to the same store labelled openrl_client=<id>. For a client pod, that is a pod label.

Without OPEN_RL_LOG_STORE, log reads are off. Cloud Logging is the only store today. Others such as Loki plug in as adapters.

Verification

  • make test and make lint pass.
  • Against the cluster, all 32 runs match the existing dashboard on lifecycle, pods and nodes, and /logs returns every record the existing dashboard returns.
  • Client logs came back from a labelled client pod and from lines written straight to Cloud Logging from outside Kubernetes.

The inspection API serves agents and the CLI as well as a dashboard, so the
package is named for what it does. This moves the package and its two test
modules and updates the import and the Makefile test lists. Nothing else
changes.
The inventory now joins each run with its pods, nodes and Workloads from
Kubernetes, gives it a lifecycle of ended, failed, waiting, placed or active,
and reports the cluster's nodes and problem pods. /api/v1/inspect/logs pages a
run's worker logs from Cloud Logging, reading only pods with the run's owner
label, and with pod=client reads the client's logs.log from the shared volume.
…a declared path

Worker logs are off until OPEN_RL_LOG_STORE names a store. cloud-logging is the
only store today. It sits in a small registry, so another store such as Loki
can be added later without a route change. The GKE metadata server no longer
turns log reads on. OPEN_RL_GKE_TELEMETRY is gone.

A run's worker pods are now found by name. The scheduler names a worker pod
orw-<Workload>, and a run's Workloads start with <kind>-<owner>-. The store
reads the worker namespace's pods with that prefix instead of the
timeslice.io/owner label.

The server no longer scans the shared volume for client directories. A client
declares its files with the openrl.log_path setting, which is stored on the
model. pod=client reads <log_path>/logs.log only when its resolved path is
under OPEN_RL_CLIENT_LOG_ROOTS. OPEN_RL_CLIENT_RUNS_ROOT is gone.
OPEN_RL_LOG_STORE is now the one log setting. cloud-logging reads the
project that the Google credentials name. cloud-logging:<resource> reads
that Cloud Logging resource instead, such as a log bucket view.
OPEN_RL_LOG_VIEWS, OPEN_RL_GKE_PROJECT, _CLUSTER and _LOCATION and the
metadata server lookup are gone. The worker filter keeps the namespace and
the anchored pod name prefix. It no longer pins the project, cluster and
location, because owner ids are unique.

Client logs now come from the same store. A client sets the session tag
openrl.client_log_id=<id>, which is stored on the model. Its log lines
carry the label openrl_client=<id>. For a client pod that is a pod label,
which GKE copies to k8s-pod/openrl_client. pod=client reads the lines with
either label. openrl.log_path, OPEN_RL_CLIENT_LOG_ROOTS and the file reader
are gone.

A store now takes a selector: a namespace's worker pods by name prefix, or
a client id.
@ShubyM
ShubyM force-pushed the observability/cluster-view-and-logs branch from a19d84e to 6d10bbd Compare October 29, 2026 22:32
@ShubyM
ShubyM merged commit 4c021fd into openrl-dev:main Oct 30, 2026
16 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants