Path: blob/main/pkg/integrations/cloudwatch_exporter/cloudwatch_exporter.go
5371 views
package cloudwatch_exporter12import (3"context"4"net/http"56"github.com/go-kit/log"7yace "github.com/nerdswords/yet-another-cloudwatch-exporter/pkg"8yaceConf "github.com/nerdswords/yet-another-cloudwatch-exporter/pkg/config"9yaceLog "github.com/nerdswords/yet-another-cloudwatch-exporter/pkg/logger"10yaceModel "github.com/nerdswords/yet-another-cloudwatch-exporter/pkg/model"11yaceSess "github.com/nerdswords/yet-another-cloudwatch-exporter/pkg/session"12"github.com/prometheus/client_golang/prometheus"13"github.com/prometheus/client_golang/prometheus/promhttp"1415"github.com/grafana/agent/pkg/integrations/config"16)1718// exporter wraps YACE entrypoint around an Integration implementation19type exporter struct {20name string21logger yaceLoggerWrapper22sessionCache yaceSess.SessionCache23scrapeConf yaceConf.ScrapeConf24}2526// newCloudwatchExporter creates a new YACE wrapper, that implements Integration27func newCloudwatchExporter(name string, logger log.Logger, conf yaceConf.ScrapeConf, fipsEnabled bool) *exporter {28loggerWrapper := yaceLoggerWrapper{29debug: false,30log: logger,31}32return &exporter{33name: name,34logger: loggerWrapper,35sessionCache: yaceSess.NewSessionCache(conf, fipsEnabled, loggerWrapper),36scrapeConf: conf,37}38}3940func (e *exporter) MetricsHandler() (http.Handler, error) {41// Wrapping in a handler so in every execution, a new registry is created and yace's entrypoint called42h := http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {43e.logger.Debug("Running collect in cloudwatch_exporter")4445reg := prometheus.NewRegistry()46cwSemaphore := make(chan struct{}, cloudWatchConcurrency)47tagSemaphore := make(chan struct{}, tagConcurrency)48observedMetricLabels := map[string]yaceModel.LabelSet{}49yace.UpdateMetrics(50context.Background(),51e.scrapeConf,52reg,53metricsPerQuery,54labelsSnakeCase,55cwSemaphore,56tagSemaphore,57e.sessionCache,58observedMetricLabels,59e.logger,60)6162// close concurrency channels63close(cwSemaphore)64close(tagSemaphore)6566promhttp.HandlerFor(reg, promhttp.HandlerOpts{}).ServeHTTP(w, req)67})68return h, nil69}7071func (e *exporter) ScrapeConfigs() []config.ScrapeConfig {72return []config.ScrapeConfig{{73JobName: e.name,74MetricsPath: "/metrics",75}}76}7778func (e *exporter) Run(ctx context.Context) error {79<-ctx.Done()80return nil81}8283// yaceLoggerWrapper is wrapper implementation of yaceLog.Logger, based out of a log.Logger.84type yaceLoggerWrapper struct {85log log.Logger8687// debug is just used for development purposes88debug bool89}9091func (l yaceLoggerWrapper) Info(message string, keyvals ...interface{}) {92l.log.Log(append([]interface{}{"level", "info", "msg", message}, keyvals...)...)93}9495func (l yaceLoggerWrapper) Debug(message string, keyvals ...interface{}) {96if l.debug {97l.log.Log(append([]interface{}{"level", "debug", "msg", message}, keyvals...)...)98}99}100101func (l yaceLoggerWrapper) Error(err error, message string, keyvals ...interface{}) {102l.log.Log(append([]interface{}{"level", "error", "msg", message, "err", err}, keyvals...)...)103}104105func (l yaceLoggerWrapper) Warn(message string, keyvals ...interface{}) {106l.log.Log(append([]interface{}{"level", "warn", "msg", message}, keyvals...)...)107}108109func (l yaceLoggerWrapper) With(keyvals ...interface{}) yaceLog.Logger {110withLog := log.With(l.log, keyvals)111return yaceLoggerWrapper{112log: withLog,113}114}115116func (l yaceLoggerWrapper) IsDebugEnabled() bool {117return l.debug118}119120121