Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
aos
GitHub Repository: aos/grafana-agent
Path: blob/main/pkg/integrations/azure_exporter/azure_exporter.go
5411 views
1
package azure_exporter
2
3
import (
4
"context"
5
"fmt"
6
"net/http"
7
"strings"
8
9
"github.com/prometheus/client_golang/prometheus"
10
"github.com/prometheus/client_golang/prometheus/promhttp"
11
"github.com/sirupsen/logrus"
12
azure_config "github.com/webdevops/azure-metrics-exporter/config"
13
"github.com/webdevops/azure-metrics-exporter/metrics"
14
"github.com/webdevops/go-common/azuresdk/armclient"
15
16
"github.com/grafana/agent/pkg/integrations/config"
17
)
18
19
type Exporter struct {
20
cfg Config
21
logger *logrus.Logger // used by azure client
22
ConcurrencyConfig azure_config.Opts
23
}
24
25
func (e Exporter) MetricsHandler() (http.Handler, error) {
26
//Safe to re-use as it doesn't connect to anything directly
27
client, err := armclient.NewArmClientWithCloudName(e.cfg.AzureCloudEnvironment, e.logger)
28
if err != nil {
29
return nil, fmt.Errorf("failed to create azure client, %v", err)
30
}
31
32
h := http.HandlerFunc(func(resp http.ResponseWriter, req *http.Request) {
33
reg := prometheus.NewRegistry()
34
ctx := context.Background()
35
36
params := req.URL.Query()
37
mergedConfig := MergeConfigWithQueryParams(e.cfg, params)
38
39
if err := mergedConfig.Validate(); err != nil {
40
err = fmt.Errorf("config to be used for scraping was invalid, %v", err)
41
e.logger.Error(err)
42
http.Error(resp, err.Error(), http.StatusBadRequest)
43
return
44
}
45
46
logEntry := e.logger.WithFields(logrus.Fields{
47
"resource_type": mergedConfig.ResourceType,
48
"resource_graph_query_filter": mergedConfig.ResourceGraphQueryFilter,
49
"subscriptions": strings.Join(mergedConfig.Subscriptions, ","),
50
"metric_namespace": mergedConfig.MetricNamespace,
51
"metrics": strings.Join(mergedConfig.Metrics, ","),
52
})
53
54
settings, err := mergedConfig.ToScrapeSettings()
55
if err != nil {
56
e.logger.Error(fmt.Errorf("unexpected error mapping config to scrape settings, %v", err))
57
http.Error(resp, "unexpected scrape error", http.StatusInternalServerError)
58
return
59
}
60
61
prober := metrics.NewMetricProber(ctx, logEntry, nil, settings, e.ConcurrencyConfig)
62
prober.SetAzureClient(client)
63
prober.SetPrometheusRegistry(reg)
64
65
err = prober.ServiceDiscovery.FindResourceGraph(ctx, settings.Subscriptions, settings.ResourceType, settings.Filter)
66
if err != nil {
67
e.logger.Error(fmt.Errorf("service discovery failed, %v", err))
68
http.Error(resp, "Failed to discovery azure resources", http.StatusInternalServerError)
69
return
70
}
71
72
prober.Run()
73
74
promhttp.HandlerFor(reg, promhttp.HandlerOpts{}).ServeHTTP(resp, req)
75
})
76
return h, nil
77
}
78
79
func (e Exporter) ScrapeConfigs() []config.ScrapeConfig {
80
return []config.ScrapeConfig{{JobName: e.cfg.Name(), MetricsPath: "/metrics"}}
81
}
82
83
func (e Exporter) Run(ctx context.Context) error {
84
<-ctx.Done()
85
return ctx.Err()
86
}
87
88