mirror of
https://github.com/NVIDIA/OpenShell.git
synced 2026-10-27 07:03:17 +08:00
Continue distributed traces across the gateway-to-driver process boundary and export VM driver spans to the same OTLP/gRPC collector. The driver reports as the distinct openshell-driver-vm service. Updated the gateway architecture and configuration reference with a generic external-driver forwarding contract. Instrumented: - Every RemoteComputeDriver RPC injects the active W3C trace context into tonic metadata. Managed VM readiness and runtime initialization give startup capability probes stable parent operations rather than isolated root spans. - A tonic service layer creates fixed, low-cardinality server spans for every ComputeDriver RPC. New handlers inherit tracing automatically; failures record OpenTelemetry error status and the gRPC status code. - Background provisioning remains attached to CreateSandbox after the RPC returns without extending the RPC span lifetime. - Provisioning records image preparation, bootstrap image resolution, overlay preparation, lifecycle configuration, pre-launch hooks, guest preparation, and launcher spawn as child spans. - VM startup reconciliation roots one trace for the persisted-sandbox scan, with per-sandbox restore and provision operations beneath it. The root remains open until all spawned restore tasks finish. - Delete cleanup records its own child operation. Design notes: - The gateway forwards its configured OTLP endpoint to managed external drivers. SDK `OTEL_*` variables continue to own sampling, batching, limits, headers, and transport tuning. - The VM driver has its own tracer provider and service resource so trace backends preserve the service boundary. - RPC operation names come from an explicit method mapping, keeping cardinality bounded without parsing the protobuf descriptor set at runtime. - Propagation uses a remote SpanContext for spawned provisioning. This keeps one trace while allowing the CreateSandbox server span to finish when the RPC response is sent. - Startup restoration is independent of gateway requests. It begins at the VM driver reconciliation span rather than attaching to an unrelated RPC. - Existing tracing events remain on the logging path. The OpenTelemetry layer exports spans only and excludes the SDK exporter callsites to avoid recursive traces. - Export configuration failures do not prevent the driver from serving, and buffered spans are drained during graceful shutdown. - Trace fields identify drivers, sandboxes, images, lifecycle phases, and gRPC outcomes without recording credentials, sandbox tokens, or request query parameters. Refs #2507 Signed-off-by: Kris Hicks <khicks@nvidia.com>
79 lines
2.5 KiB
TOML
79 lines
2.5 KiB
TOML
# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
|
# SPDX-License-Identifier: Apache-2.0
|
|
|
|
[package]
|
|
name = "openshell-driver-vm"
|
|
description = "MicroVM compute driver for OpenShell"
|
|
version.workspace = true
|
|
edition.workspace = true
|
|
rust-version.workspace = true
|
|
license.workspace = true
|
|
repository.workspace = true
|
|
|
|
[lib]
|
|
name = "openshell_driver_vm"
|
|
path = "src/lib.rs"
|
|
|
|
[[bin]]
|
|
name = "openshell-driver-vm"
|
|
path = "src/main.rs"
|
|
|
|
[dependencies]
|
|
openshell-core = { path = "../openshell-core", default-features = false }
|
|
openshell-otel = { path = "../openshell-otel" }
|
|
openshell-policy = { path = "../openshell-policy" }
|
|
openshell-vfio = { path = "../openshell-vfio" }
|
|
|
|
bollard = { version = "0.20", features = ["ssh"] }
|
|
tokio = { workspace = true }
|
|
tonic = { workspace = true, features = ["transport"] }
|
|
tower-http = { workspace = true }
|
|
http = { workspace = true }
|
|
prost = { workspace = true }
|
|
prost-types = { workspace = true }
|
|
futures = { workspace = true }
|
|
tokio-stream = { workspace = true, features = ["net"] }
|
|
nix = { workspace = true }
|
|
clap = { workspace = true }
|
|
tracing = { workspace = true }
|
|
tracing-subscriber = { workspace = true }
|
|
opentelemetry = { workspace = true }
|
|
opentelemetry_sdk = { workspace = true }
|
|
tracing-opentelemetry = { workspace = true }
|
|
miette = { workspace = true }
|
|
url = { workspace = true }
|
|
serde = { workspace = true }
|
|
serde_json = { workspace = true }
|
|
oci-client = "0.16"
|
|
libc = "0.2"
|
|
rustix = { workspace = true }
|
|
libloading = "0.8"
|
|
tar = "0.4"
|
|
flate2 = "1"
|
|
sha2 = "0.10"
|
|
zstd = "0.13"
|
|
|
|
[features]
|
|
default = ["telemetry"]
|
|
## Compile in telemetry support (forwards to openshell-core/telemetry). On by
|
|
## default; build with `--no-default-features` for a telemetry-free VM driver
|
|
## that reports telemetry disabled to the sandboxes it launches.
|
|
telemetry = ["openshell-core/telemetry"]
|
|
|
|
[dev-dependencies]
|
|
temp-env = "0.3"
|
|
tempfile = "3"
|
|
opentelemetry_sdk = { workspace = true, features = ["testing"] }
|
|
opentelemetry-proto = { version = "0.32", default-features = false, features = ["gen-tonic", "trace"] }
|
|
|
|
# smol-rs/polling drives the BSD/macOS parent-death detection in
|
|
# procguard via kqueue's EVFILT_PROC / NOTE_EXIT filter. We could use
|
|
# it on Linux too (via epoll + pidfd) but sticking with
|
|
# nix::sys::prctl::set_pdeathsig there keeps the Linux path a single
|
|
# syscall with no helper thread.
|
|
[target.'cfg(any(target_os = "macos", target_os = "ios", target_os = "freebsd", target_os = "netbsd", target_os = "openbsd", target_os = "dragonfly"))'.dependencies]
|
|
polling = "3.11"
|
|
|
|
[lints]
|
|
workspace = true
|