...
1 package oc
2
3 import (
4 "github.com/sirupsen/logrus"
5 "go.opencensus.io/trace"
6 "google.golang.org/grpc/codes"
7
8 "github.com/Microsoft/hcsshim/internal/log"
9 "github.com/Microsoft/hcsshim/internal/logfields"
10 )
11
12 const spanMessage = "Span"
13
14 var _errorCodeKey = logrus.ErrorKey + "Code"
15
16
17
18 type LogrusExporter struct{}
19
20 var _ trace.Exporter = &LogrusExporter{}
21
22
23
24
25
26
27
28
29
30
31
32 func (le *LogrusExporter) ExportSpan(s *trace.SpanData) {
33 if s.DroppedAnnotationCount > 0 {
34 logrus.WithFields(logrus.Fields{
35 "name": s.Name,
36 logfields.TraceID: s.TraceID.String(),
37 logfields.SpanID: s.SpanID.String(),
38 "dropped": s.DroppedAttributeCount,
39 "maxAttributes": len(s.Attributes),
40 }).Warning("span had dropped attributes")
41 }
42
43 entry := log.L.Dup()
44
45
46
47
48
49 data := make(logrus.Fields, len(entry.Data)+len(s.Attributes)+10)
50
51
52 for k, v := range entry.Data {
53 data[k] = v
54 }
55 for k, v := range s.Attributes {
56 data[k] = v
57 }
58
59 data[logfields.Name] = s.Name
60 data[logfields.TraceID] = s.TraceID.String()
61 data[logfields.SpanID] = s.SpanID.String()
62 data[logfields.ParentSpanID] = s.ParentSpanID.String()
63 data[logfields.StartTime] = s.StartTime
64 data[logfields.EndTime] = s.EndTime
65 data[logfields.Duration] = s.EndTime.Sub(s.StartTime)
66 if sk := spanKindToString(s.SpanKind); sk != "" {
67 data["spanKind"] = sk
68 }
69
70 level := logrus.InfoLevel
71 if s.Status.Code != 0 {
72 level = logrus.ErrorLevel
73
74
75 if _, ok := data[logrus.ErrorKey]; !ok {
76 data[logrus.ErrorKey] = s.Status.Message
77 }
78 if _, ok := data[_errorCodeKey]; !ok {
79 data[_errorCodeKey] = codes.Code(s.Status.Code).String()
80 }
81 }
82
83 entry.Data = data
84 entry.Time = s.StartTime
85 entry.Log(level, spanMessage)
86 }
87
View as plain text