-
Notifications
You must be signed in to change notification settings - Fork 34
/
tenant.go
102 lines (86 loc) · 2.65 KB
/
tenant.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
package storagegrid
import (
"github.com/netapp/harvest/v2/cmd/poller/plugin"
"github.com/netapp/harvest/v2/pkg/errs"
"github.com/netapp/harvest/v2/pkg/matrix"
"github.com/netapp/harvest/v2/pkg/util"
)
const (
lenOfPrefix = 12 // len("storagegrid_")
)
type Tenant struct {
*plugin.AbstractPlugin
sg *StorageGrid
}
func NewTenant(p *plugin.AbstractPlugin, s *StorageGrid) plugin.Plugin {
return &Tenant{AbstractPlugin: p, sg: s}
}
func (t *Tenant) Run(dataMap map[string]*matrix.Matrix) ([]*matrix.Matrix, *util.Metadata, error) {
var (
used, quota, usedPercent *matrix.Metric
err error
tenantNamesByID map[string]string
)
data := dataMap[t.Object]
t.sg.client.Metadata.Reset()
if used = data.GetMetric("dataBytes"); used == nil {
return nil, nil, errs.New(errs.ErrNoMetric, "logical_used")
}
if quota = data.GetMetric("policy.quotaObjectBytes"); quota == nil {
return nil, nil, errs.New(errs.ErrNoMetric, "logical_quota")
}
if usedPercent = data.GetMetric("used_percent"); usedPercent == nil {
if usedPercent, err = data.NewMetricFloat64("used_percent"); err == nil {
usedPercent.SetProperty("raw")
} else {
return nil, nil, err
}
}
tenantNamesByID = make(map[string]string)
for _, instance := range data.GetInstances() {
var (
usedBytes, quotaBytes, percentage float64
usedOK, quotaOK bool
)
usedBytes, usedOK = used.GetValueFloat64(instance)
quotaBytes, quotaOK = quota.GetValueFloat64(instance)
if usedOK && quotaOK {
percentage = usedBytes / quotaBytes * 100
if quotaBytes == 0 {
percentage = 0
}
err := usedPercent.SetValueFloat64(instance, percentage)
if err != nil {
t.Logger.Error().Err(err).Float64("percentage", percentage).Msg("failed to set percentage")
}
}
id := instance.GetLabel("id")
name := instance.GetLabel("tenant")
if id != "" && name != "" {
tenantNamesByID[id] = name
}
}
promMetrics := t.collectPromMetrics(tenantNamesByID)
return promMetrics, t.sg.client.Metadata, nil
}
func (t *Tenant) collectPromMetrics(tenantNamesByID map[string]string) []*matrix.Matrix {
metrics := make(map[string]*matrix.Matrix)
promMetrics := []string{
"storagegrid_tenant_usage_data_bytes",
"storagegrid_tenant_usage_quota_bytes",
}
for _, metric := range promMetrics {
mat, err := t.sg.GetMetric(metric, metric[lenOfPrefix:], tenantNamesByID)
if err != nil {
t.Logger.Error().Err(err).Str("metric", metric).Msg("Unable to get metric")
continue
}
mat.Object = "storagegrid"
metrics[metric] = mat
}
all := make([]*matrix.Matrix, 0, len(promMetrics))
for _, m := range metrics {
all = append(all, m)
}
return all
}