-
Notifications
You must be signed in to change notification settings - Fork 24
/
otel-config.go
82 lines (73 loc) · 2.93 KB
/
otel-config.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
package controller
import (
"crypto/tls"
promapi "github.com/prometheus/client_golang/api"
controllerconfig "github.com/fluxninja/aperture/v2/cmd/aperture-controller/config"
"github.com/fluxninja/aperture/v2/pkg/config"
"github.com/fluxninja/aperture/v2/pkg/net/listener"
otelconfig "github.com/fluxninja/aperture/v2/pkg/otelcollector/config"
otelconsts "github.com/fluxninja/aperture/v2/pkg/otelcollector/consts"
)
func provideController(
unmarshaller config.Unmarshaller,
lis *listener.Listener,
promClient promapi.Client,
tlsConfig *tls.Config,
) (*otelconfig.Provider, error) {
var controllerCfg controllerconfig.ControllerOTelConfig
if err := unmarshaller.UnmarshalKey("otel", &controllerCfg); err != nil {
return nil, err
}
otelCfg := otelconfig.New()
otelCfg.SetDebugPort(&controllerCfg.CommonOTelConfig)
otelCfg.AddDebugExtensions(&controllerCfg.CommonOTelConfig)
addMetricsPipeline(otelCfg, &controllerCfg, tlsConfig, lis, promClient)
otelCfg.AddExporter(otelconsts.ExporterLogging, nil)
otelconfig.AddAlertsPipeline(otelCfg, controllerCfg.CommonOTelConfig)
return otelconfig.NewProvider("service", otelCfg), nil
}
// addMetricsPipeline adds metrics to pipeline for controller OTel collector.
func addMetricsPipeline(
config *otelconfig.Config,
controllerConfig *controllerconfig.ControllerOTelConfig,
tlsConfig *tls.Config,
lis *listener.Listener,
promClient promapi.Client,
) {
addPrometheusReceiver(config, controllerConfig, tlsConfig, lis)
otelconfig.AddPrometheusRemoteWriteExporter(config, promClient)
processors := []string{}
if !controllerConfig.EnableHighCardinalityPlatformMetrics {
otelconfig.AddHighCardinalityMetricsFilterProcessor(config)
// Prepending processor so we drop metrics as soon as possible without any unnecessary operation on them.
processors = append([]string{otelconsts.ProcessorFilterHighCardinalityMetrics}, processors...)
}
config.Service.AddPipeline("metrics/controller-fast", otelconfig.Pipeline{
Receivers: []string{otelconsts.ReceiverPrometheus},
Processors: processors,
Exporters: []string{otelconsts.ExporterPrometheusRemoteWrite, otelconsts.ExporterLogging},
})
}
func addPrometheusReceiver(
config *otelconfig.Config,
controllerConfig *controllerconfig.ControllerOTelConfig,
tlsConfig *tls.Config,
lis *listener.Listener,
) {
scrapeConfigs := []map[string]any{
otelconfig.BuildApertureSelfScrapeConfig("aperture-controller-self", tlsConfig, lis),
otelconfig.BuildOTelScrapeConfig("aperture-controller-otel", controllerConfig.CommonOTelConfig),
}
// Unfortunately prometheus config structs do not have proper `mapstructure`
// tags, so they are not properly read by OTel. Need to use bare maps instead.
config.AddReceiver(otelconsts.ReceiverPrometheus, map[string]any{
"config": map[string]any{
"global": map[string]any{
"scrape_interval": "10s",
"scrape_timeout": "1s",
"evaluation_interval": "1m",
},
"scrape_configs": scrapeConfigs,
},
})
}