Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
aos
GitHub Repository: aos/grafana-agent
Path: blob/main/pkg/integrations/cloudwatch_exporter/cloudwatch_exporter.go
5371 views
1
package cloudwatch_exporter
2
3
import (
4
"context"
5
"net/http"
6
7
"github.com/go-kit/log"
8
yace "github.com/nerdswords/yet-another-cloudwatch-exporter/pkg"
9
yaceConf "github.com/nerdswords/yet-another-cloudwatch-exporter/pkg/config"
10
yaceLog "github.com/nerdswords/yet-another-cloudwatch-exporter/pkg/logger"
11
yaceModel "github.com/nerdswords/yet-another-cloudwatch-exporter/pkg/model"
12
yaceSess "github.com/nerdswords/yet-another-cloudwatch-exporter/pkg/session"
13
"github.com/prometheus/client_golang/prometheus"
14
"github.com/prometheus/client_golang/prometheus/promhttp"
15
16
"github.com/grafana/agent/pkg/integrations/config"
17
)
18
19
// exporter wraps YACE entrypoint around an Integration implementation
20
type exporter struct {
21
name string
22
logger yaceLoggerWrapper
23
sessionCache yaceSess.SessionCache
24
scrapeConf yaceConf.ScrapeConf
25
}
26
27
// newCloudwatchExporter creates a new YACE wrapper, that implements Integration
28
func newCloudwatchExporter(name string, logger log.Logger, conf yaceConf.ScrapeConf, fipsEnabled bool) *exporter {
29
loggerWrapper := yaceLoggerWrapper{
30
debug: false,
31
log: logger,
32
}
33
return &exporter{
34
name: name,
35
logger: loggerWrapper,
36
sessionCache: yaceSess.NewSessionCache(conf, fipsEnabled, loggerWrapper),
37
scrapeConf: conf,
38
}
39
}
40
41
func (e *exporter) MetricsHandler() (http.Handler, error) {
42
// Wrapping in a handler so in every execution, a new registry is created and yace's entrypoint called
43
h := http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
44
e.logger.Debug("Running collect in cloudwatch_exporter")
45
46
reg := prometheus.NewRegistry()
47
cwSemaphore := make(chan struct{}, cloudWatchConcurrency)
48
tagSemaphore := make(chan struct{}, tagConcurrency)
49
observedMetricLabels := map[string]yaceModel.LabelSet{}
50
yace.UpdateMetrics(
51
context.Background(),
52
e.scrapeConf,
53
reg,
54
metricsPerQuery,
55
labelsSnakeCase,
56
cwSemaphore,
57
tagSemaphore,
58
e.sessionCache,
59
observedMetricLabels,
60
e.logger,
61
)
62
63
// close concurrency channels
64
close(cwSemaphore)
65
close(tagSemaphore)
66
67
promhttp.HandlerFor(reg, promhttp.HandlerOpts{}).ServeHTTP(w, req)
68
})
69
return h, nil
70
}
71
72
func (e *exporter) ScrapeConfigs() []config.ScrapeConfig {
73
return []config.ScrapeConfig{{
74
JobName: e.name,
75
MetricsPath: "/metrics",
76
}}
77
}
78
79
func (e *exporter) Run(ctx context.Context) error {
80
<-ctx.Done()
81
return nil
82
}
83
84
// yaceLoggerWrapper is wrapper implementation of yaceLog.Logger, based out of a log.Logger.
85
type yaceLoggerWrapper struct {
86
log log.Logger
87
88
// debug is just used for development purposes
89
debug bool
90
}
91
92
func (l yaceLoggerWrapper) Info(message string, keyvals ...interface{}) {
93
l.log.Log(append([]interface{}{"level", "info", "msg", message}, keyvals...)...)
94
}
95
96
func (l yaceLoggerWrapper) Debug(message string, keyvals ...interface{}) {
97
if l.debug {
98
l.log.Log(append([]interface{}{"level", "debug", "msg", message}, keyvals...)...)
99
}
100
}
101
102
func (l yaceLoggerWrapper) Error(err error, message string, keyvals ...interface{}) {
103
l.log.Log(append([]interface{}{"level", "error", "msg", message, "err", err}, keyvals...)...)
104
}
105
106
func (l yaceLoggerWrapper) Warn(message string, keyvals ...interface{}) {
107
l.log.Log(append([]interface{}{"level", "warn", "msg", message}, keyvals...)...)
108
}
109
110
func (l yaceLoggerWrapper) With(keyvals ...interface{}) yaceLog.Logger {
111
withLog := log.With(l.log, keyvals)
112
return yaceLoggerWrapper{
113
log: withLog,
114
}
115
}
116
117
func (l yaceLoggerWrapper) IsDebugEnabled() bool {
118
return l.debug
119
}
120
121