func (t *Trace) LogIfLong(threshold time.Duration) {
	if time.Since(t.startTime) >= threshold {
		stepThreshold := threshold / time.Duration(len(t.steps)+1)
		t.logWithStepThreshold(stepThreshold)
	}
}
LogIfLong is used to dump steps that took longer than its share
package trace
import (
	"bytes"
	"fmt"
	"math/rand"
	"time"
	"k8s.io/klog"
)
type Field struct {
	Key   string
	Value interface{}
}
func (f Field) format() string {
	return fmt.Sprintf("%s:%v", f.Key, f.Value)
}
func writeFields(b *bytes.Buffer, l []Field) {
	for i, f := range l {
		b.WriteString(f.format())
		if i < len(l)-1 {
			b.WriteString(",")
		}
	}
}
type traceStep struct {
	stepTime time.Time
	msg      string
	fields   []Field
}
type Trace struct {
	name      string
	fields    []Field
	startTime time.Time
	steps     []traceStep
}
func New(name string, fields ...Field) *Trace {
	return &Trace{name: name, startTime: time.Now(), fields: fields}
}
func (t *Trace) Step(msg string, fields ...Field) {
	if t.steps == nil {
		t.steps = make([]traceStep, 0, 6)
	}
	t.steps = append(t.steps, traceStep{stepTime: time.Now(), msg: msg, fields: fields})
}
func (t *Trace) Log() {
	t.logWithStepThreshold(0)
}
func (t *Trace) logWithStepThreshold(stepThreshold time.Duration) {
	var buffer bytes.Buffer
	tracenum := rand.Int31()
	endTime := time.Now()
	totalTime := endTime.Sub(t.startTime)
	buffer.WriteString(fmt.Sprintf("Trace[%d]: %q ", tracenum, t.name))
	if len(t.fields) > 0 {
		writeFields(&buffer, t.fields)
		buffer.WriteString(" ")
	}
	buffer.WriteString(fmt.Sprintf("(started: %v) (total time: %v):\n", t.startTime, totalTime))
	lastStepTime := t.startTime
	for _, step := range t.steps {
		stepDuration := step.stepTime.Sub(lastStepTime)
		if stepThreshold == 0 || stepDuration > stepThreshold || klog.V(4) {
			buffer.WriteString(fmt.Sprintf("Trace[%d]: [%v] [%v] ", tracenum, step.stepTime.Sub(t.startTime), stepDuration))
			buffer.WriteString(step.msg)
			if len(step.fields) > 0 {
				buffer.WriteString(" ")
				writeFields(&buffer, step.fields)
			}
			buffer.WriteString("\n")
		}
		lastStepTime = step.stepTime
	}
	stepDuration := endTime.Sub(lastStepTime)
	if stepThreshold == 0 || stepDuration > stepThreshold || klog.V(4) {
		buffer.WriteString(fmt.Sprintf("Trace[%d]: [%v] [%v] END\n", tracenum, endTime.Sub(t.startTime), stepDuration))
	}
	klog.Info(buffer.String())
}