github.com/tirogen/go-ethereum@v1.10.12-0.20221226051715-250cfede41b6/metrics/metrics_test.go (about)

     1  package metrics
     2  
     3  import (
     4  	"fmt"
     5  	"sync"
     6  	"testing"
     7  	"time"
     8  )
     9  
    10  const FANOUT = 128
    11  
    12  func TestReadRuntimeValues(t *testing.T) {
    13  	var v runtimeStats
    14  	readRuntimeStats(&v)
    15  	t.Logf("%+v", v)
    16  }
    17  
    18  func BenchmarkMetrics(b *testing.B) {
    19  	r := NewRegistry()
    20  	c := NewRegisteredCounter("counter", r)
    21  	g := NewRegisteredGauge("gauge", r)
    22  	gf := NewRegisteredGaugeFloat64("gaugefloat64", r)
    23  	h := NewRegisteredHistogram("histogram", r, NewUniformSample(100))
    24  	m := NewRegisteredMeter("meter", r)
    25  	t := NewRegisteredTimer("timer", r)
    26  	RegisterDebugGCStats(r)
    27  	b.ResetTimer()
    28  	ch := make(chan bool)
    29  
    30  	wgD := &sync.WaitGroup{}
    31  	/*
    32  		wgD.Add(1)
    33  		go func() {
    34  			defer wgD.Done()
    35  			//log.Println("go CaptureDebugGCStats")
    36  			for {
    37  				select {
    38  				case <-ch:
    39  					//log.Println("done CaptureDebugGCStats")
    40  					return
    41  				default:
    42  					CaptureDebugGCStatsOnce(r)
    43  				}
    44  			}
    45  		}()
    46  	//*/
    47  
    48  	wgW := &sync.WaitGroup{}
    49  	/*
    50  		wgW.Add(1)
    51  		go func() {
    52  			defer wgW.Done()
    53  			//log.Println("go Write")
    54  			for {
    55  				select {
    56  				case <-ch:
    57  					//log.Println("done Write")
    58  					return
    59  				default:
    60  					WriteOnce(r, io.Discard)
    61  				}
    62  			}
    63  		}()
    64  	//*/
    65  
    66  	wg := &sync.WaitGroup{}
    67  	wg.Add(FANOUT)
    68  	for i := 0; i < FANOUT; i++ {
    69  		go func(i int) {
    70  			defer wg.Done()
    71  			//log.Println("go", i)
    72  			for i := 0; i < b.N; i++ {
    73  				c.Inc(1)
    74  				g.Update(int64(i))
    75  				gf.Update(float64(i))
    76  				h.Update(int64(i))
    77  				m.Mark(1)
    78  				t.Update(1)
    79  			}
    80  			//log.Println("done", i)
    81  		}(i)
    82  	}
    83  	wg.Wait()
    84  	close(ch)
    85  	wgD.Wait()
    86  	wgW.Wait()
    87  }
    88  
    89  func Example() {
    90  	c := NewCounter()
    91  	Register("money", c)
    92  	c.Inc(17)
    93  
    94  	// Threadsafe registration
    95  	t := GetOrRegisterTimer("db.get.latency", nil)
    96  	t.Time(func() { time.Sleep(10 * time.Millisecond) })
    97  	t.Update(1)
    98  
    99  	fmt.Println(c.Count())
   100  	fmt.Println(t.Min())
   101  	// Output: 17
   102  	// 1
   103  }