Fix wrong memory measurements of containers and vms (#8290)
This commit is contained in:
parent
14a73055f4
commit
9c2979dced
|
|
@ -11,6 +11,8 @@ Telegraf minimum version: Telegraf 1.16.0
|
||||||
## API connection configuration. The API token was introduced in Proxmox v6.2. Required permissions for user and token: PVEAuditor role on /.
|
## API connection configuration. The API token was introduced in Proxmox v6.2. Required permissions for user and token: PVEAuditor role on /.
|
||||||
base_url = "https://localhost:8006/api2/json"
|
base_url = "https://localhost:8006/api2/json"
|
||||||
api_token = "USER@REALM!TOKENID=UUID"
|
api_token = "USER@REALM!TOKENID=UUID"
|
||||||
|
## Optional node name config
|
||||||
|
# node_name = "localhost"
|
||||||
|
|
||||||
## Optional TLS Config
|
## Optional TLS Config
|
||||||
# tls_ca = "/etc/telegraf/ca.pem"
|
# tls_ca = "/etc/telegraf/ca.pem"
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@ package proxmox
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
"errors"
|
||||||
"github.com/influxdata/telegraf"
|
"github.com/influxdata/telegraf"
|
||||||
"github.com/influxdata/telegraf/plugins/inputs"
|
"github.com/influxdata/telegraf/plugins/inputs"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
|
|
@ -48,11 +49,10 @@ func (px *Proxmox) Gather(acc telegraf.Accumulator) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (px *Proxmox) Init() error {
|
func (px *Proxmox) Init() error {
|
||||||
hostname, err := os.Hostname()
|
|
||||||
if err != nil {
|
if px.NodeName == "" {
|
||||||
return err
|
return errors.New("node_name must be configured")
|
||||||
}
|
}
|
||||||
px.hostname = hostname
|
|
||||||
|
|
||||||
tlsCfg, err := px.ClientConfig.TLSConfig()
|
tlsCfg, err := px.ClientConfig.TLSConfig()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
@ -73,11 +73,15 @@ func init() {
|
||||||
requestFunction: performRequest,
|
requestFunction: performRequest,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Set hostname as default node name for backwards compatibility
|
||||||
|
hostname, _ := os.Hostname()
|
||||||
|
px.NodeName = hostname
|
||||||
|
|
||||||
inputs.Add("proxmox", func() telegraf.Input { return &px })
|
inputs.Add("proxmox", func() telegraf.Input { return &px })
|
||||||
}
|
}
|
||||||
|
|
||||||
func getNodeSearchDomain(px *Proxmox) error {
|
func getNodeSearchDomain(px *Proxmox) error {
|
||||||
apiUrl := "/nodes/" + px.hostname + "/dns"
|
apiUrl := "/nodes/" + px.NodeName + "/dns"
|
||||||
jsonData, err := px.requestFunction(px, apiUrl, http.MethodGet, nil)
|
jsonData, err := px.requestFunction(px, apiUrl, http.MethodGet, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
|
@ -88,6 +92,10 @@ func getNodeSearchDomain(px *Proxmox) error {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if nodeDns.Data.Searchdomain == "" {
|
||||||
|
return errors.New("node_name not found")
|
||||||
|
}
|
||||||
px.nodeSearchDomain = nodeDns.Data.Searchdomain
|
px.nodeSearchDomain = nodeDns.Data.Searchdomain
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
|
@ -137,7 +145,12 @@ func gatherVmData(px *Proxmox, acc telegraf.Accumulator, rt ResourceType) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
tags := getTags(px, vmStat.Name, vmConfig, rt)
|
tags := getTags(px, vmStat.Name, vmConfig, rt)
|
||||||
fields, err := getFields(vmStat)
|
currentVMStatus, err := getCurrentVMStatus(px, rt, vmStat.ID)
|
||||||
|
if err != nil {
|
||||||
|
px.Log.Error("Error getting VM curent VM status: %v", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
fields, err := getFields(currentVMStatus)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
px.Log.Error("Error getting VM measurements: %v", err)
|
px.Log.Error("Error getting VM measurements: %v", err)
|
||||||
return
|
return
|
||||||
|
|
@ -146,8 +159,25 @@ func gatherVmData(px *Proxmox, acc telegraf.Accumulator, rt ResourceType) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func getCurrentVMStatus(px *Proxmox, rt ResourceType, id string) (VmStat, error) {
|
||||||
|
apiUrl := "/nodes/" + px.NodeName + "/" + string(rt) + "/" + id + "/status/current"
|
||||||
|
|
||||||
|
jsonData, err := px.requestFunction(px, apiUrl, http.MethodGet, nil)
|
||||||
|
if err != nil {
|
||||||
|
return VmStat{}, err
|
||||||
|
}
|
||||||
|
|
||||||
|
var currentVmStatus VmCurrentStats
|
||||||
|
err = json.Unmarshal(jsonData, ¤tVmStatus)
|
||||||
|
if err != nil {
|
||||||
|
return VmStat{}, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return currentVmStatus.Data, nil
|
||||||
|
}
|
||||||
|
|
||||||
func getVmStats(px *Proxmox, rt ResourceType) (VmStats, error) {
|
func getVmStats(px *Proxmox, rt ResourceType) (VmStats, error) {
|
||||||
apiUrl := "/nodes/" + px.hostname + "/" + string(rt)
|
apiUrl := "/nodes/" + px.NodeName + "/" + string(rt)
|
||||||
jsonData, err := px.requestFunction(px, apiUrl, http.MethodGet, nil)
|
jsonData, err := px.requestFunction(px, apiUrl, http.MethodGet, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return VmStats{}, err
|
return VmStats{}, err
|
||||||
|
|
@ -163,7 +193,7 @@ func getVmStats(px *Proxmox, rt ResourceType) (VmStats, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func getVmConfig(px *Proxmox, vmId string, rt ResourceType) (VmConfig, error) {
|
func getVmConfig(px *Proxmox, vmId string, rt ResourceType) (VmConfig, error) {
|
||||||
apiUrl := "/nodes/" + px.hostname + "/" + string(rt) + "/" + vmId + "/config"
|
apiUrl := "/nodes/" + px.NodeName + "/" + string(rt) + "/" + vmId + "/config"
|
||||||
jsonData, err := px.requestFunction(px, apiUrl, http.MethodGet, nil)
|
jsonData, err := px.requestFunction(px, apiUrl, http.MethodGet, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return VmConfig{}, err
|
return VmConfig{}, err
|
||||||
|
|
@ -245,7 +275,7 @@ func getTags(px *Proxmox, name string, vmConfig VmConfig, rt ResourceType) map[s
|
||||||
fqdn := hostname + "." + domain
|
fqdn := hostname + "." + domain
|
||||||
|
|
||||||
return map[string]string{
|
return map[string]string{
|
||||||
"node_fqdn": px.hostname + "." + px.nodeSearchDomain,
|
"node_fqdn": px.NodeName + "." + px.nodeSearchDomain,
|
||||||
"vm_name": name,
|
"vm_name": name,
|
||||||
"vm_fqdn": fqdn,
|
"vm_fqdn": fqdn,
|
||||||
"vm_type": string(rt),
|
"vm_type": string(rt),
|
||||||
|
|
|
||||||
|
|
@ -14,6 +14,8 @@ var qemuTestData = `{"data":[{"name":"qemu1","status":"running","maxdisk":107374
|
||||||
var qemuConfigTestData = `{"data":{"hostname":"qemu1","searchdomain":"test.example.com"}}`
|
var qemuConfigTestData = `{"data":{"hostname":"qemu1","searchdomain":"test.example.com"}}`
|
||||||
var lxcTestData = `{"data":[{"vmid":"111","type":"lxc","uptime":2078164,"swap":9412608,"disk":"744189952","maxmem":536870912,"mem":98500608,"maxswap":536870912,"cpu":0.00371567669193613,"status":"running","maxdisk":"5217320960","name":"container1"}]}`
|
var lxcTestData = `{"data":[{"vmid":"111","type":"lxc","uptime":2078164,"swap":9412608,"disk":"744189952","maxmem":536870912,"mem":98500608,"maxswap":536870912,"cpu":0.00371567669193613,"status":"running","maxdisk":"5217320960","name":"container1"}]}`
|
||||||
var lxcConfigTestData = `{"data":{"hostname":"container1","searchdomain":"test.example.com"}}`
|
var lxcConfigTestData = `{"data":{"hostname":"container1","searchdomain":"test.example.com"}}`
|
||||||
|
var lxcCurrentStatusTestData = `{"data":{"vmid":"111","type":"lxc","uptime":2078164,"swap":9412608,"disk":"744189952","maxmem":536870912,"mem":98500608,"maxswap":536870912,"cpu":0.00371567669193613,"status":"running","maxdisk":"5217320960","name":"container1"}}`
|
||||||
|
var qemuCurrentStatusTestData = `{"data":{"name":"qemu1","status":"running","maxdisk":10737418240,"cpu":0.029336643550795,"vmid":"113","uptime":2159739,"disk":0,"maxmem":2147483648,"mem":1722451796}}`
|
||||||
|
|
||||||
func performTestRequest(px *Proxmox, apiUrl string, method string, data url.Values) ([]byte, error) {
|
func performTestRequest(px *Proxmox, apiUrl string, method string, data url.Values) ([]byte, error) {
|
||||||
var bytedata = []byte("")
|
var bytedata = []byte("")
|
||||||
|
|
@ -28,6 +30,10 @@ func performTestRequest(px *Proxmox, apiUrl string, method string, data url.Valu
|
||||||
bytedata = []byte(lxcTestData)
|
bytedata = []byte(lxcTestData)
|
||||||
} else if strings.HasSuffix(apiUrl, "111/config") {
|
} else if strings.HasSuffix(apiUrl, "111/config") {
|
||||||
bytedata = []byte(lxcConfigTestData)
|
bytedata = []byte(lxcConfigTestData)
|
||||||
|
} else if strings.HasSuffix(apiUrl, "111/status/current") {
|
||||||
|
bytedata = []byte(lxcCurrentStatusTestData)
|
||||||
|
} else if strings.HasSuffix(apiUrl, "113/status/current") {
|
||||||
|
bytedata = []byte(qemuCurrentStatusTestData)
|
||||||
}
|
}
|
||||||
|
|
||||||
return bytedata, nil
|
return bytedata, nil
|
||||||
|
|
@ -36,12 +42,12 @@ func performTestRequest(px *Proxmox, apiUrl string, method string, data url.Valu
|
||||||
func setUp(t *testing.T) *Proxmox {
|
func setUp(t *testing.T) *Proxmox {
|
||||||
px := &Proxmox{
|
px := &Proxmox{
|
||||||
requestFunction: performTestRequest,
|
requestFunction: performTestRequest,
|
||||||
|
NodeName: "testnode",
|
||||||
}
|
}
|
||||||
|
|
||||||
require.NoError(t, px.Init())
|
require.NoError(t, px.Init())
|
||||||
|
|
||||||
// Override hostname and logger for test
|
// Override logger for test
|
||||||
px.hostname = "testnode"
|
|
||||||
px.Log = testutil.Logger{}
|
px.Log = testutil.Logger{}
|
||||||
return px
|
return px
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -13,9 +13,10 @@ type Proxmox struct {
|
||||||
BaseURL string `toml:"base_url"`
|
BaseURL string `toml:"base_url"`
|
||||||
APIToken string `toml:"api_token"`
|
APIToken string `toml:"api_token"`
|
||||||
ResponseTimeout internal.Duration `toml:"response_timeout"`
|
ResponseTimeout internal.Duration `toml:"response_timeout"`
|
||||||
|
NodeName string `toml:"node_name"`
|
||||||
|
|
||||||
tls.ClientConfig
|
tls.ClientConfig
|
||||||
|
|
||||||
hostname string
|
|
||||||
httpClient *http.Client
|
httpClient *http.Client
|
||||||
nodeSearchDomain string
|
nodeSearchDomain string
|
||||||
|
|
||||||
|
|
@ -34,6 +35,10 @@ type VmStats struct {
|
||||||
Data []VmStat `json:"data"`
|
Data []VmStat `json:"data"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type VmCurrentStats struct {
|
||||||
|
Data VmStat `json:"data"`
|
||||||
|
}
|
||||||
|
|
||||||
type VmStat struct {
|
type VmStat struct {
|
||||||
ID string `json:"vmid"`
|
ID string `json:"vmid"`
|
||||||
Name string `json:"name"`
|
Name string `json:"name"`
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue