Path: blob/main/pkg/integrations/azure_exporter/azure_exporter.go
5411 views
package azure_exporter12import (3"context"4"fmt"5"net/http"6"strings"78"github.com/prometheus/client_golang/prometheus"9"github.com/prometheus/client_golang/prometheus/promhttp"10"github.com/sirupsen/logrus"11azure_config "github.com/webdevops/azure-metrics-exporter/config"12"github.com/webdevops/azure-metrics-exporter/metrics"13"github.com/webdevops/go-common/azuresdk/armclient"1415"github.com/grafana/agent/pkg/integrations/config"16)1718type Exporter struct {19cfg Config20logger *logrus.Logger // used by azure client21ConcurrencyConfig azure_config.Opts22}2324func (e Exporter) MetricsHandler() (http.Handler, error) {25//Safe to re-use as it doesn't connect to anything directly26client, err := armclient.NewArmClientWithCloudName(e.cfg.AzureCloudEnvironment, e.logger)27if err != nil {28return nil, fmt.Errorf("failed to create azure client, %v", err)29}3031h := http.HandlerFunc(func(resp http.ResponseWriter, req *http.Request) {32reg := prometheus.NewRegistry()33ctx := context.Background()3435params := req.URL.Query()36mergedConfig := MergeConfigWithQueryParams(e.cfg, params)3738if err := mergedConfig.Validate(); err != nil {39err = fmt.Errorf("config to be used for scraping was invalid, %v", err)40e.logger.Error(err)41http.Error(resp, err.Error(), http.StatusBadRequest)42return43}4445logEntry := e.logger.WithFields(logrus.Fields{46"resource_type": mergedConfig.ResourceType,47"resource_graph_query_filter": mergedConfig.ResourceGraphQueryFilter,48"subscriptions": strings.Join(mergedConfig.Subscriptions, ","),49"metric_namespace": mergedConfig.MetricNamespace,50"metrics": strings.Join(mergedConfig.Metrics, ","),51})5253settings, err := mergedConfig.ToScrapeSettings()54if err != nil {55e.logger.Error(fmt.Errorf("unexpected error mapping config to scrape settings, %v", err))56http.Error(resp, "unexpected scrape error", http.StatusInternalServerError)57return58}5960prober := metrics.NewMetricProber(ctx, logEntry, nil, settings, e.ConcurrencyConfig)61prober.SetAzureClient(client)62prober.SetPrometheusRegistry(reg)6364err = prober.ServiceDiscovery.FindResourceGraph(ctx, settings.Subscriptions, settings.ResourceType, settings.Filter)65if err != nil {66e.logger.Error(fmt.Errorf("service discovery failed, %v", err))67http.Error(resp, "Failed to discovery azure resources", http.StatusInternalServerError)68return69}7071prober.Run()7273promhttp.HandlerFor(reg, promhttp.HandlerOpts{}).ServeHTTP(resp, req)74})75return h, nil76}7778func (e Exporter) ScrapeConfigs() []config.ScrapeConfig {79return []config.ScrapeConfig{{JobName: e.cfg.Name(), MetricsPath: "/metrics"}}80}8182func (e Exporter) Run(ctx context.Context) error {83<-ctx.Done()84return ctx.Err()85}868788