From 7c140b519608a006ee18f42f46443348cc24bef7 Mon Sep 17 00:00:00 2001 From: Tesifonte Belda Date: Thu, 9 Mar 2023 12:03:05 +0100 Subject: [PATCH] feature: add glustervolume metrics --- METRICS.md | 16 +++++++++ README.md | 2 ++ etc/ovirtstat.conf | 1 + internal/ovirtcollector/cache.go | 48 ++++++++++++++++++++++----- plugins/inputs/ovirtstat/ovirtstat.go | 6 +++- 5 files changed, 63 insertions(+), 10 deletions(-) diff --git a/METRICS.md b/METRICS.md index 9f696cf..a29777f 100644 --- a/METRICS.md +++ b/METRICS.md @@ -54,6 +54,22 @@ - used (int) in bytes - status (string) - status_code (int) 0-active, 1-activating, 2-maintenance, 3-unknown, 4-detaching, 5-unattached, 6-mixed, 7-locked +- ovirtstat_glustervolume + - tags: + - clustername + - dcname + - name + - id + - ovirt-engine + - type + - fields: + - briks (int) + - disperse_count (int) + - redundancy_count (int) + - replica_count (int) + - status (string) + - status_code (int) 0-up, 1-unknown, 2-down + - stripe_count (int) - ovirtstat_vm - tags: - clustername diff --git a/README.md b/README.md index f303be7..0aee3ce 100644 --- a/README.md +++ b/README.md @@ -53,6 +53,7 @@ Latest releases are built with a go-ovirt library version that should work with #### collector names available are (details in METRICS.md) #### ## Datacenters: datacenter stats in ovirtstat_datacenter measurement + ## GlusterVolumes: gluster volume stats in ovirtstat_glustervolume measurement ## Hosts: hypervisor/host stats in ovirtstat_host measurement ## StorageDomains: cluster stats in ovirtstat_storagedomains measurement ## VMs: virtual machine stats in ovirtstat_vm measurement @@ -99,6 +100,7 @@ ovirtstat_datacenter,name=mydc,id=c3a7efc0-8417-4d1b-bc74-fa6f20d6bf1f,ovirt-eng ovirtstat_host,clustername=mycluster,dcname=mydc,id=b3d53f5d-7ec3-43a8-a52a-15fe7dde25c2,name=myhyp01,ovirt-engine=myovirt,type=rhel cpu_threads=2i,memory_size=1622535045120i,status="up",status_code=0i,cpu_cores=16i,cpu_sockets=2i,cpu_speed=800,reinstallation_required=false,vm_active=5i,vm_migrating=0i,vm_total=5i 1677832224000000000 ovirtstat_storagedomain,id=072cba31-08f3-4a40-9f24-a5ca22ed1d74,name=ovirt-image-repository,ovirt-engine=myovirt,type=image available=0i,connections=0,committed=0i,external_status="ok",external_status_code=0,master=false,status="unattached",status_code=5i,used=0i 1677832224000000000 ovirtstat_storagedomain,id=ec413fb2-c6ce-4bea-a790-2533b728ac93,name=mysd01,ovirt-engine=myovirt,type=data available=3233036632064i,connections=7,committed=16603269824512i,external_status="ok",external_status_code=0,master=true,status="",status_code=3i,used=7761005903872i 1677832224000000000 +ovirtstat_glustervolume,clustername=mycluster,dcname=mydc,id=a1d52f5d-6vc3-42a8-a52f-21fe7dde25c2,name=mygv1,ovirt-engine=myovirt,type=stripe briks=1i,disperse_count=0i,redundancy_count=0i,replica_count=0i,status="up",status_code=0i,stripe_count=1i 1677832224000000000 virtstat_vm,clustername=mycluster,dcname=mydc,hostname=myhyp01,id=125555e7-fa2c-4d95-a5c4-51f1b9a7f563,name=myvm01,ovirt-engine=myovirt,type=server cpu_cores=1i,cpu_threads=2i,run_once=false,status="up",cpu_sockets=2i,memory_size=40802189312i,stateless=false,status_code=0i 1677832224000000000 internal_ovirtstat,ovirt-engine=myovirt sessions_created=1i,gather_time_ns=803780400i 1677832224000000000 ``` diff --git a/etc/ovirtstat.conf b/etc/ovirtstat.conf index 965a9c6..7bd1080 100644 --- a/etc/ovirtstat.conf +++ b/etc/ovirtstat.conf @@ -35,6 +35,7 @@ #### collector names available are (details in METRICS.md) #### ## Datacenters: datacenter stats in ovirtstat_datacenter measurement + ## GlusterVolumes: gluster volume stats in ovirtstat_glustervolume measurement ## Hosts: hypervisor/host stats in ovirtstat_host measurement ## StorageDomains: cluster stats in ovirtstat_storagedomains measurement ## VMs: virtual machine stats in ovirtstat_vm measurement diff --git a/internal/ovirtcollector/cache.go b/internal/ovirtcollector/cache.go index f8696cb..6358933 100644 --- a/internal/ovirtcollector/cache.go +++ b/internal/ovirtcollector/cache.go @@ -14,15 +14,17 @@ import ( ) type VcCache struct { - dcs *ovirtsdk.DataCenterSlice //nolint - clusters *ovirtsdk.ClusterSlice //nolint - sds *ovirtsdk.StorageDomainSlice //nolint - hosts *ovirtsdk.HostSlice //nolint - vms *ovirtsdk.VmSlice //nolint - lastDCUpdate time.Time //nolint - lastHoUpdate time.Time //nolint - lastSdUpdate time.Time //nolint - lastVmUpdate time.Time //nolint + dcs *ovirtsdk.DataCenterSlice + clusters *ovirtsdk.ClusterSlice + gvs *ovirtsdk.GlusterVolumeSlice + sds *ovirtsdk.StorageDomainSlice + hosts *ovirtsdk.HostSlice + vms *ovirtsdk.VmSlice + lastDCUpdate time.Time + lastHoUpdate time.Time + lastGvUpdate time.Time + lastSdUpdate time.Time + lastVmUpdate time.Time } func (c *OVirtCollector) getDatacentersAndClusters(ctx context.Context) error { @@ -59,6 +61,34 @@ func (c *OVirtCollector) getDatacentersAndClusters(ctx context.Context) error { return err } +func (c *OVirtCollector) getAllDatacentersGlusterVolumes(ctx context.Context) error { + var err error + + if time.Since(c.lastGvUpdate) < c.dataDuration { + return nil + } + + if err = c.getDatacentersAndClusters(ctx); err != nil { + return err + } + + // Get Gluster Volumes + clserv := ovirtsdk.NewClusterService(c.conn, "") + gvsService := clserv.GlusterVolumesService() + gvsResponse, err := gvsService.List().Send() + if err != nil { + return err + } + gvs, ok := gvsResponse.Volumes() + if !ok { + return fmt.Errorf("Could not get gluster volume list or it is empty") + } + c.gvs = gvs + c.lastGvUpdate = time.Now() + + return nil +} + func (c *OVirtCollector) getAllDatacentersHosts(ctx context.Context) error { var err error diff --git a/plugins/inputs/ovirtstat/ovirtstat.go b/plugins/inputs/ovirtstat/ovirtstat.go index e75f617..b11404a 100644 --- a/plugins/inputs/ovirtstat/ovirtstat.go +++ b/plugins/inputs/ovirtstat/ovirtstat.go @@ -87,6 +87,7 @@ var sampleConfig = ` #### collector names available are #### ## Datacenters: datacenter stats in ovirtstat_datacenter measurement + ## GlusterVolumes: gluster volume stats in ovirtstat_glustervolume measurement ## Hosts: hypervisor/host stats in ovirtstat_host measurement ## StorageDomains: cluster stats in ovirtstat_storagedomains measurement ## VMs: virtual machine stats in ovirtstat_vm measurement @@ -312,6 +313,9 @@ func (ovc *OVirtstatConfig) gatherStorage( if _, exist = ovc.collectors["StorageDomains"]; exist { err = col.CollectDatastoresInfo(ctx, acc) } + if _, exist = ovc.collectors["GlusterVolumes"]; exist { + err = col.CollectGlusterVolumeInfo(ctx, acc) + } return err } @@ -334,7 +338,7 @@ func (ovc *OVirtstatConfig) gatherVM(ctx context.Context, acc telegraf.Accumulat // setFilterCollectors sets collectors to use given the include and exclude filters func (ovc *OVirtstatConfig) setFilterCollectors(include, exclude []string) error { - var allcollectors = []string{"Datacenters", "Hosts", "StorageDomains", "VMs"} + var allcollectors = []string{"Datacenters", "GlusterVolumes", "Hosts", "StorageDomains", "VMs"} var err error ovc.filterCollectors, err = filter.NewIncludeExcludeFilter(include, exclude)