github.com/GuanceCloud/cliutils@v1.1.21/pipeline/stats/stats.go (about)

     1  // Unless explicitly stated otherwise all files in this repository are licensed
     2  // under the MIT License.
     3  // This product includes software developed at Guance Cloud (https://www.guance.com/).
     4  // Copyright 2021-present Guance, Inc.
     5  
     6  // Package stats used to record pl metrics
     7  package stats
     8  
     9  import (
    10  	"time"
    11  
    12  	"github.com/GuanceCloud/cliutils/logger"
    13  	"github.com/prometheus/client_golang/prometheus"
    14  )
    15  
    16  type EventOP string
    17  
    18  const (
    19  	StatsTimeFormat = "2006-01-02T15:04:05.999Z07:00"
    20  
    21  	EventOpAdd                EventOP = "ADD"
    22  	EventOpUpdate             EventOP = "UPDATE"
    23  	EventOpDelete             EventOP = "DELETE"
    24  	EventOpIndex              EventOP = "INDEX"
    25  	EventOpIndexUpdate        EventOP = "INDEX_UPDATE"
    26  	EventOpIndexDelete        EventOP = "INDEX_DELETE"
    27  	EventOpIndexDeleteAndBack EventOP = "INDEX_DELETE_AND_BACK"
    28  	EventOpCompileError       EventOP = "COMPILE_ERROR"
    29  
    30  	DefaultSubSystem = "pipeline"
    31  )
    32  
    33  var (
    34  	l = logger.DefaultSLogger("pl-stats")
    35  
    36  	_plstats Stats
    37  	_        Stats = (*RecStats)(nil)
    38  )
    39  
    40  func SetStats(st Stats) {
    41  	_plstats = st
    42  }
    43  
    44  func InitLog() {
    45  	l = logger.SLogger("pl-stats")
    46  }
    47  
    48  type Stats interface {
    49  	Metrics() []prometheus.Collector
    50  	WriteMetric(tags map[string]string, pt, ptDrop, ptError float64, cost time.Duration)
    51  
    52  	WriteEvent(event *ChangeEvent, tags map[string]string)
    53  	ReadEvents(events []*ChangeEvent) []*ChangeEvent
    54  
    55  	WriteUpdateTime(tags map[string]string)
    56  }
    57  
    58  func NewRecStats(ns, subsystem string, labelNames []string, eventSize int) *RecStats {
    59  	var lbs []string
    60  	mp := map[string]struct{}{}
    61  
    62  	for _, name := range labelNames {
    63  		if _, ok := mp[name]; !ok {
    64  			mp[name] = struct{}{}
    65  			lbs = append(lbs, name)
    66  		}
    67  	}
    68  	for _, name := range defaultLabelNames {
    69  		if _, ok := mp[name]; !ok {
    70  			mp[name] = struct{}{}
    71  			lbs = append(lbs, name)
    72  		}
    73  	}
    74  
    75  	return &RecStats{
    76  		metric: newRecMetric(ns, subsystem, lbs),
    77  		event:  newRecEvent(eventSize, lbs),
    78  	}
    79  }
    80  
    81  type RecStats struct {
    82  	metric *RecMetric
    83  	event  *RecEvent
    84  }
    85  
    86  func (stats *RecStats) Metrics() []prometheus.Collector {
    87  	return stats.metric.Metrics()
    88  }
    89  
    90  func (stats *RecStats) WriteEvent(event *ChangeEvent, tags map[string]string) {
    91  	stats.event.Write(event, tags)
    92  }
    93  
    94  func (stats *RecStats) WriteUpdateTime(tags map[string]string) {
    95  	stats.metric.WriteUpdateTime(tags)
    96  }
    97  
    98  func (stats *RecStats) WriteMetric(tags map[string]string, pt, ptDrop, ptError float64, cost time.Duration) {
    99  	stats.metric.WriteMetric(tags, pt, ptDrop, ptError, cost)
   100  }
   101  
   102  func (stats *RecStats) ReadEvents(events []*ChangeEvent) []*ChangeEvent {
   103  	return stats.event.Read(events)
   104  }
   105  
   106  func WriteEvent(event *ChangeEvent, tags map[string]string) {
   107  	if _plstats == nil {
   108  		return
   109  	}
   110  	_plstats.WriteEvent(event, tags)
   111  }
   112  
   113  func WriteUpdateTime(tags map[string]string) {
   114  	if _plstats == nil {
   115  		return
   116  	}
   117  	_plstats.WriteUpdateTime(tags)
   118  }
   119  
   120  func WriteMetric(tags map[string]string, pt, ptDrop, ptError float64, cost time.Duration) {
   121  	if _plstats == nil {
   122  		return
   123  	}
   124  	_plstats.WriteMetric(tags, pt, ptDrop, ptError, cost)
   125  }