Skip to content

metrics: move the control plane's families to their owners and delete pplx-space-metrics - #1541

Merged
ac-pplx merged 1 commit into
ac/metrics-split-nodefrom
ac/metrics-split-control-plane
Nov 7, 2026
Merged

ac-pplx merged 1 commit into
ac/metrics-split-nodefrom
ac/metrics-split-control-plane

Conversation

@ac-pplx

@ac-pplx ac-pplx commented Nov 5, 2026 •

Copy link
Copy Markdown
Contributor

Summary

Last of three; deletes pplx-space-metrics.

  • api: sandbox::api (with client_id, requested and tests), restore, sandbox_fork, node_group_placement, runtime_upgrade and operations, plus its parts of warm_pool, admin, auth, internal_api, node_drain, node_service_readiness, reconcile and template.
  • cluster-controller: the reconcilers' families, transient_lifecycle and sandbox::reconciler.
  • Other owners: cluster-reconciler, internal-api, data-plane-server, ingress-admission, and public-api-http (response).
  • pplx-space-sandbox-metrics gains admission and publication, each recorded by two services.
  • Crate removal: the unmoved and legacy entries and the [layers.direction] baseline edge go, ALSO drops ingress-admission, and docs and skill point to the owners (plugin 0.2.52).

The node-selector source guard (scripts/source_guards/node_selector_extras_smoke.py) now skips binaries under
crates/tools/, which are never deployed (crates/tools/AGENTS.md); the workload tool reaches the sandbox node
selector through api. Deployed binaries are checked as before, and a new test covers the exemption.

Porting pplx_space_metrics paths

For open PRs that import pplx_space_metrics::… or edit crates/libs/metrics, generated from the code at this PR's head. Crate names drop the pplx_space_ prefix. Inside the owner, use crate::metrics::…; outside it, use pplx_space_<crate>::metrics::…. Short forms: CC = cluster_controller_server::metrics, IA = internal_api_server::metrics, API = api::metrics, SM = sbx_mgr::metrics, NM = node_mgr, SBX = sandbox_metrics. An item not listed moves with its row. Names, tags and values are unchanged.

Old pplx_space_metrics:: New home Elsewhere
admin CC::admin audit_persist_failed → API::admin
auth rpc_auth::metrics (decision, node_api_decision, *token_review_cache) template_lookup_compatibility → rpc_auth::template_lookup::metrics; uds_peer_* → uds_peer_auth::metrics; external_console_* → API::auth; TemplateNodeBinding, template_node_binding → IA::auth; node_api_wait_ready_policy → node_api_server::metrics::auth
byok, node_manager, node_network NM::metrics::
cluster_reconciler, leader_election, node_group_labeler, node_group_mirror, snapshot_storage_sweeper, tombstone CC::
credmgr credmgr::metrics
data_plane data_plane_server::metrics session_retention_deleted → CC::data_plane; ingress_waiter_rejected → ingress_admission::metrics
db::pool postgres_pool::metrics (with DB_POOL_ACQUIRE_TOTAL_MS_METRIC)
feature_flags, object_store, tokio_runtime ::metrics
jobs common_jobs::metrics
gateway net_gateway::metrics startup, ca_acquisition, manager_wait, after_guest_wait → SBX::gateway_readiness
gateway::readiness SBX::gateway_readiness
grpc, payload grpc_metrics, grpc_metrics::payload
internal_api IA::internal_api ingress_preparation_path → API::internal_api
node_api node_api_server::metrics::node_api
node_disk NM::metrics::node_disk sandbox_admission_* → NM::disk_admission::metrics; ssd_free_fraction, ssd_headroom_tier → node_ctl_server::metrics::node_disk
node_drain CC::node_drain local_snapshot_promotion → API::node_drain
node_service_readiness CC::node_service_readiness placement_signal_suppressed → API::node_service_readiness
node_group_placement, runtime_upgrade, sandbox_fork, sandbox::restore API::
operations API::operations dispatcher_slots → CC::operations
reconcile SM::reconcile (apply_*, drift_observed, network policy, credential pull) queue_depth, queue_dead_letter, dirty_mark, run_* → reconcile_metrics; trigger_dead_letter → cluster_trigger_queue::metrics; queued* → API::reconcile; claimed, desired_state_apply, cluster_deleted_evict, auto_lifecycle_delete_delivery → node_ctl_server::metrics::reconcile; queue_lag_seconds, queue_stale_claims, trigger_depth, trigger_fanout*, QueueLagStage → cluster_reconciler::metrics::reconcile; queue_gc_, QueueGc → CC::reconcile; sandbox_desired_state_deleted_* → IA::reconcile
response public_api_http::metrics
runtime_supervisor node_runtime_core::metrics (feature host-runtime)
sandbox::admission SBX::admission egress_profile, EgressProfileOutcome → API::egress_profile
sandbox::api (with client_limit, ClientIdTag, *request_client_id) API::sandbox::api
sandbox::api::reconciler CC::sandbox::reconciler
sandbox::publication SBX::publication
sandbox::transient_lifecycle CC::sandbox::transient_lifecycle
sandbox::vm, sandbox_eviction, snapshot, stream_presence SM::
sandbox::worker SM::sandbox::worker quarantine_entered, unary_list_budget_exceeded, AutoLifecycleDeleteAdmissionReason → sbx_mgr_store::metrics; runtime_stop_failed, leaked_cgroups, cgroups_reclaimed → NM::metrics::sandbox_worker; spaced_bridge_rpc_*, spaced_guest_ready, SpacedBridgeRpcResult → spaced_host_server::metrics; spaced_guest_readiness_wait → SBX::gateway_readiness
snapshot_retention_sweeper snapshot_retention::metrics
template template_mgr::metrics build_, TemplateBuild → build_mgr::metrics; visibility_lookup_, VisibilityLookup → IA::template; build_routing_fallback_missing_identity → API::template
test_capture metrics_emit::test_capture (dev-dependency, test-capture feature)
volume_manager volmgr::metrics
warm_pool CC::warm_pool acquire_duration, admission_claim, claim_lifecycle, create_path, reservation_duration → API::warm_pool

