github.com/yankunsam/loki/v2@v2.6.3-0.20220817130409-389df5235c27/pkg/usagestats/stats_test.go (about)

     1  package usagestats
     2  
     3  import (
     4  	"runtime"
     5  	"sync"
     6  	"testing"
     7  	"time"
     8  
     9  	"github.com/grafana/loki/pkg/util/build"
    10  
    11  	"github.com/google/uuid"
    12  	jsoniter "github.com/json-iterator/go"
    13  	"github.com/stretchr/testify/require"
    14  )
    15  
    16  func Test_BuildReport(t *testing.T) {
    17  	now := time.Now()
    18  	seed := &ClusterSeed{
    19  		UID:       uuid.New().String(),
    20  		CreatedAt: now,
    21  	}
    22  
    23  	Edition("non-OSS")
    24  	Edition("OSS")
    25  	Target("distributor")
    26  	Target("compactor")
    27  	NewString("compression").Set("snappy")
    28  	NewString("compression").Set("lz4")
    29  	NewInt("compression_ratio").Set(50)
    30  	NewInt("compression_ratio").Set(100)
    31  	NewFloat("size_mb").Set(100.1)
    32  	NewFloat("size_mb").Set(200.1)
    33  	NewCounter("lines_written").Inc(200)
    34  	s := NewStatistics("query_throughput")
    35  	s.Record(25)
    36  	s = NewStatistics("query_throughput")
    37  	s.Record(300)
    38  	s.Record(5)
    39  	w := NewWordCounter("active_tenants")
    40  	w.Add("buz")
    41  	w = NewWordCounter("active_tenants")
    42  	w.Add("foo")
    43  	w.Add("bar")
    44  	w.Add("foo")
    45  
    46  	r := buildReport(seed, now.Add(time.Hour))
    47  	require.Equal(t, r.Arch, runtime.GOARCH)
    48  	require.Equal(t, r.Os, runtime.GOOS)
    49  	require.Equal(t, r.PrometheusVersion, build.GetVersion())
    50  	require.Equal(t, r.Edition, "OSS")
    51  	require.Equal(t, r.Target, "compactor")
    52  	require.Equal(t, r.Metrics["num_cpu"], runtime.NumCPU())
    53  	// Don't check num_goroutine because it could have changed since the report was created.
    54  	require.Equal(t, r.Metrics["compression"], "lz4")
    55  	require.Equal(t, r.Metrics["compression_ratio"], int64(100))
    56  	require.Equal(t, r.Metrics["size_mb"], 200.1)
    57  	require.Equal(t, r.Metrics["lines_written"].(map[string]interface{})["total"], int64(200))
    58  	require.Equal(t, r.Metrics["query_throughput"].(map[string]interface{})["min"], float64(5))
    59  	require.Equal(t, r.Metrics["query_throughput"].(map[string]interface{})["max"], float64(300))
    60  	require.Equal(t, r.Metrics["query_throughput"].(map[string]interface{})["count"], int64(3))
    61  	require.Equal(t, r.Metrics["query_throughput"].(map[string]interface{})["avg"], float64(25+300+5)/3)
    62  	require.Equal(t, r.Metrics["active_tenants"], int64(3))
    63  
    64  	out, _ := jsoniter.MarshalIndent(r, "", " ")
    65  	t.Log(string(out))
    66  }
    67  
    68  func TestCounter(t *testing.T) {
    69  	c := NewCounter("test_counter")
    70  	c.Inc(100)
    71  	c.Inc(200)
    72  	c.Inc(300)
    73  	time.Sleep(1 * time.Second)
    74  	c.updateRate()
    75  	v := c.Value()
    76  	require.Equal(t, int64(600), v["total"])
    77  	require.GreaterOrEqual(t, v["rate"], float64(590))
    78  	c.reset()
    79  	require.Equal(t, int64(0), c.Value()["total"])
    80  	require.Equal(t, float64(0), c.Value()["rate"])
    81  }
    82  
    83  func TestStatistic(t *testing.T) {
    84  	s := NewStatistics("test_stats")
    85  	s.Record(100)
    86  	s.Record(200)
    87  	s.Record(300)
    88  	v := s.Value()
    89  	require.Equal(t, float64(100), v["min"])
    90  	require.Equal(t, float64(300), v["max"])
    91  	require.Equal(t, int64(3), v["count"])
    92  	require.Equal(t, float64(100+200+300)/3, v["avg"])
    93  	require.Equal(t, float64(81.64965809277261), v["stddev"])
    94  	require.Equal(t, float64(6666.666666666667), v["stdvar"])
    95  }
    96  
    97  func TestWordCounter(t *testing.T) {
    98  	w := NewWordCounter("test_words_count")
    99  	var wg sync.WaitGroup
   100  	for i := 0; i < 100; i++ {
   101  		wg.Add(1)
   102  		go func() {
   103  			defer wg.Done()
   104  			w.Add("foo")
   105  			w.Add("bar")
   106  			w.Add("foo")
   107  		}()
   108  	}
   109  	wg.Wait()
   110  	require.Equal(t, int64(2), w.Value())
   111  }
   112  
   113  func TestPanics(t *testing.T) {
   114  	require.Panics(t, func() {
   115  		NewStatistics("panicstats")
   116  		NewWordCounter("panicstats")
   117  	})
   118  
   119  	require.Panics(t, func() {
   120  		NewWordCounter("panicwordcounter")
   121  		NewCounter("panicwordcounter")
   122  	})
   123  
   124  	require.Panics(t, func() {
   125  		NewCounter("paniccounter")
   126  		NewStatistics("paniccounter")
   127  	})
   128  
   129  	require.Panics(t, func() {
   130  		NewFloat("panicfloat")
   131  		NewInt("panicfloat")
   132  	})
   133  
   134  	require.Panics(t, func() {
   135  		NewInt("panicint")
   136  		NewString("panicint")
   137  	})
   138  
   139  	require.Panics(t, func() {
   140  		NewString("panicstring")
   141  		NewFloat("panicstring")
   142  	})
   143  
   144  	require.Panics(t, func() {
   145  		NewFloat(targetKey)
   146  		Target("new target")
   147  	})
   148  
   149  	require.Panics(t, func() {
   150  		NewFloat(editionKey)
   151  		Edition("new edition")
   152  	})
   153  }