Skip to content

Operator Observability

Monitor the RBLN NPU Operator using metrics, Kubernetes events, resource Ready conditions, and logs. For NPU utilization, temperature, and power, see the Metrics Exporter.

Operator Metrics

The operator exposes its own state metrics in Prometheus format: reconcile outcomes for RBLNClusterPolicy and RBLNDriver instances, NPU node counts, and driver upgrade progress. The Helm value operator.metrics.enabled controls the endpoint (default true).

Metrics Information

Metric Type Labels Description
rbln_operator_clusterpolicy_reconcile_status Gauge N/A Last RBLNClusterPolicy reconcile outcome (0=success, 1=notReady, 2=unavailable)
rbln_operator_driver_reconcile_status Gauge name Last reconcile outcome per RBLNDriver CR
rbln_operator_reconcile_total Counter controller Reconciliations executed
rbln_operator_reconcile_failed_total Counter controller Reconciliations that did not reach ready
rbln_operator_npu_nodes Gauge workload NPU-eligible nodes per workload type
rbln_operator_workload_coverage_state Gauge workload Aggregate workload coverage state (0=empty ~ 3=uncovered)
rbln_operator_driver_pool_ready_ratio Gauge driver, pool Ready/desired ratio per driver pool
rbln_operator_driver_owned_nodes Gauge driver Nodes routed to each RBLNDriver. The series is initialized to zero, so a selector that matches no nodes reports 0 instead of causing the series to disappear
rbln_operator_driver_uncovered_nodes Gauge N/A Driver-eligible NPU nodes with no owning RBLNDriver
rbln_operator_driver_selector_conflict_nodes Gauge driver Nodes where this driver's selector ties with another RBLNDriver
rbln_operator_driver_upgrade_nodes Gauge state Nodes per driver upgrade state

The operator also exposes the standard controller-runtime metrics (controller_runtime_*, workqueue_*, rest_client_*, go_*) on the same endpoint.

Scraping with Prometheus Operator

If you use the Prometheus Operator, enable the ServiceMonitor provided by the chart in your Helm values.

1
2
3
4
operator:
  metrics:
    serviceMonitor:
      enabled: true

The endpoint requires authorization. Bind the metrics-reader ClusterRole created by the chart to the Prometheus ServiceAccount so Prometheus can scrape the endpoint.

1
2
3
kubectl create clusterrolebinding rbln-operator-metrics-scraper \
  --clusterrole=rbln-npu-operator-metrics-reader \
  --serviceaccount=<MONITORING_NAMESPACE>:<PROMETHEUS_SERVICE_ACCOUNT>

The ClusterRole is named <fullname>-metrics-reader. Helm uses the release name itself as <fullname> when the release name already contains rbln-npu-operator, as in the install guide, and <release>-rbln-npu-operator otherwise. Confirm the binding:

kubectl get clusterrolebinding rbln-operator-metrics-scraper

403 responses

If the metrics endpoint returns 403 Forbidden even with the ServiceMonitor enabled, check whether the metrics-reader binding is missing.

Operator Events

The operator records state changes and errors as Kubernetes events. Use kubectl describe to see what happened and when. Errors on custom resources also appear in their Ready conditions, as shown in the following table. After an event expires, check the Ready condition for the current state.

