github.com/GuanceCloud/cliutils@v1.1.21/pipeline/stats/event.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 7 8 import ( 9 "fmt" 10 "time" 11 12 "github.com/GuanceCloud/cliutils/point" 13 ) 14 15 type RecEvent struct { 16 labelNames []string 17 18 size int 19 ch chan *ChangeEvent 20 } 21 22 func newRecEvent(size int, labelNames []string) *RecEvent { 23 if size <= 0 { 24 size = 256 25 } 26 return &RecEvent{ 27 labelNames: labelNames, 28 29 size: size, 30 ch: make(chan *ChangeEvent, size), 31 } 32 } 33 34 func (event *RecEvent) Write(change *ChangeEvent, tags map[string]string) { 35 if change == nil { 36 return 37 } 38 39 if len(event.labelNames) != 0 { 40 if change.extraTags == nil { 41 change.extraTags = make([][2]string, 0, len(event.labelNames)) 42 } 43 44 for _, name := range event.labelNames { 45 switch name { 46 case "ns", "category", "name": 47 default: 48 if v, ok := tags[name]; ok { 49 change.extraTags = append(change.extraTags, [2]string{name, v}) 50 } 51 } 52 } 53 } 54 55 l.Info(change) 56 57 for { 58 select { 59 case event.ch <- change: 60 return 61 default: 62 <-event.ch 63 } 64 } 65 } 66 67 func (event *RecEvent) Read(events []*ChangeEvent) []*ChangeEvent { 68 if cap(events) == 0 { 69 events = make([]*ChangeEvent, 0, 8) 70 } 71 72 if len(events) == cap(events) { 73 return events 74 } 75 76 for { 77 select { 78 case e := <-event.ch: 79 events = append(events, e) 80 if len(events) > cap(events) || len(events) >= event.size { 81 return events 82 } 83 default: 84 return events 85 } 86 } 87 } 88 89 func (event *RecEvent) ReadChan() <-chan *ChangeEvent { 90 return event.ch 91 } 92 93 type ChangeEvent struct { 94 Name string 95 Category point.Category 96 NS, NSOld string 97 Script, ScriptOld string 98 99 Op EventOP // 100 101 extraTags [][2]string 102 103 CompileError string 104 Time time.Time 105 } 106 107 func (event ChangeEvent) String() string { 108 ns := event.NS 109 if event.NSOld != "" && event.NS != event.NSOld { 110 ns = event.NSOld + "->" + ns 111 } 112 ret := fmt.Sprintf("ScriptStore %s %s category: %s, ns: %s, script_name: %s, extraTags: %v", 113 event.Time.Format(StatsTimeFormat), event.Op, event.Category, ns, event.Name, event.extraTags) 114 115 if event.CompileError != "" { 116 ret += ", compile_error: " + event.CompileError 117 } 118 return ret 119 }