@@ -3,6 +3,7 @@ package main
33import (
44 "context"
55 "crypto/tls"
6+ "errors"
67 "flag"
78 "fmt"
89 "log/slog"
@@ -33,8 +34,10 @@ import (
3334 "github.com/rancher-sandbox/runtime-enforcer/internal/customloggers/httpserverlogger"
3435 "github.com/rancher-sandbox/runtime-enforcer/internal/events"
3536 "github.com/rancher-sandbox/runtime-enforcer/internal/grpcexporter"
37+ "github.com/rancher-sandbox/runtime-enforcer/internal/metrics"
3638
3739 otellog "go.opentelemetry.io/otel/log"
40+ "go.opentelemetry.io/otel/metric"
3841 // +kubebuilder:scaffold:imports
3942)
4043
@@ -295,26 +298,65 @@ func getMetricsServerOptions(logger *slog.Logger, config *Config) (*certwatcher.
295298 return metricsCertWatcher , metricsServerOptions
296299}
297300
298- func setupOtel (ctx context.Context , slogger * slog.Logger , config * Config ) (func (context.Context ) error , error ) {
301+ func setupOtel (
302+ ctx context.Context ,
303+ slogger * slog.Logger ,
304+ config * Config ,
305+ ) (func (context.Context ) error , error ) {
306+ if config .otlpEndpoint == "" {
307+ return func (context.Context ) error { return nil }, nil
308+ }
309+
299310 var err error
300- var eventShutdown func (context.Context ) error
301- if config .otlpEndpoint != "" {
302- var eventLogger otellog.Logger
303- eventLogger , eventShutdown , err = events .Init (
304- ctx ,
305- config .otlpEndpoint ,
306- config .otlpCACert ,
307- config .otlpClientCert ,
308- config .otlpClientKey ,
309- config .otlpProtocol ,
310- )
311- if err != nil {
312- return nil , fmt .Errorf ("failed to initialize otel: %w" , err )
313- }
314- config .wpStatusSyncConfig .EventLogger = eventLogger
315- slogger .InfoContext (ctx , "OTLP telemetry enabled" , "endpoint" , config .otlpEndpoint )
311+ var eventShutdown , metricShutdown func (context.Context ) error
312+ var eventLogger otellog.Logger
313+ var activeViolationsGauge metric.Int64Gauge
314+ var shutdowns []func (context.Context ) error
315+
316+ eventLogger , eventShutdown , err = events .Init (
317+ ctx ,
318+ config .otlpEndpoint ,
319+ config .otlpCACert ,
320+ config .otlpClientCert ,
321+ config .otlpClientKey ,
322+ config .otlpProtocol ,
323+ )
324+ if err != nil {
325+ return nil , fmt .Errorf ("failed to initialize otel logs: %w" , err )
316326 }
317- return eventShutdown , nil
327+ config .wpStatusSyncConfig .EventLogger = eventLogger
328+ shutdowns = append (shutdowns , eventShutdown )
329+
330+ activeViolationsGauge , metricShutdown , err = metrics .Init (
331+ ctx ,
332+ config .otlpEndpoint ,
333+ config .otlpCACert ,
334+ config .otlpClientCert ,
335+ config .otlpClientKey ,
336+ config .otlpProtocol ,
337+ config .wpStatusSyncConfig .UpdateInterval ,
338+ )
339+ if err != nil {
340+ _ = eventShutdown (ctx )
341+ return nil , fmt .Errorf ("failed to initialize otel metrics: %w" , err )
342+ }
343+ config .wpStatusSyncConfig .ActiveViolationsGauge = activeViolationsGauge
344+ shutdowns = append (shutdowns , metricShutdown )
345+
346+ slogger .InfoContext (ctx , "OTLP telemetry enabled" , "endpoint" , config .otlpEndpoint )
347+
348+ return func (shutdownCtx context.Context ) error {
349+ var errs error
350+ for _ , shutdown := range shutdowns {
351+ if shutdown == nil {
352+ continue
353+ }
354+ if shutdownErr := shutdown (shutdownCtx ); shutdownErr != nil {
355+ errs = errors .Join (errs , shutdownErr )
356+ }
357+ }
358+ return errs
359+ }, nil
318360}
319361
320362func main () {
@@ -366,9 +408,9 @@ func main() {
366408 os .Exit (1 )
367409 }
368410
369- var eventShutdown func (context.Context ) error
411+ var otelShutdown func (context.Context ) error
370412
371- eventShutdown , err = setupOtel (ctx , slogger , & config )
413+ otelShutdown , err = setupOtel (ctx , slogger , & config )
372414 if err != nil {
373415 setupLog .Error (err , "failed to setup otel" )
374416 os .Exit (1 )
@@ -404,9 +446,9 @@ func main() {
404446 os .Exit (1 )
405447 }
406448
407- if eventShutdown != nil {
408- if err = eventShutdown (ctx ); err != nil {
409- slogger .ErrorContext (ctx , "failed to shutdown violation event pipeline" , "error" , err )
449+ if otelShutdown != nil {
450+ if err = otelShutdown (ctx ); err != nil {
451+ slogger .ErrorContext (ctx , "failed to shutdown otel telemetry pipeline" , "error" , err )
410452 }
411453 }
412454}
0 commit comments