github.com/crowdsecurity/crowdsec@v1.6.1/cmd/crowdsec/pour.go (about) 1 package main 2 3 import ( 4 "fmt" 5 "time" 6 7 "github.com/prometheus/client_golang/prometheus" 8 log "github.com/sirupsen/logrus" 9 10 "github.com/crowdsecurity/crowdsec/pkg/csconfig" 11 leaky "github.com/crowdsecurity/crowdsec/pkg/leakybucket" 12 "github.com/crowdsecurity/crowdsec/pkg/types" 13 ) 14 15 func runPour(input chan types.Event, holders []leaky.BucketFactory, buckets *leaky.Buckets, cConfig *csconfig.Config) error { 16 count := 0 17 18 for { 19 // bucket is now ready 20 select { 21 case <-bucketsTomb.Dying(): 22 log.Infof("Bucket routine exiting") 23 return nil 24 case parsed := <-input: 25 startTime := time.Now() 26 27 count++ 28 if count%5000 == 0 { 29 log.Infof("%d existing buckets", leaky.LeakyRoutineCount) 30 // when in forensics mode, garbage collect buckets 31 if cConfig.Crowdsec.BucketsGCEnabled { 32 if parsed.MarshaledTime != "" { 33 z := &time.Time{} 34 if err := z.UnmarshalText([]byte(parsed.MarshaledTime)); err != nil { 35 log.Warningf("Failed to unmarshal time from event '%s' : %s", parsed.MarshaledTime, err) 36 } else { 37 log.Warning("Starting buckets garbage collection ...") 38 39 if err = leaky.GarbageCollectBuckets(*z, buckets); err != nil { 40 return fmt.Errorf("failed to start bucket GC : %w", err) 41 } 42 } 43 } 44 } 45 } 46 // here we can bucketify with parsed 47 poured, err := leaky.PourItemToHolders(parsed, holders, buckets) 48 if err != nil { 49 log.Errorf("bucketify failed for: %v", parsed) 50 continue 51 } 52 53 elapsed := time.Since(startTime) 54 globalPourHistogram.With(prometheus.Labels{"type": parsed.Line.Module, "source": parsed.Line.Src}).Observe(elapsed.Seconds()) 55 56 if poured { 57 globalBucketPourOk.Inc() 58 } else { 59 globalBucketPourKo.Inc() 60 } 61 62 if len(parsed.MarshaledTime) != 0 { 63 if err := lastProcessedItem.UnmarshalText([]byte(parsed.MarshaledTime)); err != nil { 64 log.Warningf("failed to unmarshal time from event : %s", err) 65 } 66 } 67 } 68 } 69 }