Validation

As #1515, at 0756e6cb: the same 41 environmental failures. cargo arch reports one new advisory, the legacy removal. The dump is identical to main's; literals.py matches exactly (215 removed, 215 added).

Severity and risk

Severity: does not apply (structural). Risk: compile-time only; roll back by reverting. External code that imports a moved path breaks. Downstream: package pplx-space-metrics and every pplx_space_metrics::… path are gone.

Stack

  1. metrics: move the Foundation, storage and shared families to their owners #1515. 2. metrics: move the node-side services' families to their owners #1540. 3. This PR, based on metrics: move the node-side services' families to their owners #1540; it deletes the crate.

AI assistance: Claude Code drafted the code, scripts and this text.

@coderabbitai

coderabbitai Bot commented Nov 5, 2026 •

Copy link
Copy Markdown

Explain Change →

Automatic approval withheld

Automatic approval is disabled by the configured approval policy for this pull request. Review comments and requests for changes continue normally.

Commit: 0756e6cb5ca9.

No actionable comments were generated in the recent review.

Walkthrough

The pull request removes pplx-space-metrics from the workspace and redirects metric definitions and call sites to service-owned modules and pplx-space-sandbox-metrics. It adds local metrics for API, controller, and reconciliation events. Existing metric arguments and surrounding control flow remain unchanged where described. Renderer discovery now excludes binaries under crates/tools/, and the plugin version changes to 0.2.52.

Possibly related PRs

Merge Risk: High · up to 0756e

The metrics migration has no confirmed functional defect, but the renderer guard now exempts tools binaries. Confirm that this narrower check is acceptable before merging.

Security architecture risk: Low · up to 0756e

The inspected changes relocate telemetry without changing admission decisions, credential verification, or operation-state rules. The validation exemption matches the documented tool-only deployment model. No security regression was identified in the examined paths, but coverage of the broad migration and production deployment assumptions remains incomplete.

Retained concerns
No architecture-level concerns identified.

Security review details

Security Blast Radius

  • inferred — The cross-service impact examined here is shared telemetry vocabulary and emission, not transferred admission or publication authority. A contract regression could affect diagnostics across multiple services, but the inspected base-to-head comparisons do not show broader tenant reachability or privileges.

Trust Boundaries and Controls

  • observed — Cluster admission policy remains API-owned. The changed decision sink receives the same decision enums and optional token value and emits counters or gauges. The shared module supplies telemetry rather than acquiring Redis, identity, or substrate-control authority.
Pre-merge checks: Passed 6

Check name Status Explanation
Title check Passed The title describes the metrics migration and crate removal. It meets the specified format.
Description Follows The Pr Template Passed The description contains all four required items: Summary, Validation, Severity and risk, and an AI assistance line.
Bug Fixes Name A Regression Test Passed The PR moves metrics to owner crates and removes the shared crate. The application changes shown update metric paths, not application defects. The source-guard change is outside the application paths …
Weakened Safeguards Are Justified Passed The guard excludes tools binaries because they are not deployed; the description and adjacent comment state this reason. The removed metrics crate explains the CI and guidance updates. Moved metric te…
Agent Tooling Runs No New Commands Passed The plugin manifests change only their versions. The skill and reference changes are prose. No executable agent configuration or inline shell substitution was added.
Public-Safe Content Passed The title, description, and diff contain no identified prohibited content. Credential references are identifiers, not credential values. The security-related comment in node_group_labeler.rs was alr…
Full details: Bug Fixes Name A Regression Test

Explanation

The PR moves metrics to owner crates and removes the shared crate. The application changes shown update metric paths, not application defects. The source-guard change is outside the application paths covered by this check.

Full details: Weakened Safeguards Are Justified

Explanation

The guard excludes tools binaries because they are not deployed; the description and adjacent comment state this reason. The removed metrics crate explains the CI and guidance updates. Moved metric tests remain enabled in their new owners.

Full details: Public-Safe Content

Explanation

The title, description, and diff contain no identified prohibited content. Credential references are identifiers, not credential values. The security-related comment in node_group_labeler.rs was already present in the base revision.

Recent review info

Automatic approval policy

Commit: 0756e6cb5ca9.

Setting Effective value Source
Automatic approvals Disabled Override 3
Merge risk Moderate Global configuration
Security risk Not set Global configuration

Matching overrides (numbered as in the resolved configuration):

  • Override 3 — any author; paths: .coderabbit.yaml, .coderabbit.yml, coderabbit.yaml, coderabbit.yml, .coderabbit.config.ts, .claude/settings*.json, **/.mcp.json, **/hooks.json, .agents/plugins/**/hooks/**, .agents/plugins/**/scripts/**, .agents/plugins/**/commands/**, .agents/plugins/**/agents/**, **/skills/**/hooks/**, **/skills/**/scripts/**, **/skills/**/commands/**, **/skills/**/agents/**, .claude/commands/**, .claude/agents/**, **/marketplace.json, .github/**, ci/**, !ci/scripts/setup-nextest-*.sh, scripts/source_guards/**, scripts/check*, clippy.toml, deny.toml, .gitleaks.toml, .pre-commit-config.yaml, lefthook.yaml, rust-toolchain.toml, .cargo/**, supply-chain/**, pyproject.toml, uv.lock, **/package.json, **/package-lock.json, **/go.mod, **/go.sum, **/requirements*.txt, **/requirements*.in, proto/**, db/**, docs/versioning.md, crates/l40_api/api/src/auth.rs, crates/l40_api/api/src/auth/**, crates/l40_api/api/src/middleware/auth*, crates/l40_api/api/src/middleware/auth/**, crates/l40_api/api/src/routes/authz.rs, crates/l10_foundation/bearer/**, crates/l10_foundation/rustls/**, crates/l10_foundation/guest/**, crates/l10_foundation/pii/**, shim/**, docker/**, !docker/Dockerfile.rust-build-kind, templates/**, infra/space/aws/**, infra/space/cluster/**, infra/space/identity/**, infra/space/observability/**, infra/space/packer/**, infra/space/kind/charts/**, LICENSE, SECURITY.md; automatic approvals: disabled.

Any matching disabled override withholds approval, regardless of risk. Otherwise, the strictest explicitly set limit wins for each score. Limits omitted by all matching overrides inherit the global configuration.

Not set means no limit was configured after inheritance. Use @coderabbitai configuration to inspect the resolved settings and their sources.

Run configuration

Commits

Reviewing files that changed from the base of the PR and between 7b1a714 and 0756e6c.

Files ignored due to path filters: 1

  • Cargo.lock is excluded by !**/*.lock, !**/Cargo.lock
Files selected for processing: 227

  • .agents/plugins/pplx-space/.claude-plugin/plugin.json
  • .agents/plugins/pplx-space/.codex-plugin/plugin.json
  • .agents/plugins/pplx-space/plugin.yaml
  • .agents/plugins/pplx-space/skills/space-observability/SKILL.md
  • .agents/plugins/pplx-space/skills/space-validation/references/ci-pipeline.md
  • ARCHITECTURE.toml
  • Cargo.toml
  • architecture-baseline.toml
  • ci/scripts/lib/rust-isolated-crates.sh
  • crates/l10_foundation/grpc/metrics/src/lib.rs
  • crates/l10_foundation/metrics/emit/src/lib.rs
  • crates/l30_storage/sandbox/portability/src/lib.rs
  • crates/l40_api/api/Cargo.toml
  • crates/l40_api/api/src/client_classification.rs
  • crates/l40_api/api/src/client_concurrency/mod.rs
  • crates/l40_api/api/src/cluster_admission/mod.rs
  • crates/l40_api/api/src/controllers/sandbox/ingress.rs
  • crates/l40_api/api/src/controllers/sandbox/lifecycle.rs
  • crates/l40_api/api/src/controllers/sandbox/lifecycle/characterization_tests.rs
  • crates/l40_api/api/src/controllers/sandbox/lifecycle/kubernetes_suspend_tests.rs
  • crates/l40_api/api/src/controllers/sandbox/lifecycle/tests.rs
  • crates/l40_api/api/src/controllers/sandbox/lifecycle/wake_completion_postgres_tests.rs
  • crates/l40_api/api/src/controllers/sandbox/mod.rs
  • crates/l40_api/api/src/controllers/sandbox/queries.rs
  • crates/l40_api/api/src/controllers/sandbox/requested_size_metrics.rs
  • crates/l40_api/api/src/controllers/sandbox/updates.rs
  • crates/l40_api/api/src/controllers/sandbox/updates/postgres_tests/kubernetes.rs
  • crates/l40_api/api/src/controllers/sandbox/wake_completion.rs
  • crates/l40_api/api/src/controllers/substrate/direct.rs
  • crates/l40_api/api/src/controllers/substrate/direct/tests.rs
  • crates/l40_api/api/src/controllers/substrate/direct/tests/idle_suspended.rs
  • crates/l40_api/api/src/controllers/substrate/kubernetes/adapter/substrate_adapter.rs
  • crates/l40_api/api/src/controllers/substrate/kubernetes/adapter_characterization_tests.rs
  • crates/l40_api/api/src/controllers/substrate/kubernetes/execution.rs
  • crates/l40_api/api/src/controllers/substrate/kubernetes/mod.rs
  • crates/l40_api/api/src/controllers/substrate/kubernetes/per_sandbox_setup/tests.rs
  • crates/l40_api/api/src/controllers/substrate/kubernetes/pod_ops/delete.rs
  • crates/l40_api/api/src/controllers/substrate/kubernetes/pod_ops/ensure_pod.rs
  • crates/l40_api/api/src/controllers/substrate/kubernetes/pod_ops/read.rs
  • crates/l40_api/api/src/controllers/substrate/kubernetes/pod_ops/redrive.rs
  • crates/l40_api/api/src/controllers/substrate/kubernetes/pod_ops/tests.rs
  • crates/l40_api/api/src/controllers/substrate/kubernetes/pool/tests.rs
  • crates/l40_api/api/src/controllers/substrate/kubernetes/runtime_upgrade.rs
  • crates/l40_api/api/src/controllers/substrate/kubernetes/store.rs
  • crates/l40_api/api/src/controllers/substrate/kubernetes/store/activation_fence.rs
  • crates/l40_api/api/src/controllers/substrate/kubernetes/store/started_recovery.rs
  • crates/l40_api/api/src/controllers/substrate/kubernetes/support.rs
  • crates/l40_api/api/src/controllers/substrate/kubernetes/tests.rs
  • crates/l40_api/api/src/controllers/substrate/kubernetes/tests/runtime_upgrade_dispatch.rs
  • crates/l40_api/api/src/controllers/substrate/kubernetes/wait_ready.rs
  • crates/l40_api/api/src/controllers/substrate/mod.rs
  • crates/l40_api/api/src/controllers/template.rs
  • crates/l40_api/api/src/e2b.rs
  • crates/l40_api/api/src/e2b/tests.rs
  • crates/l40_api/api/src/external_console.rs
  • crates/l40_api/api/src/fork_operation_executor.rs
  • crates/l40_api/api/src/fork_operation_executor/tests.rs
  • crates/l40_api/api/src/inline_operations.rs
  • crates/l40_api/api/src/metrics/admin.rs
  • crates/l40_api/api/src/metrics/auth.rs
  • crates/l40_api/api/src/metrics/internal_api.rs
  • crates/l40_api/api/src/metrics/mod.rs
  • crates/l40_api/api/src/metrics/node_drain.rs
  • crates/l40_api/api/src/metrics/node_group_placement.rs
  • crates/l40_api/api/src/metrics/node_service_readiness.rs
  • crates/l40_api/api/src/metrics/operations.rs
  • crates/l40_api/api/src/metrics/reconcile.rs
  • crates/l40_api/api/src/metrics/runtime_upgrade.rs
  • crates/l40_api/api/src/metrics/sandbox.rs
  • crates/l40_api/api/src/metrics/sandbox/api.rs
  • crates/l40_api/api/src/metrics/sandbox/api/client_id.rs
  • crates/l40_api/api/src/metrics/sandbox/api/tests.rs
  • crates/l40_api/api/src/metrics/sandbox/restore.rs
  • crates/l40_api/api/src/metrics/sandbox_fork.rs
  • crates/l40_api/api/src/metrics/template.rs
  • crates/l40_api/api/src/metrics/warm_pool.rs
  • crates/l40_api/api/src/node_group_placement.rs
  • crates/l40_api/api/src/public_operation_driver.rs
  • crates/l40_api/api/src/public_operations.rs
  • crates/l40_api/api/src/public_operations/sandbox_quota.rs
  • crates/l40_api/api/src/public_sandbox_operations.rs
  • crates/l40_api/api/src/public_sessions.rs
  • crates/l40_api/api/src/reconcile_queue.rs
  • crates/l40_api/api/src/retry_deferral.rs
  • crates/l40_api/api/src/routes/admin/mod.rs
  • crates/l40_api/api/src/routes/admin/nodes.rs
  • crates/l40_api/api/src/routes/e2b/fork.rs
  • crates/l40_api/api/src/routes/e2b/lifecycle.rs
  • crates/l40_api/api/src/routes/e2b/mod.rs
  • crates/l40_api/api/src/routes/e2b/router.rs
  • crates/l40_api/api/src/routes/e2b/tests.rs
  • crates/l40_api/api/src/routes/e2b/translate.rs
  • crates/l40_api/api/src/routes/metrics.rs
  • crates/l40_api/api/src/routes/metrics/tests.rs
  • crates/l40_api/api/src/routes/mod.rs
  • crates/l40_api/api/src/routes/public/error/tests.rs
  • crates/l40_api/api/src/routes/public/files.rs
  • crates/l40_api/api/src/routes/public/files/access.rs
  • crates/l40_api/api/src/routes/public/ports.rs
  • crates/l40_api/api/src/routes/public/processes.rs
  • crates/l40_api/api/src/routes/public/sandboxes.rs
  • crates/l40_api/api/src/routes/public/sandboxes/tests.rs
  • crates/l40_api/api/src/routes/public/sessions.rs
  • crates/l40_api/api/src/routes/public/tests.rs
  • crates/l40_api/api/src/routes/session_auth.rs
  • crates/l40_api/api/src/run.rs
  • crates/l40_api/cluster/controller/server/Cargo.toml
  • crates/l40_api/cluster/controller/server/src/admin_audit_retention.rs
  • crates/l40_api/cluster/controller/server/src/data_plane_session_retention.rs
  • crates/l40_api/cluster/controller/server/src/drained_node_terminator/mod.rs
  • crates/l40_api/cluster/controller/server/src/failed_restorable_repair/mod.rs
  • crates/l40_api/cluster/controller/server/src/leader_election/mod.rs
  • crates/l40_api/cluster/controller/server/src/lib.rs
  • crates/l40_api/cluster/controller/server/src/lost_started_sandboxes/mod.rs
  • crates/l40_api/cluster/controller/server/src/metrics/admin.rs
  • crates/l40_api/cluster/controller/server/src/metrics/cluster_reconciler.rs
  • crates/l40_api/cluster/controller/server/src/metrics/data_plane.rs
  • crates/l40_api/cluster/controller/server/src/metrics/leader_election.rs
  • crates/l40_api/cluster/controller/server/src/metrics/mod.rs
  • crates/l40_api/cluster/controller/server/src/metrics/node_drain.rs
  • crates/l40_api/cluster/controller/server/src/metrics/node_group_labeler.rs
  • crates/l40_api/cluster/controller/server/src/metrics/node_group_mirror.rs
  • crates/l40_api/cluster/controller/server/src/metrics/node_service_readiness.rs
  • crates/l40_api/cluster/controller/server/src/metrics/operations.rs
  • crates/l40_api/cluster/controller/server/src/metrics/reconcile.rs
  • crates/l40_api/cluster/controller/server/src/metrics/sandbox.rs
  • crates/l40_api/cluster/controller/server/src/metrics/sandbox/reconciler.rs
  • crates/l40_api/cluster/controller/server/src/metrics/sandbox/transient_lifecycle.rs
  • crates/l40_api/cluster/controller/server/src/metrics/sandbox/transient_lifecycle/tests.rs
  • crates/l40_api/cluster/controller/server/src/metrics/snapshot_storage_sweeper.rs
  • crates/l40_api/cluster/controller/server/src/metrics/tombstone.rs
  • crates/l40_api/cluster/controller/server/src/metrics/warm_pool.rs
  • crates/l40_api/cluster/controller/server/src/node_drain/mod.rs
  • crates/l40_api/cluster/controller/server/src/node_drain/store.rs
  • crates/l40_api/cluster/controller/server/src/node_group_labeler/mod.rs
  • crates/l40_api/cluster/controller/server/src/node_group_mirror.rs
  • crates/l40_api/cluster/controller/server/src/node_service_readiness/mod.rs
  • crates/l40_api/cluster/controller/server/src/orphaned_restore_pod_gc/reconciler.rs
  • crates/l40_api/cluster/controller/server/src/orphaned_sandboxes.rs
  • crates/l40_api/cluster/controller/server/src/public_operation_dispatcher.rs
  • crates/l40_api/cluster/controller/server/src/reconcile_queue_gc/detector.rs
  • crates/l40_api/cluster/controller/server/src/reconcile_queue_gc/mod.rs
  • crates/l40_api/cluster/controller/server/src/reconcile_queue_gc/store.rs
  • crates/l40_api/cluster/controller/server/src/snapshot_storage_sweeper/mod.rs
  • crates/l40_api/cluster/controller/server/src/stuck_container_creating_gc/reconciler.rs
  • crates/l40_api/cluster/controller/server/src/stuck_snapshot_reaper/mod.rs
  • crates/l40_api/cluster/controller/server/src/suspended_execution_reaper/mod.rs
  • crates/l40_api/cluster/controller/server/src/tombstone_retention.rs
  • crates/l40_api/cluster/controller/server/src/transient_lifecycle_census.rs
  • crates/l40_api/cluster/controller/server/src/transient_lifecycle_census/tests.rs
  • crates/l40_api/cluster/controller/server/src/transient_lifecycle_sweeper/mod.rs
  • crates/l40_api/cluster/controller/server/src/transient_lifecycle_sweeper/store.rs
  • crates/l40_api/cluster/controller/server/src/warm_pool.rs
  • crates/l40_api/cluster/controller/server/src/warm_pool_orphan_sweep.rs
  • crates/l40_api/cluster/reconciler/Cargo.toml
  • crates/l40_api/cluster/reconciler/src/metrics.rs
  • crates/l40_api/cluster/reconciler/src/metrics/reconcile.rs
  • crates/l40_api/cluster/reconciler/src/trigger_fanout.rs
  • crates/l40_api/data/plane/server/Cargo.toml
  • crates/l40_api/data/plane/server/src/drain.rs
  • crates/l40_api/data/plane/server/src/ecw_files.rs
  • crates/l40_api/data/plane/server/src/ecw_files/admission_tests.rs
  • crates/l40_api/data/plane/server/src/ecw_process.rs
  • crates/l40_api/data/plane/server/src/ecw_process/stream.rs
  • crates/l40_api/data/plane/server/src/http_traffic.rs
  • crates/l40_api/data/plane/server/src/lib.rs
  • crates/l40_api/data/plane/server/src/metrics.rs
  • crates/l40_api/data/plane/server/src/native.rs
  • crates/l40_api/data/plane/server/src/native/auth.rs
  • crates/l40_api/data/plane/server/src/native/protocol.rs
  • crates/l40_api/data/plane/server/src/native/proxy.rs
  • crates/l40_api/data/plane/server/src/native/sse.rs
  • crates/l40_api/data/plane/server/src/native/streams.rs
  • crates/l40_api/data/plane/server/src/native/websocket.rs
  • crates/l40_api/data/plane/server/src/native_files.rs
  • crates/l40_api/data/plane/server/src/native_files/write.rs
  • crates/l40_api/data/plane/server/src/runtime_route.rs
  • crates/l40_api/data/plane/server/src/state.rs
  • crates/l40_api/data/plane/server/src/upload_admission.rs
  • crates/l40_api/data/plane/server/src/upload_admission/body.rs
  • crates/l40_api/data/plane/server/src/upload_admission/shares.rs
  • crates/l40_api/ingress/admission/Cargo.toml
  • crates/l40_api/ingress/admission/src/lib.rs
  • crates/l40_api/ingress/admission/src/metrics.rs
  • crates/l40_api/internal/api/server/Cargo.toml
  • crates/l40_api/internal/api/server/src/adapter.rs
  • crates/l40_api/internal/api/server/src/auto_lifecycle_delete_completions.rs
  • crates/l40_api/internal/api/server/src/data_plane_sessions.rs
  • crates/l40_api/internal/api/server/src/data_plane_sessions/ecw_authorization.rs
  • crates/l40_api/internal/api/server/src/environment_observation.rs
  • crates/l40_api/internal/api/server/src/lib.rs
  • crates/l40_api/internal/api/server/src/metadata.rs
  • crates/l40_api/internal/api/server/src/metrics/auth.rs
  • crates/l40_api/internal/api/server/src/metrics/internal_api.rs
  • crates/l40_api/internal/api/server/src/metrics/mod.rs
  • crates/l40_api/internal/api/server/src/metrics/reconcile.rs
  • crates/l40_api/internal/api/server/src/metrics/template.rs
  • crates/l40_api/internal/api/server/src/node_local_backup_pending.rs
  • crates/l40_api/internal/api/server/src/publish.rs
  • crates/l40_api/internal/api/server/src/published_state.rs
  • crates/l40_api/internal/api/server/src/sandbox_quarantine_store.rs
  • crates/l40_api/internal/api/server/src/visibility_observations.rs
  • crates/l40_api/native/files/Cargo.toml
  • crates/l40_api/native/files/src/public_error.rs
  • crates/l40_api/public/api/http/Cargo.toml
  • crates/l40_api/public/api/http/src/error.rs
  • crates/l40_api/public/api/http/src/lib.rs
  • crates/l40_api/public/api/http/src/metrics.rs
  • crates/l40_api/sandbox/metrics/src/admission.rs
  • crates/l40_api/sandbox/metrics/src/lib.rs
  • crates/l40_api/sandbox/metrics/src/publication.rs
  • crates/l40_api/sbx/mgr/server/Cargo.toml
  • crates/l40_api/sbx/mgr/server/src/service/auth_lookup.rs
  • crates/l40_api/sbx/mgr/server/src/service/create.rs
  • crates/l40_api/sbx/mgr/server/src/service/grpc_state_snapshot.rs
  • crates/l40_api/sbx/mgr/server/src/service/start.rs
  • crates/l40_api/sbx/mgr/server/src/service/start_support.rs
  • crates/l50_app/admin/cli/README.md
  • crates/libs/metrics/Cargo.toml
  • crates/libs/metrics/src/auth.rs
  • crates/libs/metrics/src/emit.rs
  • crates/libs/metrics/src/lib.rs
  • crates/tools/metrics/workload/Cargo.toml
  • crates/tools/metrics/workload/src/main.rs
  • scripts/move_crates.toml
  • scripts/source_guards/node_selector_extras_smoke.py
  • scripts/tests/test_node_selector_extras_smoke.py
