1
0
Fork 0
mirror of https://github.com/kyverno/kyverno.git synced 2025-03-31 03:45:17 +00:00

fix: panic when disable metrics is true (#5366)

Signed-off-by: Charles-Edouard Brétéché <charles.edouard@nirmata.com>

Signed-off-by: Charles-Edouard Brétéché <charles.edouard@nirmata.com>
This commit is contained in:
Charles-Edouard Brétéché 2022-11-17 06:29:32 +01:00 committed by GitHub
parent 0fb45ed53a
commit 0c189b9bcb
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 32 additions and 43 deletions

View file

@ -19,29 +19,38 @@ func InitMetrics(
kubeClient kubernetes.Interface,
log logr.Logger,
) (*MetricsConfig, *http.ServeMux, *controller.Controller, error) {
var metricsConfig *MetricsConfig
var err error
var metricsServerMux *http.ServeMux
var pusher *controller.Controller
metricsConfig := new(MetricsConfig)
metricsConfig.Log = log
metricsConfig.Config = metricsConfigData
metricsConfig, err = initializeMetrics(metricsConfig)
if err != nil {
log.Error(err, "Failed initializing metrics")
return nil, nil, nil, err
}
if !disableMetricsExport {
if otel == "grpc" {
// Otlpgrpc metrics will be served on port 4317: default port for otlpgrpcmetrics
log.V(2).Info("Enabling Metrics for Kyverno", "address", metricsAddr)
endpoint := otelCollector + metricsAddr
metricsConfig, pusher, err = NewOTLPGRPCConfig(
pusher, err = NewOTLPGRPCConfig(
endpoint,
metricsConfigData,
transportCreds,
kubeClient,
log,
)
if err != nil {
return nil, nil, pusher, err
return nil, nil, nil, err
}
} else if otel == "prometheus" {
// Prometheus Server will serve metrics on metrics-port
metricsConfig, metricsServerMux, err = NewPrometheusConfig(metricsConfigData, log)
metricsServerMux, err = NewPrometheusConfig(log)
if err != nil {
return nil, nil, pusher, err

View file

@ -107,18 +107,20 @@ func initializeMetrics(m *MetricsConfig) (*MetricsConfig, error) {
}
func ShutDownController(ctx context.Context, pusher *controller.Controller) {
// pushes any last exports to the receiver
if err := pusher.Stop(ctx); err != nil {
otel.Handle(err)
if pusher != nil {
// pushes any last exports to the receiver
if err := pusher.Stop(ctx); err != nil {
otel.Handle(err)
}
}
}
func NewOTLPGRPCConfig(endpoint string,
metricsConfigData *kconfig.MetricsConfigData,
func NewOTLPGRPCConfig(
endpoint string,
certs string,
kubeClient kubernetes.Interface,
log logr.Logger,
) (*MetricsConfig, *controller.Controller, error) {
) (*controller.Controller, error) {
ctx := context.Background()
var client otlpmetric.Client
@ -127,7 +129,7 @@ func NewOTLPGRPCConfig(endpoint string,
transportCreds, err := kube.FetchCert(ctx, certs, kubeClient)
if err != nil {
log.Error(err, "Error fetching certificate from secret")
return nil, nil, err
return nil, err
}
client = otlpmetricgrpc.NewClient(
@ -145,7 +147,7 @@ func NewOTLPGRPCConfig(endpoint string,
metricExp, err := otlpmetric.New(ctx, client)
if err != nil {
log.Error(err, "Failed to create the collector exporter")
return nil, nil, err
return nil, err
}
res, err := resource.New(context.Background(),
@ -154,7 +156,7 @@ func NewOTLPGRPCConfig(endpoint string,
)
if err != nil {
log.Error(err, "failed creating resource")
return nil, nil, err
return nil, err
}
// create controller and bind the exporter with it
@ -170,27 +172,17 @@ func NewOTLPGRPCConfig(endpoint string,
)
global.SetMeterProvider(pusher)
m := new(MetricsConfig)
m.Log = log
m.Config = metricsConfigData
m, err = initializeMetrics(m)
if err != nil {
log.Error(err, "Failed initializing metrics")
return nil, nil, err
}
if err := pusher.Start(ctx); err != nil {
log.Error(err, "could not start metric exporter")
return nil, nil, err
return nil, err
}
return m, pusher, nil
return pusher, nil
}
func NewPrometheusConfig(metricsConfigData *kconfig.MetricsConfigData,
func NewPrometheusConfig(
log logr.Logger,
) (*MetricsConfig, *http.ServeMux, error) {
) (*http.ServeMux, error) {
config := prometheus.Config{}
res, err := resource.New(context.Background(),
resource.WithAttributes(semconv.ServiceNameKey.String("kyverno-svc-metrics")),
@ -199,7 +191,7 @@ func NewPrometheusConfig(metricsConfigData *kconfig.MetricsConfigData,
)
if err != nil {
log.Error(err, "failed creating resource")
return nil, nil, err
return nil, err
}
c := controller.New(
@ -215,27 +207,15 @@ func NewPrometheusConfig(metricsConfigData *kconfig.MetricsConfigData,
exporter, err := prometheus.New(config, c)
if err != nil {
log.Error(err, "failed to initialize prometheus exporter")
return nil, nil, err
return nil, err
}
global.SetMeterProvider(exporter.MeterProvider())
// Create new config object and attach metricsConfig to it
m := new(MetricsConfig)
m.Config = metricsConfigData
// Initialize metrics logger
m.Log = log
m, err = initializeMetrics(m)
if err != nil {
log.Error(err, "failed to initialize metrics config")
return nil, nil, err
}
metricsServerMux := http.NewServeMux()
metricsServerMux.HandleFunc("/metrics", exporter.ServeHTTP)
return m, metricsServerMux, nil
return metricsServerMux, nil
}
func (m *MetricsConfig) RecordPolicyResults(policyValidationMode PolicyValidationMode, policyType PolicyType, policyBackgroundMode PolicyBackgroundMode, policyNamespace string, policyName string,