-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmetric.go
65 lines (51 loc) · 1.11 KB
/
metric.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
package servertiming
import (
"fmt"
"strconv"
"strings"
"time"
)
type Metric struct {
Name string
Duration time.Duration
Desc string
Extra map[string]string
startTime time.Time
}
func (m *Metric) WithDesc(desc string) *Metric {
m.Desc = desc
return m
}
func (m *Metric) Start() *Metric {
m.startTime = time.Now()
return m
}
func (m *Metric) Stop() *Metric {
if !m.startTime.IsZero() {
m.Duration = time.Since(m.startTime)
}
return m
}
func (m *Metric) String() string {
parts := make([]string, 1, len(m.Extra)+3)
parts[0] = m.Name
if _, ok := m.Extra[paramNameDesc]; !ok && m.Desc != "" {
parts = append(parts, headerEncodeParam(paramNameDesc, m.Desc))
}
if _, ok := m.Extra[paramNameDur]; !ok && m.Duration > 0 {
parts = append(parts, headerEncodeParam(
paramNameDur,
strconv.FormatFloat(float64(m.Duration)/float64(time.Millisecond), 'f', -1, 64),
))
}
for k, v := range m.Extra {
parts = append(parts, headerEncodeParam(k, v))
}
return strings.Join(parts, ";")
}
func (m *Metric) GoString() string {
if m == nil {
return "nil"
}
return fmt.Sprintf("*%#v", *m)
}