github.com/dbernstein1/tyk@v2.9.0-beta9-dl-apic+incompatible/gateway/monitor.go (about)

     1  package gateway
     2  
     3  import (
     4  	"time"
     5  
     6  	"github.com/TykTechnologies/tyk/config"
     7  	"github.com/TykTechnologies/tyk/user"
     8  )
     9  
    10  type Monitor struct{}
    11  
    12  func (Monitor) Enabled() bool {
    13  	return config.Global().Monitor.EnableTriggerMonitors
    14  }
    15  
    16  func (Monitor) Fire(sessionData *user.SessionState, key string, triggerLimit, usagePercentage float64) {
    17  	em := config.EventMessage{
    18  		Type: EventTriggerExceeded,
    19  		Meta: EventTriggerExceededMeta{
    20  			EventMetaDefault: EventMetaDefault{Message: "Quota trigger reached"},
    21  			OrgID:            sessionData.OrgID,
    22  			Key:              key,
    23  			TriggerLimit:     int64(triggerLimit),
    24  			UsagePercentage:  int64(usagePercentage),
    25  		},
    26  		TimeStamp: time.Now().String(),
    27  	}
    28  
    29  	go MonitoringHandler.HandleEvent(em)
    30  }
    31  
    32  func (m Monitor) Check(sessionData *user.SessionState, key string) {
    33  	if !m.Enabled() || sessionData.QuotaMax == -1 {
    34  		return
    35  	}
    36  
    37  	remainder := sessionData.QuotaMax - sessionData.QuotaRemaining
    38  	usagePerc := (float64(remainder) / float64(sessionData.QuotaMax)) * 100.0
    39  
    40  	log.Debug("Perc is: ", usagePerc)
    41  	renewalDate := time.Unix(sessionData.QuotaRenews, 0)
    42  
    43  	log.Debug("Now is: ", time.Now())
    44  	log.Debug("Renewal is: ", renewalDate)
    45  	if time.Now().After(renewalDate) {
    46  		// Make sure that renewal is still in the future, If renewal is in the past,
    47  		// then the quota can expire and will auto-renew
    48  		log.Debug("Renewal date is in the past, skipping")
    49  		return
    50  	}
    51  
    52  	if config.Global().Monitor.GlobalTriggerLimit > 0.0 && usagePerc >= config.Global().Monitor.GlobalTriggerLimit {
    53  		log.Info("Firing...")
    54  		m.Fire(sessionData, key, config.Global().Monitor.GlobalTriggerLimit, usagePerc)
    55  	}
    56  
    57  	for _, triggerLimit := range sessionData.Monitor.TriggerLimits {
    58  		if usagePerc >= triggerLimit && triggerLimit != config.Global().Monitor.GlobalTriggerLimit {
    59  			log.Info("Firing...")
    60  			m.Fire(sessionData, key, triggerLimit, usagePerc)
    61  			break
    62  		}
    63  	}
    64  }