Files with no reviewable changes: 10

  • Cargo.toml
  • crates/l40_api/api/src/metrics/sandbox/api/client_id.rs
  • architecture-baseline.toml
  • crates/l40_api/native/files/Cargo.toml
  • scripts/move_crates.toml
  • crates/libs/metrics/src/lib.rs
  • crates/libs/metrics/Cargo.toml
  • crates/libs/metrics/src/auth.rs
  • crates/libs/metrics/src/emit.rs
  • crates/l40_api/sbx/mgr/server/Cargo.toml
Files skipped from review as they are similar to previous changes: 10

  • crates/l10_foundation/metrics/emit/src/lib.rs
  • crates/l40_api/api/src/public_sandbox_operations.rs
  • crates/l10_foundation/grpc/metrics/src/lib.rs
  • crates/l30_storage/sandbox/portability/src/lib.rs
  • crates/l40_api/api/src/controllers/sandbox/lifecycle/characterization_tests.rs
  • .agents/plugins/pplx-space/skills/space-validation/references/ci-pipeline.md
  • .agents/plugins/pplx-space/skills/space-observability/SKILL.md
  • crates/l50_app/admin/cli/README.md
  • crates/l40_api/api/src/routes/public/files/access.rs
  • crates/l40_api/api/src/controllers/substrate/kubernetes/tests.rs

