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 }