Skip to content

Commit bb0ebc4

Browse files
committed
feat(agent): add Metrics+NodeName to FirecrackerDriver, share VMMetricsCollector
Add Metrics *VMMetricsCollector and NodeName string fields to FirecrackerDriver so the pollMetrics goroutine (Task 3) can set guest gauges with the correct node label. Also add metricsInterval var following the same override-friendly pattern as shuttingDownTimeout. newProductionDriver now accepts mc and nodeName so both the driver and ImpVMReconciler share the same VMMetricsCollector instance.
1 parent 563b35d commit bb0ebc4

4 files changed

Lines changed: 30 additions & 3 deletions

File tree

cmd/agent/driver_linux.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,14 @@ import (
1212
// newProductionDriver creates a FirecrackerDriver wired with a LinuxNetManager.
1313
// Reads FC_BIN, FC_SOCK_DIR, FC_KERNEL, FC_KERNEL_ARGS, and IMP_IMAGE_CACHE.
1414
// Returns the driver, the shared NetManager, and any error.
15-
func newProductionDriver(client ctrlclient.Client) (agent.VMDriver, network.NetManager, error) {
15+
func newProductionDriver(client ctrlclient.Client, mc *agent.VMMetricsCollector, nodeName string) (agent.VMDriver, network.NetManager, error) {
1616
d, err := agent.NewFirecrackerDriver(client)
1717
if err != nil {
1818
return nil, nil, err
1919
}
2020
nm := network.NewLinuxNetManager()
2121
d.Net = nm
22+
d.Metrics = mc
23+
d.NodeName = nodeName
2224
return d, nm, nil
2325
}

cmd/agent/main.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,8 @@ func main() {
5757
os.Exit(1)
5858
}
5959

60+
mc := agent.NewVMMetricsCollector()
61+
6062
// IMP_STUB_DRIVER=true: StubDriver (CI, test clusters, no KVM needed).
6163
// Otherwise: FirecrackerDriver (reads FC_BIN, FC_SOCK_DIR, FC_KERNEL env vars).
6264
var driver agent.VMDriver
@@ -66,7 +68,7 @@ func main() {
6668
driver = agent.NewStubDriver()
6769
} else {
6870
var fcErr error
69-
driver, prodNet, fcErr = newProductionDriver(mgr.GetClient())
71+
driver, prodNet, fcErr = newProductionDriver(mgr.GetClient(), mc, nodeName)
7072
if fcErr != nil {
7173
log.Error(fcErr, "Unable to create FirecrackerDriver — set FC_KERNEL and ensure FC_BIN is in PATH")
7274
os.Exit(1)
@@ -80,7 +82,7 @@ func main() {
8082
NodeName: nodeName,
8183
NodeIP: nodeIP,
8284
Driver: driver,
83-
Metrics: agent.NewVMMetricsCollector(),
85+
Metrics: mc,
8486
Net: prodNet,
8587
}).SetupWithManager(mgr); err != nil {
8688
log.Error(err, "Unable to set up ImpVMReconciler")

internal/agent/firecracker_driver.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,10 @@ import (
3737
// before force-killing the VMM. Declared as var (not const) so tests can override it.
3838
var shuttingDownTimeout = 5 * time.Second
3939

40+
// metricsInterval controls how often guest metrics are polled via VSOCK.
41+
// Declared as var (not const) so tests can override it.
42+
var metricsInterval = 30 * time.Second
43+
4044
// fcProc holds the runtime state of a running Firecracker microVM process.
4145
type fcProc struct {
4246
machine *firecracker.Machine
@@ -69,6 +73,11 @@ type FirecrackerDriver struct {
6973
// GuestAgentPath is the host path to the guest-agent binary for injection.
7074
// Defaults to rootfs.GuestAgentContainerPath when empty.
7175
GuestAgentPath string
76+
// Metrics collects Prometheus gauges for guest CPU/mem/disk.
77+
// When nil, guest metrics polling is skipped.
78+
Metrics *VMMetricsCollector
79+
// NodeName is the Kubernetes node name, used as a Prometheus label in guest metrics.
80+
NodeName string
7281

7382
// mu guards procs. Must be held for any read or write of the procs map.
7483
mu sync.Mutex

internal/agent/firecracker_driver_test.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -549,6 +549,20 @@ func TestFirecrackerDriver_Snapshot_noVM_returnsError(t *testing.T) {
549549
}
550550
}
551551

552+
func TestFirecrackerDriver_HasMetricsAndNodeNameFields(t *testing.T) {
553+
d := &FirecrackerDriver{
554+
Metrics: NewVMMetricsCollector(),
555+
NodeName: "node-1",
556+
procs: make(map[string]*fcProc),
557+
}
558+
if d.Metrics == nil {
559+
t.Error("Metrics field must be settable on FirecrackerDriver")
560+
}
561+
if d.NodeName != "node-1" {
562+
t.Errorf("NodeName = %q, want %q", d.NodeName, "node-1")
563+
}
564+
}
565+
552566
func TestFirecrackerDriver_Stop_doesNotCallRemoveNATWhenNotLast(t *testing.T) {
553567
stub := &network.StubNetManager{}
554568
alloc := network.NewAllocator()

0 commit comments

Comments
 (0)