@@ -38,6 +38,8 @@ import (
3838 eventv1 "github.com/fluxcd/pkg/apis/event/v1beta1"
3939)
4040
41+ type eventContextKey struct {}
42+
4143// EventServer handles event POST requests
4244type EventServer struct {
4345 port string
@@ -63,8 +65,16 @@ func (s *EventServer) ListenAndServe(stopCh <-chan struct{}, mdlw middleware.Mid
6365 s .logger .Error (err , "Event server crashed" )
6466 os .Exit (1 )
6567 }
68+ var handler http.Handler = http .HandlerFunc (s .handleEvent ())
69+ for _ , middleware := range []func (http.Handler ) http.Handler {
70+ limitMiddleware .Handle ,
71+ s .logRateLimitMiddleware ,
72+ s .cleanupMetadataMiddleware ,
73+ } {
74+ handler = middleware (handler )
75+ }
6676 mux := http .NewServeMux ()
67- mux .Handle ("/" , s . logRateLimitMiddleware ( limitMiddleware . Handle ( http . HandlerFunc ( s . handleEvent ()))) )
77+ mux .Handle ("/" , handler )
6878 h := std .Handler ("" , mdlw , mux )
6979 srv := & http.Server {
7080 Addr : s .port ,
@@ -90,6 +100,59 @@ func (s *EventServer) ListenAndServe(stopCh <-chan struct{}, mdlw middleware.Mid
90100 }
91101}
92102
103+ // cleanupMetadataMiddleware cleans up the metadata using cleanupMetadata() and
104+ // adds the cleaned event in the request context which can then be queried and
105+ // used directly by the other http handlers.
106+ func (s * EventServer ) cleanupMetadataMiddleware (h http.Handler ) http.Handler {
107+ return http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
108+ body , err := io .ReadAll (r .Body )
109+ if err != nil {
110+ s .logger .Error (err , "reading the request body failed" )
111+ w .WriteHeader (http .StatusBadRequest )
112+ return
113+ }
114+ r .Body .Close ()
115+ r .Body = io .NopCloser (bytes .NewBuffer (body ))
116+
117+ event := & eventv1.Event {}
118+ err = json .Unmarshal (body , event )
119+ if err != nil {
120+ s .logger .Error (err , "decoding the request body failed" )
121+ w .WriteHeader (http .StatusBadRequest )
122+ return
123+ }
124+
125+ cleanupMetadata (event )
126+
127+ ctxWithEvent := context .WithValue (r .Context (), eventContextKey {}, event )
128+ reqWithEvent := r .WithContext (ctxWithEvent )
129+
130+ h .ServeHTTP (w , reqWithEvent )
131+ })
132+ }
133+
134+ // cleanupMetadata removes metadata entries which are not used for alerting.
135+ func cleanupMetadata (event * eventv1.Event ) {
136+ group := event .InvolvedObject .GetObjectKind ().GroupVersionKind ().Group
137+ excludeList := []string {
138+ fmt .Sprintf ("%s/%s" , group , eventv1 .MetaChecksumKey ),
139+ fmt .Sprintf ("%s/%s" , group , eventv1 .MetaDigestKey ),
140+ }
141+
142+ meta := make (map [string ]string )
143+ if event .Metadata != nil && len (event .Metadata ) > 0 {
144+ // Filter other meta based on group prefix, while filtering out excludes
145+ for key , val := range event .Metadata {
146+ if strings .HasPrefix (key , group ) && ! inList (excludeList , key ) {
147+ newKey := strings .TrimPrefix (key , fmt .Sprintf ("%s/" , group ))
148+ meta [newKey ] = val
149+ }
150+ }
151+ }
152+
153+ event .Metadata = meta
154+ }
155+
93156type statusRecorder struct {
94157 http.ResponseWriter
95158 Status int
@@ -109,23 +172,7 @@ func (s *EventServer) logRateLimitMiddleware(h http.Handler) http.Handler {
109172 h .ServeHTTP (recorder , r )
110173
111174 if recorder .Status == http .StatusTooManyRequests {
112- body , err := io .ReadAll (r .Body )
113- if err != nil {
114- s .logger .Error (err , "reading the request body failed" )
115- w .WriteHeader (http .StatusBadRequest )
116- return
117- }
118-
119- event := & eventv1.Event {}
120- err = json .Unmarshal (body , event )
121- if err != nil {
122- s .logger .Error (err , "decoding the request body failed" )
123- w .WriteHeader (http .StatusBadRequest )
124- return
125- }
126-
127- r .Body = io .NopCloser (bytes .NewBuffer (body ))
128-
175+ event := r .Context ().Value (eventContextKey {}).(* eventv1.Event )
129176 s .logger .V (1 ).Info ("Discarding event, rate limiting duplicate events" ,
130177 "reconciler kind" , event .InvolvedObject .Kind ,
131178 "name" , event .InvolvedObject .Name ,
@@ -135,24 +182,21 @@ func (s *EventServer) logRateLimitMiddleware(h http.Handler) http.Handler {
135182}
136183
137184func eventKeyFunc (r * http.Request ) (string , error ) {
138- body , err := io .ReadAll (r .Body )
139- if err != nil {
140- return "" , err
185+ event := r .Context ().Value (eventContextKey {}).(* eventv1.Event )
186+
187+ comps := []string {
188+ "event" ,
189+ event .InvolvedObject .Name ,
190+ event .InvolvedObject .Namespace ,
191+ event .InvolvedObject .Kind ,
192+ event .Message ,
141193 }
142194
143- event := & eventv1.Event {}
144- err = json .Unmarshal (body , event )
145- if err != nil {
146- return "" , err
147- }
148-
149- r .Body = io .NopCloser (bytes .NewBuffer (body ))
150-
151- comps := []string {"event" , event .InvolvedObject .Name , event .InvolvedObject .Namespace , event .InvolvedObject .Kind , event .Message }
152195 revString , ok := event .Metadata [eventv1 .MetaRevisionKey ]
153196 if ok {
154197 comps = append (comps , revString )
155198 }
199+
156200 val := strings .Join (comps , "/" )
157201 digest := sha256 .Sum256 ([]byte (val ))
158202 return fmt .Sprintf ("%x" , digest ), nil
0 commit comments