github.com/pyroscope-io/godeltaprof@v0.1.3-0.20230906152420-0d7eeca7b8c1/example/main.go (about)

     1  package main
     2  
     3  import (
     4  	"bytes"
     5  	"fmt"
     6  	"net/http"
     7  	_ "net/http/pprof"
     8  	"runtime"
     9  	"sync"
    10  	"time"
    11  
    12  	"github.com/pyroscope-io/godeltaprof"
    13  	_ "github.com/pyroscope-io/godeltaprof/http/pprof"
    14  )
    15  
    16  //go:noinline
    17  func work(n int) {
    18  	// revive:disable:empty-block this is fine because this is a example app, not real production code
    19  	for i := 0; i < n; i++ {
    20  	}
    21  	fmt.Printf("work\n")
    22  	// revive:enable:empty-block
    23  }
    24  
    25  var m sync.Mutex
    26  
    27  func fastFunction(wg *sync.WaitGroup) {
    28  	m.Lock()
    29  	defer m.Unlock()
    30  
    31  	work(200000000)
    32  
    33  	wg.Done()
    34  }
    35  
    36  func slowFunction(wg *sync.WaitGroup) {
    37  	m.Lock()
    38  	defer m.Unlock()
    39  
    40  	work(800000000)
    41  	wg.Done()
    42  }
    43  
    44  func main() {
    45  	go func() {
    46  		err := http.ListenAndServe("localhost:6060", http.DefaultServeMux)
    47  		if err != nil {
    48  			panic(err)
    49  		}
    50  	}()
    51  	go func() {
    52  		var deltaHeapProfiler = godeltaprof.NewHeapProfiler()
    53  		var deltaBlockProfiler = godeltaprof.NewBlockProfiler()
    54  		var deltaMutexProfiler = godeltaprof.NewMutexProfiler()
    55  		for {
    56  			time.Sleep(10 * time.Second)
    57  			deltaHeapProfiler.Profile(bytes.NewBuffer(nil))
    58  			deltaBlockProfiler.Profile(bytes.NewBuffer(nil))
    59  			deltaMutexProfiler.Profile(bytes.NewBuffer(nil))
    60  		}
    61  	}()
    62  	runtime.SetMutexProfileFraction(5)
    63  	runtime.SetBlockProfileRate(5)
    64  
    65  	for {
    66  		wg := sync.WaitGroup{}
    67  		wg.Add(2)
    68  		go fastFunction(&wg)
    69  		go slowFunction(&wg)
    70  		wg.Wait()
    71  	}
    72  }