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  }