feat: add version collector (pve_version_info)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Davíð Steinn Geirsson 2026-03-20 11:31:06 +00:00
parent 1a13f19b1f
commit c8ae97d777
4 changed files with 93 additions and 0 deletions

View file

@ -0,0 +1 @@
{"data":{"version":"9.1.4","release":"9.1","repoid":"5ac30304265fbd8e"}}

59
collector/version.go Normal file
View file

@ -0,0 +1,59 @@
package collector
import (
"encoding/json"
"fmt"
"log/slog"
"github.com/prometheus/client_golang/prometheus"
)
func init() {
registerCollector("version", func(logger *slog.Logger) Collector {
return newVersionCollector(logger)
})
}
type versionCollector struct {
logger *slog.Logger
}
func newVersionCollector(logger *slog.Logger) *versionCollector {
return &versionCollector{logger: logger}
}
type versionResponse struct {
Data struct {
Version string `json:"version"`
Release string `json:"release"`
RepoID string `json:"repoid"`
} `json:"data"`
}
func (c *versionCollector) Update(client *Client, ch chan<- prometheus.Metric) error {
body, err := client.Get("/version")
if err != nil {
return fmt.Errorf("failed to get /version: %w", err)
}
var resp versionResponse
if err := json.Unmarshal(body, &resp); err != nil {
return fmt.Errorf("failed to parse /version response: %w", err)
}
ch <- prometheus.MustNewConstMetric(
prometheus.NewDesc(
prometheus.BuildFQName(namespace, "", "version_info"),
"Proxmox VE version information.",
[]string{"release", "repoid", "version"},
nil,
),
prometheus.GaugeValue,
1,
resp.Data.Release,
resp.Data.RepoID,
resp.Data.Version,
)
return nil
}

32
collector/version_test.go Normal file
View file

@ -0,0 +1,32 @@
package collector
import (
"log/slog"
"strings"
"testing"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/testutil"
)
func TestVersionCollector(t *testing.T) {
client := newTestClient(t, map[string]string{
"/version": "version.json",
})
collector := newVersionCollector(slog.Default())
adapter := &testCollectorAdapter{client: client, collector: collector}
reg := prometheus.NewRegistry()
reg.MustRegister(adapter)
expected := `
# HELP pve_version_info Proxmox VE version information.
# TYPE pve_version_info gauge
pve_version_info{release="9.1",repoid="5ac30304265fbd8e",version="9.1.4"} 1
`
if err := testutil.GatherAndCompare(reg, strings.NewReader(expected), "pve_version_info"); err != nil {
t.Errorf("unexpected metrics: %s", err)
}
}

1
go.mod
View file

@ -17,6 +17,7 @@ require (
github.com/golang-jwt/jwt/v5 v5.3.0 // indirect
github.com/google/uuid v1.6.0 // indirect
github.com/jpillora/backoff v1.0.0 // indirect
github.com/kylelemons/godebug v1.1.0 // indirect
github.com/mdlayher/socket v0.4.1 // indirect
github.com/mdlayher/vsock v1.2.1 // indirect
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect