Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
59 lines
1.2 KiB
Go
59 lines
1.2 KiB
Go
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
|
|
}
|