/
tracehlp.go
77 lines (65 loc) · 2.17 KB
/
tracehlp.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
/*
Copyright 2016 Tamás Gulácsi
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package tracehlp
import (
"fmt"
"io"
"github.com/opentracing/basictracer-go"
"github.com/opentracing/opentracing-go"
"github.com/tgulacsi/go/loghlp"
)
// NewLoggerTracer returns a new basictracer with the given processName and Log function.
func NewLoggerTracer(processName string, Log func(keyvals ...interface{}) error) opentracing.Tracer {
return basictracer.New(NewLoggerRecorder(processName, Log))
}
// LoggerRecorder implements the basictracer.Recorder interface.
type LoggerRecorder struct {
tags map[string]string
Log func(keyvals ...interface{}) error
processName string
}
// NewLoggerRecorder returns a LoggerRecorder for the given `processName`.
func NewLoggerRecorder(processName string, Log func(keyvals ...interface{}) error) *LoggerRecorder {
return &LoggerRecorder{
processName: processName,
tags: make(map[string]string),
Log: Log,
}
}
// ProcessName returns the process name.
func (t *LoggerRecorder) ProcessName() string { return t.processName }
// SetTag sets a tag.
func (t *LoggerRecorder) SetTag(key string, val interface{}) *LoggerRecorder {
t.tags[key] = fmt.Sprint(val)
return t
}
// RecordSpan complies with the basictracer.Recorder interface.
func (t *LoggerRecorder) RecordSpan(span basictracer.RawSpan) {
if t.Log == nil {
return
}
t.Log(
"msg", "record span",
"operation", span.Operation,
"start", span.Start,
"duration", span.Duration,
//"context", span.Context,
"baggage", span.Context.Baggage,
"logs", loghlp.LazyW(func(w io.Writer) {
for i, l := range span.Logs {
fmt.Fprintf(w, "%d:{%v @ %v} ",
i, l.Timestamp, l.Fields)
}
},
))
}