| 1 | // SPDX-License-Identifier: GPL-3.0-or-later |
| 2 | |
| 3 | package vsphere |
| 4 | |
| 5 | import ( |
| 6 | "github.com/netdata/netdata/go/plugins/pkg/metrix" |
| 7 | rs "github.com/netdata/netdata/go/plugins/plugin/go.d/collector/vsphere/resources" |
| 8 | "github.com/netdata/netdata/go/plugins/plugin/go.d/pkg/oldmetrix" |
| 9 | ) |
| 10 | |
| 11 | const ( |
| 12 | datastoreClusterSpaceUsageCapacityMetric = "datastore_cluster_space_usage_capacity" |
| 13 | datastoreClusterSpaceUsageFreeMetric = "datastore_cluster_space_usage_free" |
| 14 | datastoreClusterSpaceUsageUsedMetric = "datastore_cluster_space_usage_used" |
| 15 | datastoreClusterSpaceUtilizationUsedMetric = "datastore_cluster_space_utilization_used" |
| 16 | datastoreClusterStorageDRSEnabledMetric = "datastore_cluster_storage_drs_status_enabled" |
| 17 | datastoreClusterStorageDRSDisabledMetric = "datastore_cluster_storage_drs_status_disabled" |
| 18 | datastoreClusterOverallStatusGreenMetric = "datastore_cluster_overall_status_green" |
| 19 | datastoreClusterOverallStatusRedMetric = "datastore_cluster_overall_status_red" |
| 20 | datastoreClusterOverallStatusYellowMetric = "datastore_cluster_overall_status_yellow" |
| 21 | datastoreClusterOverallStatusGrayMetric = "datastore_cluster_overall_status_gray" |
| 22 | datastoreClusterNameLabel = "datastore_cluster" |
| 23 | ) |
| 24 | |
| 25 | func (c *Collector) writeDatastoreClusterMetrics() { |
| 26 | if !c.CollectDatastoreClusters || c.resources == nil { |
| 27 | return |
| 28 | } |
| 29 | |
| 30 | for _, pod := range sortedStoragePods(c.resources.StoragePods) { |
| 31 | labels := c.labelSet(c.datastoreClusterLabels(pod)) |
| 32 | c.observeGauge(datastoreClusterSpaceUsageCapacityMetric, pod.Capacity, labels) |
| 33 | c.observeGauge(datastoreClusterSpaceUsageFreeMetric, pod.FreeSpace, labels) |
| 34 | used := max(pod.Capacity-pod.FreeSpace, 0) |
| 35 | c.observeGauge(datastoreClusterSpaceUsageUsedMetric, used, labels) |
| 36 | if pod.Capacity > 0 { |
| 37 | c.observeGauge(datastoreClusterSpaceUtilizationUsedMetric, int64(float64(used)/float64(pod.Capacity)*scaledPercent), labels) |
| 38 | } else { |
| 39 | c.observeGauge(datastoreClusterSpaceUtilizationUsedMetric, 0, labels) |
| 40 | } |
| 41 | c.observeGauge(datastoreClusterStorageDRSEnabledMetric, oldmetrix.Bool(pod.StorageDRSEnabled != nil && *pod.StorageDRSEnabled), labels) |
| 42 | c.observeGauge(datastoreClusterStorageDRSDisabledMetric, oldmetrix.Bool(pod.StorageDRSEnabled != nil && !*pod.StorageDRSEnabled), labels) |
| 43 | status := pod.OverallStatus |
| 44 | if status == "" { |
| 45 | status = "gray" |
| 46 | } |
| 47 | c.observeGauge(datastoreClusterOverallStatusGreenMetric, oldmetrix.Bool(status == "green"), labels) |
| 48 | c.observeGauge(datastoreClusterOverallStatusRedMetric, oldmetrix.Bool(status == "red"), labels) |
| 49 | c.observeGauge(datastoreClusterOverallStatusYellowMetric, oldmetrix.Bool(status == "yellow"), labels) |
| 50 | c.observeGauge(datastoreClusterOverallStatusGrayMetric, oldmetrix.Bool(status == "gray"), labels) |
| 51 | } |
| 52 | } |
| 53 | |
| 54 | func (c *Collector) datastoreClusterLabels(pod *rs.StoragePod) []metrix.Label { |
| 55 | return c.v2MetricLabels(pod.ID, datastoreClusterLabels(pod), pod.Labels) |
| 56 | } |
| 57 | |
| 58 | func datastoreClusterLabels(pod *rs.StoragePod) []metrix.Label { |
| 59 | return []metrix.Label{ |
| 60 | {Key: "datacenter", Value: pod.Hier.DC.Name}, |
| 61 | {Key: datastoreClusterNameLabel, Value: pod.Name}, |
| 62 | } |
| 63 | } |