This repository has been archived by the owner on Mar 11, 2024. It is now read-only.
/
collector.go
70 lines (62 loc) · 1.81 KB
/
collector.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
package collector
import (
"context"
"github.com/clambin/fluxcd-exporter/internal/flux"
"github.com/prometheus/client_golang/prometheus"
"k8s.io/client-go/rest"
"log/slog"
"sync"
)
var resourceInfoMetric = prometheus.NewDesc(
prometheus.BuildFQName("gotk", "resource", "info"),
"TODO",
[]string{"name", "exported_namespace", "customresource_kind", "ready"},
nil,
)
var defaultListers = []func(config *rest.Config, logger *slog.Logger) flux.Lister{
flux.Kustomizations,
flux.HelmReleases,
flux.GitRepositories,
flux.HelmRepositories,
flux.Buckets,
}
type Collector struct {
Config *rest.Config
Logger *slog.Logger
listers []func(config *rest.Config, logger *slog.Logger) flux.Lister
}
func (c Collector) Describe(ch chan<- *prometheus.Desc) {
ch <- resourceInfoMetric
}
func (c Collector) Collect(ch chan<- prometheus.Metric) {
listers := c.listers
if listers == nil {
listers = defaultListers
}
var wg sync.WaitGroup
for _, lister := range listers {
wg.Add(1)
go func(lister func(config *rest.Config, logger *slog.Logger) flux.Lister) {
defer wg.Done()
c.getResources(lister(c.Config, c.Logger), ch)
}(lister)
}
wg.Wait()
}
func (c Collector) getResources(l flux.Lister, ch chan<- prometheus.Metric) {
fluxResources, err := l.List(context.Background())
if err != nil {
c.Logger.Error("failed to get flux metrics", "err", err)
ch <- prometheus.NewInvalidMetric(prometheus.NewDesc("fluxcd_exporter_error", "Error getting custom resource status", nil, nil), err)
return
}
for _, fluxResource := range fluxResources {
c.Logger.Debug("flux custom resource found", "custom_resource", fluxResource)
ch <- prometheus.MustNewConstMetric(resourceInfoMetric, prometheus.GaugeValue, 1.0,
fluxResource.Name,
fluxResource.Namespace,
fluxResource.Kind,
fluxResource.Conditions["ready"],
)
}
}