-
Notifications
You must be signed in to change notification settings - Fork 17
/
Copy pathexample_test.go
59 lines (51 loc) · 1.1 KB
/
example_test.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
package logfmt_test
import (
"bytes"
"fmt"
"github.com/kr/logfmt"
"log"
"strconv"
)
type Measurement struct {
Key string
Val float64
Unit string // (e.g. ms, MB, etc)
}
type Measurements []*Measurement
var measurePrefix = []byte("measure.")
func (mm *Measurements) HandleLogfmt(key, val []byte) error {
if !bytes.HasPrefix(key, measurePrefix) {
return nil
}
i := bytes.LastIndexFunc(val, isDigit)
v, err := strconv.ParseFloat(string(val[:i+1]), 10)
if err != nil {
return err
}
m := &Measurement{
Key: string(key[len(measurePrefix):]),
Val: v,
Unit: string(val[i+1:]),
}
*mm = append(*mm, m)
return nil
}
// return true if r is an ASCII digit only, as opposed to unicode.IsDigit.
func isDigit(r rune) bool {
return '0' <= r && r <= '9'
}
func Example_customHandler() {
var data = []byte("measure.a=1ms measure.b=10 measure.c=100MB measure.d=1s garbage")
mm := make(Measurements, 0)
if err := logfmt.Unmarshal(data, &mm); err != nil {
log.Fatalf("err=%q", err)
}
for _, m := range mm {
fmt.Printf("%v\n", *m)
}
// Output:
// {a 1 ms}
// {b 10 }
// {c 100 MB}
// {d 1 s}
}