Reason Type Object When Paired Ready condition
DriverUpgradeStarted Normal Node Node selected for upgrade and entering the cordon stage N/A
DriverUpgradeSkipped Warning Node Eviction blocked the attempt; the old driver stays. Only the upgrade's cordon is released; administrator cordons and nodes in requestor mode remain cordoned N/A
DriverUpgradePodStuck Warning Node The replacement driver pod is not progressing (image pull or container start failure); repeats while waiting in the pod replacement step N/A
DriverUpgradeCompleted Normal Node Node upgrade completed N/A
DriverUpgradeFailed Warning Node Driver pod replacement or validation failed; the node stays cordoned and the message carries the failure reason N/A
DriverOwnerChanged Normal Node The node's owning RBLNDriver was set or changed N/A
DriverNodeUncovered Warning Node The node lost its owning RBLNDriver, because no selector matches it or a selector tie is unresolved N/A
ComponentApplyFailed Warning RBLNClusterPolicy Failed to apply a manifest for a component managed by the RBLNClusterPolicy instance (Device Plugin, NPU Feature Discovery, and so on) False / ComponentApplyFailed
DriverInstallFailed Warning RBLNDriver Failed to apply a manifest of a driver-install component (per-node-pool driver DaemonSet, and so on) False / Error
InvalidSpec Warning RBLNDriver nodeSelector uses a reserved key, or the resource name exceeds 63 characters False / InvalidSpec
ConflictingNodeSelector Warning RBLNDriver nodeSelector ties with another RBLNDriver on specific nodes False / ConflictingNodeSelector
DriverImageNotFound Warning RBLNDriver A pool's driver image is missing from its registry. The operator rechecks the image about every five minutes, and the condition clears once the image is published False / DriverImageNotFound
DriverFamilyLabelMissing Warning RBLNDriver An owned node has no usable rebellions.ai/npu.family label False / DriverFamilyLabelMissing
AllActiveWorkloadsReady Normal RBLNClusterPolicy All managed components became ready, so the RBLNClusterPolicy instance state changed to ready True / AllActiveWorkloadsReady
DriverReady Normal RBLNDriver The driver became ready on every node pool, so the RBLNDriver instance state changed to ready True / AllDriverPoolsReady
PolicyIgnored Normal RBLNClusterPolicy Ignored a later-created RBLNClusterPolicy instance because an active instance already exists (only one RBLNClusterPolicy instance per cluster takes effect) False / PolicyIgnored

The operator records an event once when the state changes. Repeated reconcile loops do not record it again while the state stays the same. DriverUpgradePodStuck is the exception: it repeats while the driver pod is waiting in the replacement step. The four driver-validation warnings (InvalidSpec, ConflictingNodeSelector, DriverImageNotFound, and DriverFamilyLabelMissing) are recorded once per event reason and resource generation (metadata.generation). If a problem clears and then recurs without a spec change, the operator updates the Ready condition without recording another event. The two node-routing events are recorded only when a node's owner changes during reconciliation.

Because both CRDs are cluster-scoped, their events are recorded in the default namespace rather than the operator's namespace.

During a driver auto upgrade, the operator records DriverUpgradeStarted and then DriverUpgradeCompleted on each node, or DriverUpgradeSkipped or DriverUpgradeFailed when a step fails. See Events for the state each event marks.

Inspecting Events

Choose the command for the resource you want to inspect.

List the upgrade events of a specific node in chronological order.

1
2
3
kubectl get events -A \
  --field-selector involvedObject.kind=Node,involvedObject.name=<NODE_NAME> \
  --sort-by=.lastTimestamp
kubectl describe rblnclusterpolicy <name>
kubectl describe rblndriver <name>

Event retention

Kubernetes keeps events for one hour by default. Check .status.conditions for the current state, and use the rbln_operator_* metrics for long-term trends and alerting.

kubectl logs -n <NAMESPACE> deployment/rbln-npu-operator-controller-manager
kubectl get rblnclusterpolicy <name> -o jsonpath='{.status.conditions}'

Missing events

When several distinct errors occur on the same object in a short period, the Kubernetes client's spam filter may drop some events. The Ready condition and metrics still show the current state.

Driver and RSMD Readiness

An RBLNDriver reports driver pod readiness under .status.nodePools and RSMD readiness under .status.smd. Even when the driver pods are ready, the resource reports Ready=False with reason SmdNotReady until RSMD is ready.

1
2
3
kubectl get rblndriver
kubectl get rblndriver <DRIVER_NAME> -o jsonpath='{.status.nodePools}{"\n"}'
kubectl get rblndriver <DRIVER_NAME> -o jsonpath='{.status.smd}{"\n"}'

Logging

The operator writes structured logs to stdout, including records produced by the Kubernetes client libraries. Configure the logs with the following chart values:

1
2
3
4
5
6
operator:
  logging:
    level: info              # error | info | debug | panic, or an integer N for logr V(N)
    encoder: json            # json | console
    timeEncoding: rfc3339nano
    develMode: false

Invalid logging values stop the operator

If level or encoder is invalid, the operator fails to start and does not use a default value. Check these settings before applying them.