Included review availability: This review used your included allowance. Your plan provides up to 12 included reviews per hour; 6 remain after this review.

@github-actions github-actions Bot added the triage:pending Waiting for a maintainer to triage label Nov 5, 2026
@github-actions

github-actions Bot commented Nov 5, 2026

Copy link
Copy Markdown

Thanks for opening this pull request! A SPACE maintainer will take a look.

CONTRIBUTING.md explains how we review outside contributions.

@ac-pplx
ac-pplx force-pushed the ac/metrics-split-control-plane branch 2 times, most recently from 8ae0571 to 9082874 Compare November 5, 2026 20:43
@ac-pplx
ac-pplx marked this pull request as ready for review November 5, 2026 21:31
@ac-pplx
ac-pplx force-pushed the ac/metrics-split-control-plane branch from 9082874 to 8bef226 Compare November 5, 2026 21:48
@ac-pplx
ac-pplx added this pull request to stack #1609 November 6, 2026 03:38
@ac-pplx
ac-pplx force-pushed the ac/metrics-split-control-plane branch from 8bef226 to 1a49f72 Compare November 6, 2026 04:22

@johnlouie-pplx johnlouie-pplx left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approving. The metric definitions and callers preserve the same measurements, including names, labels, units and request-scoped client IDs. The shared contracts reuse existing packages, and the moved metric tests passed in CI.

