/
storage.go
82 lines (72 loc) · 1.84 KB
/
storage.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
package collector
import (
"context"
"log"
"sync"
"github.com/DazWilkin/gcp-exporter/gcp"
"github.com/prometheus/client_golang/prometheus"
"google.golang.org/api/cloudresourcemanager/v1"
"google.golang.org/api/storage/v1"
)
// StorageCollector represents Cloud Storage
type StorageCollector struct {
account *gcp.Account
Buckets *prometheus.Desc
}
// NewStorageCollector returns a StorageCollector
func NewStorageCollector(account *gcp.Account) *StorageCollector {
fqName := name("storage")
return &StorageCollector{
account: account,
Buckets: prometheus.NewDesc(
fqName("buckets"),
"Number of buckets",
[]string{
"project",
// "region",
},
nil,
),
}
}
// Collect implements Prometheus' Collector inteface and is used to collect metrics
func (c *StorageCollector) Collect(ch chan<- prometheus.Metric) {
ctx := context.Background()
storageService, err := storage.NewService(ctx)
if err != nil {
log.Println(err)
return
}
// Enumerate all of the projects
var wg sync.WaitGroup
for _, p := range c.account.Projects {
wg.Add(1)
go func(p *cloudresourcemanager.Project) {
defer wg.Done()
log.Printf("[StorageCollector] Project: %s", p.ProjectId)
resp, err := storageService.Buckets.List(p.ProjectId).MaxResults(500).Context(ctx).Do()
if err != nil {
log.Println(err)
return
}
if resp.NextPageToken != "" {
log.Println("[StorageCollector] Some buckets are being excluded from the results")
}
// for _, b := range resp.Items {
// }
ch <- prometheus.MustNewConstMetric(
c.Buckets,
prometheus.GaugeValue,
float64(len(resp.Items)),
[]string{
p.ProjectId,
}...,
)
}(p)
}
wg.Wait()
}
// Describe implements Prometheus' Collector interface and is used to describe metrics
func (c *StorageCollector) Describe(ch chan<- *prometheus.Desc) {
ch <- c.Buckets
}