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  }