@ac-pplx
ac-pplx force-pushed the ac/metrics-split-control-plane branch from 1a49f72 to c7ce0cb Compare November 6, 2026 20:02
@ac-pplx
ac-pplx force-pushed the ac/metrics-split-control-plane branch from c7ce0cb to 7b1a714 Compare November 6, 2026 20:50
… pplx-space-metrics

Last of three changes that split pplx-space-metrics. The families the
control plane records move, unchanged, into a `metrics` module of the crate
that records them, and the crate is deleted:

- api: `sandbox::api` (with `client_id`, `requested` and their tests),
  `sandbox::restore`, `sandbox_fork`, `node_group_placement`,
  `runtime_upgrade`, `operations` and the API server's parts of
  `warm_pool`, `admin`, `auth`, `internal_api`, `node_drain`,
  `node_service_readiness`, `reconcile` and `template`. The two families the
  cluster controller records as well, `operations::completed` and
  `node_drain::local_snapshot_promotion`, stay here; the controller already
  depends on the API crate.
- cluster-controller-server: `cluster_reconciler`, `leader_election`,
  `node_drain`, `node_group_labeler`, `node_group_mirror`,
  `node_service_readiness`, `snapshot_storage_sweeper`, `tombstone`, the
  warm-pool reconciler's `warm_pool`, `sandbox::transient_lifecycle`, the
  orphaned-sandbox reconciler's `sandbox::reconciler`, the audit and session
  retention counters, the dispatcher's slots and the reconcile queue GC.
