github.com/GuanceCloud/cliutils@v1.1.21/pipeline/stats/metric_event_test.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  	"sync"
    11  	"testing"
    12  	"time"
    13  
    14  	"github.com/GuanceCloud/cliutils/point"
    15  	"github.com/prometheus/client_golang/prometheus"
    16  	dto "github.com/prometheus/client_model/go"
    17  	"github.com/stretchr/testify/assert"
    18  )
    19  
    20  func TestPlChangeEvent(t *testing.T) {
    21  	stats := NewRecStats("pl", "test", defaultLabelNames, 100)
    22  
    23  	count := 0
    24  
    25  	var g sync.WaitGroup
    26  	g.Add(1)
    27  	go func() {
    28  		defer g.Done()
    29  		for {
    30  			if len(stats.event.ch) == 0 {
    31  				time.Sleep(time.Millisecond * 10)
    32  			} else {
    33  				break
    34  			}
    35  		}
    36  		for i := 0; i < 299; i++ {
    37  			select {
    38  			case <-stats.event.ReadChan():
    39  				count++
    40  			default:
    41  			}
    42  		}
    43  	}()
    44  
    45  	g.Add(1)
    46  	go func() {
    47  		defer g.Done()
    48  		for i := 0; i < 199; i++ {
    49  			stats.WriteEvent(&ChangeEvent{
    50  				Name: fmt.Sprintf("%d.p", i),
    51  				NS:   fmt.Sprintf("%d", i),
    52  				Op:   EventOpAdd,
    53  			}, nil)
    54  		}
    55  	}()
    56  	g.Wait()
    57  
    58  	assert.Less(t, 0, count)
    59  	stats = NewRecStats("pl", "test", defaultLabelNames, 100)
    60  
    61  	for i := 33; i < 256; i++ {
    62  		tmp := []*ChangeEvent{}
    63  		for j := 0; j < i%32; j++ {
    64  			c := ChangeEvent{
    65  				Name:     fmt.Sprint(i, ".p"),
    66  				Category: point.Category(i % 32), // for testing only
    67  				NS:       fmt.Sprint(i),
    68  				Time:     time.Now(),
    69  			}
    70  			stats.WriteEvent(&c, nil)
    71  			tmp = append(tmp, &c)
    72  		}
    73  
    74  		events := stats.event.Read(make([]*ChangeEvent, 0, i%32))
    75  		assert.Equal(t, tmp, events)
    76  	}
    77  }
    78  
    79  func TestCap(t *testing.T) {
    80  	var a []string = nil
    81  	assert.Equal(t, len(a), cap(a))
    82  }
    83  
    84  func TestMetric(t *testing.T) {
    85  	lb := []string{"name", "extra1", "extra2"}
    86  
    87  	// lb = append(lb, defaultLabelNames...)
    88  
    89  	stats := NewRecStats("pl", "test", lb, 100)
    90  	tags := map[string]string{
    91  		"ns":       "test",
    92  		"category": point.Metric.String(),
    93  		"name":     "test",
    94  		"extra1":   "test",
    95  		"extra2":   "test",
    96  	}
    97  	stats.WriteMetric(tags, 1, 1, 1, time.Millisecond)
    98  	stats.WriteUpdateTime(tags)
    99  
   100  	m := stats.Metrics()
   101  	ch := [](chan prometheus.Metric){}
   102  	for i := 0; i < len(m); i++ {
   103  		ch = append(ch, make(chan prometheus.Metric, 1))
   104  	}
   105  
   106  	for i, v := range m {
   107  		v.Collect(ch[i])
   108  	}
   109  
   110  	for _, c := range ch {
   111  		select {
   112  		case c := <-c:
   113  			m := dto.Metric{}
   114  			c.Write(&m)
   115  			assert.Equal(t, len(lb)+2, len(m.Label))
   116  			mp := map[string]struct{}{}
   117  			for _, v := range m.Label {
   118  				mp[v.GetName()] = struct{}{}
   119  			}
   120  			mpExp := map[string]struct{}{}
   121  			for _, v := range lb {
   122  				mpExp[v] = struct{}{}
   123  			}
   124  
   125  			mpExp["ns"] = struct{}{}
   126  			mpExp["category"] = struct{}{}
   127  
   128  			assert.Equal(t, mpExp, mp)
   129  
   130  			t.Log(m.String())
   131  			t.Log(c.Desc())
   132  		default:
   133  		}
   134  	}
   135  }