feat: add version collector (pve_version_info)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
1a13f19b1f
commit
c8ae97d777
4 changed files with 93 additions and 0 deletions
1
collector/fixtures/version.json
Normal file
1
collector/fixtures/version.json
Normal file
|
|
@ -0,0 +1 @@
|
|||
{"data":{"version":"9.1.4","release":"9.1","repoid":"5ac30304265fbd8e"}}
|
||||
59
collector/version.go
Normal file
59
collector/version.go
Normal 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
32
collector/version_test.go
Normal 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
1
go.mod
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue