forked from curator-go/curator
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtrace.go
79 lines (61 loc) · 1.49 KB
/
trace.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
package curator
import (
"sync"
"time"
)
// Mechanism for timing methods and recording counters
type TracerDriver interface {
// Record the given trace event
AddTime(name string, d time.Duration)
// Add to a named counter
AddCount(name string, increment int)
}
type Tracer interface {
Commit()
}
type defaultTracerDriver struct {
TracerDriver
logger func(fmt string, args ...interface{})
lock sync.Mutex
counters map[string]int
}
func newDefaultTracerDriver() *defaultTracerDriver {
return &defaultTracerDriver{counters: make(map[string]int)}
}
func (d *defaultTracerDriver) AddTime(name string, time time.Duration) {
if d.logger != nil {
d.logger("Trace %s: %s", name, time)
}
}
func (d *defaultTracerDriver) AddCount(name string, increment int) {
d.lock.Lock()
value, _ := d.counters[name]
value += increment
d.counters[name] = value
d.lock.Unlock()
if d.logger != nil {
d.logger("Counter %s: %d + %d", name, value-increment, increment)
}
}
// Utility to time a method or portion of code
type timeTracer struct {
name string
driver TracerDriver
startTime time.Time
}
// Create and start a timer
func newTimeTracer(name string, driver TracerDriver) *timeTracer {
return &timeTracer{
name: name,
driver: driver,
startTime: time.Now(),
}
}
// Record the elapsed time
func (t *timeTracer) Commit() {
t.CommitAt(time.Now())
}
// Record the elapsed time
func (t *timeTracer) CommitAt(tm time.Time) {
t.driver.AddTime(t.name, tm.Sub(t.startTime))
}