@@ -22,6 +22,7 @@ import (
2222 "github.com/golang/glog"
2323 "github.com/heptiolabs/eventrouter/sinks"
2424 "github.com/prometheus/client_golang/prometheus"
25+ "github.com/spf13/cast"
2526 "github.com/spf13/viper"
2627
2728 v1 "k8s.io/api/core/v1"
@@ -90,10 +91,14 @@ type EventRouter struct {
9091 // event sink
9192 // TODO: Determine if we want to support multiple sinks.
9293 eSink sinks.EventSinkInterface
94+
95+ lastSeenResourceVersion string
96+ lastResourceVersionPosition func (string )
9397}
9498
9599// NewEventRouter will create a new event router using the input params
96- func NewEventRouter (kubeClient kubernetes.Interface , eventsInformer coreinformers.EventInformer ) * EventRouter {
100+ func NewEventRouter (kubeClient kubernetes.Interface , eventsInformer coreinformers.EventInformer ,
101+ lastSeenResourceVersion string , lastResourceVersionPosition func (rv string )) * EventRouter {
97102 if viper .GetBool ("enable-prometheus" ) {
98103 prometheus .MustRegister (kubernetesWarningEventCounterVec )
99104 prometheus .MustRegister (kubernetesNormalEventCounterVec )
@@ -102,8 +107,10 @@ func NewEventRouter(kubeClient kubernetes.Interface, eventsInformer coreinformer
102107 }
103108
104109 er := & EventRouter {
105- kubeClient : kubeClient ,
106- eSink : sinks .ManufactureSink (),
110+ kubeClient : kubeClient ,
111+ eSink : sinks .ManufactureSink (),
112+ lastSeenResourceVersion : lastSeenResourceVersion ,
113+ lastResourceVersionPosition : lastResourceVersionPosition ,
107114 }
108115 eventsInformer .Informer ().AddEventHandler (cache.ResourceEventHandlerFuncs {
109116 AddFunc : er .addEvent ,
@@ -133,16 +140,26 @@ func (er *EventRouter) Run(stopCh <-chan struct{}) {
133140// addEvent is called when an event is created, or during the initial list
134141func (er * EventRouter ) addEvent (obj interface {}) {
135142 e := obj .(* v1.Event )
136- prometheusEvent (e )
137- er .eSink .UpdateEvents (e , nil )
143+ if cast .ToInt (er .lastSeenResourceVersion ) < cast .ToInt (e .ResourceVersion ) {
144+ prometheusEvent (e )
145+ er .eSink .UpdateEvents (e , nil )
146+ er .lastResourceVersionPosition (e .ResourceVersion )
147+ } else {
148+ glog .V (5 ).Infof ("Event had already been processed:\n %v" , e )
149+ }
138150}
139151
140152// updateEvent is called any time there is an update to an existing event
141153func (er * EventRouter ) updateEvent (objOld interface {}, objNew interface {}) {
142154 eOld := objOld .(* v1.Event )
143155 eNew := objNew .(* v1.Event )
144- prometheusEvent (eNew )
145- er .eSink .UpdateEvents (eNew , eOld )
156+ if cast .ToInt (er .lastSeenResourceVersion ) < cast .ToInt (eNew .ResourceVersion ) {
157+ prometheusEvent (eNew )
158+ er .eSink .UpdateEvents (eNew , eOld )
159+ er .lastResourceVersionPosition (eNew .ResourceVersion )
160+ } else {
161+ glog .V (5 ).Infof ("Event had already been processed:\n %v" , eNew )
162+ }
146163}
147164
148165// prometheusEvent is called when an event is added or updated
0 commit comments