github.com/TrueBlocks/trueblocks-core/src/apps/chifra@v0.0.0-20241022031540-b362680128f7/pkg/logger/timer.go (about)

     1  package logger
     2  
     3  import (
     4  	"fmt"
     5  	"os"
     6  	"strings"
     7  	"time"
     8  )
     9  
    10  var perfTiming bool
    11  
    12  func init() {
    13  	perfTiming = os.Getenv("TB_TIMER_ON") == "true"
    14  }
    15  
    16  type Timer struct {
    17  	start      time.Time
    18  	lastReport time.Time
    19  	verbose    bool
    20  	level      int
    21  }
    22  
    23  func NewTimer() Timer {
    24  	now := time.Now()
    25  	return Timer{
    26  		start:      now,
    27  		lastReport: now,
    28  		verbose:    false,
    29  		level:      0,
    30  	}
    31  }
    32  
    33  func (t *Timer) Level(l int) {
    34  	t.level = l
    35  }
    36  
    37  func (t *Timer) LevelUp() {
    38  	t.level++
    39  }
    40  
    41  func (t *Timer) LevelDown() {
    42  	if t.level > 0 {
    43  		t.level--
    44  	}
    45  }
    46  
    47  func (t *Timer) Report(msg string) {
    48  	if !perfTiming {
    49  		return
    50  	}
    51  	since := time.Since(t.start)
    52  	diff := time.Since(t.lastReport)
    53  	if t.verbose {
    54  		Info(msg, "start", t.start)
    55  		Info(msg, "stop", time.Now())
    56  		Info(msg, "since", since)
    57  		Info(msg, "diff", diff)
    58  	}
    59  
    60  	name := os.Getenv("TB_TIMER_NAME")
    61  	if len(name) > 0 {
    62  		msg = strings.Replace(msg, "chifra ", "", -1) + "_" + name
    63  	}
    64  
    65  	max := func(x, y int64) int64 {
    66  		if x > y {
    67  			return x
    68  		}
    69  		return y
    70  	}
    71  
    72  	// nItems := 0
    73  	fmt.Printf("PERF,%s%s,%d,%d\n", strings.Repeat("_", t.level), msg, max(1, since.Milliseconds()), max(1, diff.Milliseconds()))
    74  
    75  	t.lastReport = time.Now()
    76  }