- cluster-reconciler (queue lag, stale claims and trigger fan-out),
  internal-api-server (`internal_api`, template visibility lookups, template
  node binding, desired-state deletion reports), data-plane-server
  (`data_plane`), ingress-admission (the waiter rejection counter) and
  public-api-http (`response`, which the API server, data-plane-server and
  native-files use from there).
- pplx-space-sandbox-metrics gains `admission`, which the API server and
  sbx-mgr both record, and `publication`, which internal-api and sbx-mgr both
  record.

The `metrics_workload` validation workload now calls the API crate's and
pplx-space-sandbox-metrics's helpers. With the crate gone, ARCHITECTURE.toml
drops its `unmoved` and `legacy` entries and architecture-baseline.toml its
`[layers.direction]` edge to pplx-space-common-core; the isolated-crates
lint's `ALSO` list drops pplx-space-ingress-admission, which reached
common-core only through it; and the docs, skills and comments that named it
point to the owners. The external console password-session families and the
provisioning-recipe family, added to pplx-space-metrics since, move with
their recorders to the API crate's `metrics::auth` and internal-api's
`metrics::internal_api`.
The node-selector smoke guard skips binaries in the tools layer, which are
never deployed, so the workload's new dependency on the API crate does not
make it a renderer; deployed binaries stay covered.

Metric names, tag keys, kinds and vocabulary values are unchanged: the dump
of every emit site (with its enclosing function) and vocabulary arm is
identical to main's, and the string literals on the removed and added lines
of the Rust diff match.
@ac-pplx
ac-pplx force-pushed the ac/metrics-split-control-plane branch from 7b1a714 to 0756e6c Compare November 6, 2026 23:09
@ac-pplx

ac-pplx commented Nov 6, 2026

Copy link
Copy Markdown
Contributor Author

@johnlouie-pplx The stack is rebased onto main 8d62086. You approved #1515 at its previous head, and that approval covers the re-home commit. Since your last approval of this PR, these changes go beyond conflict resolution:

At 0756e6cb: the dump of names, tag keys and tag values is identical to main's (3,141 lines). literals.py matches exactly (215 removed, 215 added). tests-unprivileged shows the same 41 environmental failures as main, and cargo arch reports one new advisory, the legacy removal.

@ac-pplx
ac-pplx added this pull request to the merge queue Nov 7, 2026
@ac-pplx

ac-pplx commented Nov 7, 2026

Copy link
Copy Markdown
Contributor Author

@johnlouie-pplx We enqueued the stack on your approvals of #1515 (at 3929a41) and of this PR at its earlier head, without waiting for your re-look on the changes listed above. They are the same kind of move you approved: families main added since are re-homed, plus the #1665 import port and the isolated-crates list. CI is green at all three heads, and the stack merged onto current main leaves no reference to pplx-space-metrics. If anything in that list looks wrong to you, we'll fix it in a follow-up PR.

Merged via the queue into main with commit b2643ce Nov 7, 2026
48 of 68 checks passed
@ac-pplx
ac-pplx deleted the ac/metrics-split-control-plane branch November 7, 2026 04:24
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

triage:pending Waiting for a maintainer to triage

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants