Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
aos
GitHub Repository: aos/grafana-agent
Path: blob/main/component/prometheus/operator/configgen/config_gen.go
5389 views
1
package configgen
2
3
// SEE https://github.com/prometheus-operator/prometheus-operator/blob/aa8222d7e9b66e9293ed11c9291ea70173021029/pkg/prometheus/promcfg.go
4
5
import (
6
"fmt"
7
"regexp"
8
9
k8sConfig "github.com/grafana/agent/component/common/kubernetes"
10
promopv1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1"
11
commonConfig "github.com/prometheus/common/config"
12
"github.com/prometheus/common/model"
13
promk8s "github.com/prometheus/prometheus/discovery/kubernetes"
14
"github.com/prometheus/prometheus/model/relabel"
15
)
16
17
type ConfigGenerator struct {
18
Client *k8sConfig.ClientArguments
19
}
20
21
var (
22
invalidLabelCharRE = regexp.MustCompile(`[^a-zA-Z0-9_]`)
23
)
24
25
// generateK8SSDConfig generates a kubernetes service discovery config based on the given namespace selector.
26
// The k8s sd config is mostly dependent on our local config for accessing the kubernetes cluster.
27
// If undefined it will default to an in-cluster config
28
func (cg *ConfigGenerator) generateK8SSDConfig(namespaceSelector promopv1.NamespaceSelector, namespace string, role promk8s.Role, attachMetadata *promopv1.AttachMetadata) *promk8s.SDConfig {
29
cfg := &promk8s.SDConfig{
30
Role: role,
31
}
32
namespaces := cg.getNamespacesFromNamespaceSelector(namespaceSelector, namespace)
33
if len(namespaces) != 0 {
34
cfg.NamespaceDiscovery.Names = namespaces
35
}
36
client := cg.Client
37
if client.KubeConfig != "" {
38
cfg.KubeConfig = client.KubeConfig
39
}
40
if client.APIServer.URL != nil {
41
hCfg := client.HTTPClientConfig
42
cfg.APIServer = client.APIServer.Convert()
43
44
if hCfg.BasicAuth != nil {
45
cfg.HTTPClientConfig.BasicAuth = hCfg.BasicAuth.Convert()
46
}
47
48
if hCfg.BearerToken != "" {
49
cfg.HTTPClientConfig.BearerToken = commonConfig.Secret(hCfg.BearerToken)
50
}
51
if hCfg.BearerTokenFile != "" {
52
cfg.HTTPClientConfig.BearerTokenFile = hCfg.BearerTokenFile
53
}
54
cfg.HTTPClientConfig.TLSConfig = *hCfg.TLSConfig.Convert()
55
if hCfg.Authorization != nil {
56
if hCfg.Authorization.Type == "" {
57
hCfg.Authorization.Type = "Bearer"
58
}
59
cfg.HTTPClientConfig.Authorization = hCfg.Authorization.Convert()
60
}
61
}
62
if attachMetadata != nil {
63
cfg.AttachMetadata.Node = attachMetadata.Node
64
}
65
return cfg
66
}
67
68
func (cg *ConfigGenerator) generateSafeTLS(tls promopv1.SafeTLSConfig) (commonConfig.TLSConfig, error) {
69
tc := commonConfig.TLSConfig{}
70
tc.InsecureSkipVerify = tls.InsecureSkipVerify
71
72
if tls.CA.Secret != nil || tls.CA.ConfigMap != nil {
73
return tc, fmt.Errorf("loading ca certs no supported yet")
74
}
75
if tls.Cert.Secret != nil || tls.Cert.ConfigMap != nil {
76
return tc, fmt.Errorf("loading tls certs no supported yet")
77
}
78
if tls.KeySecret != nil {
79
return tc, fmt.Errorf("loading tls certs no supported yet")
80
}
81
if tls.ServerName != "" {
82
tc.ServerName = tls.ServerName
83
}
84
return tc, nil
85
}
86
87
type relabeler struct {
88
configs []*relabel.Config
89
}
90
91
// add adds a relabel config to the relabeler. It sets defaults from prometheus defaults.
92
func (r *relabeler) add(cfgs ...*relabel.Config) {
93
for _, cfg := range cfgs {
94
if cfg.Action == "" {
95
cfg.Action = relabel.DefaultRelabelConfig.Action
96
}
97
if cfg.Separator == "" {
98
cfg.Separator = relabel.DefaultRelabelConfig.Separator
99
}
100
if cfg.Regex.Regexp == nil {
101
cfg.Regex = relabel.DefaultRelabelConfig.Regex
102
}
103
if cfg.Replacement == "" {
104
cfg.Replacement = relabel.DefaultRelabelConfig.Replacement
105
}
106
r.configs = append(r.configs, cfg)
107
}
108
}
109
110
// addFromV1 converts from an externally generated monitoringv1 RelabelConfig. Used for converting relabel rules generated by external package
111
func (r *relabeler) addFromV1(cfgs ...*promopv1.RelabelConfig) (err error) {
112
for _, c := range cfgs {
113
cfg := &relabel.Config{}
114
for _, l := range c.SourceLabels {
115
cfg.SourceLabels = append(cfg.SourceLabels, model.LabelName(l))
116
}
117
if c.Separator != "" {
118
cfg.Separator = c.Separator
119
}
120
if c.TargetLabel != "" {
121
cfg.TargetLabel = c.TargetLabel
122
}
123
if c.Regex != "" {
124
cfg.Regex, err = relabel.NewRegexp(c.Regex)
125
if err != nil {
126
return err
127
}
128
}
129
if c.Modulus != 0 {
130
cfg.Modulus = c.Modulus
131
}
132
if c.Replacement != "" {
133
cfg.Replacement = c.Replacement
134
}
135
if c.Action != "" {
136
cfg.Action = relabel.Action(c.Action)
137
}
138
r.configs = append(r.configs, cfg)
139
}
140
return nil
141
}
142
143
func (cg *ConfigGenerator) initRelabelings() relabeler {
144
r := relabeler{}
145
// Relabel prometheus job name into a meta label
146
r.add(&relabel.Config{
147
SourceLabels: model.LabelNames{"job"},
148
TargetLabel: "__tmp_prometheus_job_name",
149
})
150
return r
151
}
152
153
func sanitizeLabelName(name string) model.LabelName {
154
return model.LabelName(invalidLabelCharRE.ReplaceAllString(name, "_"))
155
}
156
157
func (cg *ConfigGenerator) getNamespacesFromNamespaceSelector(nsel promopv1.NamespaceSelector, namespace string) []string {
158
if nsel.Any {
159
return []string{}
160
} else if len(nsel.MatchNames) == 0 {
161
return []string{namespace}
162
}
163
return nsel.MatchNames
164
}
165
166