diff --git a/README.md b/README.md index 30d1a47..bcad207 100644 --- a/README.md +++ b/README.md @@ -61,6 +61,10 @@ metrics: The cluster state collector exposes `pve_cluster_mode`, where `1` means that Proxmox VE is configured as a cluster and `0` means that it is a standalone node. +The `pve_node_subscription_status` metric uses `0` when no subscription is +configured, `1` for an active subscription, and `2` for an expired or otherwise +unusable subscription. + ## Build To build the Docker image for PVE Exporter, use the following command: diff --git a/metrics/pve_node_subscription_collector.go b/metrics/pve_node_subscription_collector.go index 025a2e1..e6f9dfe 100644 --- a/metrics/pve_node_subscription_collector.go +++ b/metrics/pve_node_subscription_collector.go @@ -39,7 +39,7 @@ func NewPveSubscriptionCollector(apiClient *proxmox.PveApiClient, registry *TTLR c.status = NewTTLGaugeVec( prometheus.GaugeOpts{ Name: "pve_node_subscription_status", - Help: "Node subscription status.", + Help: "Node subscription status (0 = not found, 1 = active, 2 = expired or otherwise unusable).", }, []string{"cluster", "node"}, 5*time.Minute, @@ -111,7 +111,7 @@ func (c *PveSubscriptionCollector) CollectMetrics() error { c.info.With(subsLabels).Set(1) // Subscription state. - c.status.With(labels).Set(subscription.GetActiveNumeric()) + c.status.With(labels).Set(subscription.GetStatusNumeric()) // Subscription sockets count. c.sockets.With(labels).Set(float64(subscription.Sockets)) diff --git a/proxmox/model.go b/proxmox/model.go index d0a3ac5..b8b1ec8 100644 --- a/proxmox/model.go +++ b/proxmox/model.go @@ -430,13 +430,18 @@ func (r *PveSdnResource) GetStatusNumeric() float64 { return 0 } -// GetActiveNumeric returns the numeric state of a subscription. -// Returns 1 if the subscription status is "active", otherwise returns 0. -func (r *PveSubscription) GetActiveNumeric() float64 { - if r.Status == "active" { +// GetStatusNumeric returns the numeric state of a subscription. +// A missing subscription is 0, an active subscription is 1, and an expired +// or otherwise unusable subscription is 2. +func (r *PveSubscription) GetStatusNumeric() float64 { + switch r.Status { + case "notfound": + return 0 + case "active": return 1 + default: + return 2 } - return 0 } // GetSmartPassedState returns the numeric health state of a disk. diff --git a/proxmox/model_test.go b/proxmox/model_test.go index d268df0..2adad6e 100644 --- a/proxmox/model_test.go +++ b/proxmox/model_test.go @@ -28,3 +28,27 @@ func TestPveClusterStatusGetClusterModeNumeric(t *testing.T) { }) } } + +func TestPveSubscriptionGetStatusNumeric(t *testing.T) { + tests := []struct { + status string + want float64 + }{ + {status: "notfound", want: 0}, + {status: "active", want: 1}, + {status: "expired", want: 2}, + {status: "invalid", want: 2}, + {status: "suspended", want: 2}, + {status: "new", want: 2}, + {status: "unknown", want: 2}, + } + + for _, tt := range tests { + t.Run(tt.status, func(t *testing.T) { + subscription := PveSubscription{Status: tt.status} + if got := subscription.GetStatusNumeric(); got != tt.want { + t.Fatalf("GetStatusNumeric() = %v, want %v", got, tt.want) + } + }) + } +}