15
15
package zipkin
16
16
17
17
import (
18
- "fmt "
18
+ "github.com/opentracing/opentracing-go/ext "
19
19
"github.com/uber/jaeger/model"
20
20
"github.com/uber/jaeger/swagger-gen/models"
21
21
"github.com/uber/jaeger/thrift-gen/zipkincore"
@@ -42,7 +42,6 @@ func spanV2ToThrift(s models.Span) (*zipkincore.Span, error) {
42
42
if err != nil {
43
43
return nil , err
44
44
}
45
-
46
45
tSpan := & zipkincore.Span {
47
46
ID : int64 (id ),
48
47
TraceID : int64 (traceID .Low ),
@@ -61,68 +60,103 @@ func spanV2ToThrift(s models.Span) (*zipkincore.Span, error) {
61
60
tSpan .ParentID = & signed
62
61
}
63
62
64
- localE , err := endpointToThrift (string (s .LocalEndpoint .IPV4 ),
65
- string (s .LocalEndpoint .IPV6 ),
66
- int32 (s .LocalEndpoint .Port ),
67
- s .LocalEndpoint .ServiceName )
68
- if err != nil {
69
- return nil , err
70
- }
63
+ localE , err := endpointV2ToThrift (s .LocalEndpoint )
71
64
72
65
for _ , a := range s .Annotations {
73
- tA := annToThrift (a , * localE )
66
+ tA := annoV2ToThrift (a , * localE )
74
67
tSpan .Annotations = append (tSpan .Annotations , tA )
75
68
}
76
69
77
- for k , v := range s .Tags {
78
- ba := & zipkincore.BinaryAnnotation {
79
- Key : k ,
80
- Value : []byte (v ),
81
- AnnotationType : zipkincore .AnnotationType_STRING ,
82
- Host : localE ,
70
+ tSpan .BinaryAnnotations = append (tSpan .BinaryAnnotations , tagsToThrift (s .Tags , * localE )... )
71
+ tSpan .Annotations = append (tSpan .Annotations , kindToThrift (s , localE )... )
72
+
73
+ if s .RemoteEndpoint != nil {
74
+ if bAnno , err := rEndpToThrift (s .RemoteEndpoint , s .Kind ); err != nil {
75
+ tSpan .BinaryAnnotations = append (tSpan .BinaryAnnotations , bAnno )
76
+ } else {
77
+ return nil , err
83
78
}
84
- tSpan .BinaryAnnotations = append (tSpan .BinaryAnnotations , ba )
85
79
}
80
+ return tSpan , nil
81
+ }
86
82
87
- if s .Kind == models .SpanKindCLIENT {
88
- tSpan .Annotations = append (tSpan .Annotations , & zipkincore.Annotation {
89
- Value : zipkincore .CLIENT_SEND ,
83
+ func rEndpToThrift (e * models.Endpoint , kind string ) (* zipkincore.BinaryAnnotation , error ) {
84
+ rEndp , err := endpointV2ToThrift (e )
85
+ if err != nil {
86
+ return nil , err
87
+ }
88
+
89
+ var key string
90
+ switch kind {
91
+ case models .SpanKindCLIENT :
92
+ key = zipkincore .SERVER_ADDR
93
+ case models .SpanKindSERVER :
94
+ key = zipkincore .CLIENT_ADDR
95
+ default :
96
+ key = string (ext .PeerAddress )
97
+ }
98
+
99
+ return & zipkincore.BinaryAnnotation {
100
+ Key : key ,
101
+ Host : rEndp ,
102
+ AnnotationType : zipkincore .AnnotationType_BOOL ,
103
+ }, nil
104
+ }
105
+
106
+ func kindToThrift (s models.Span , localE * zipkincore.Endpoint ) []* zipkincore.Annotation {
107
+ var annos []* zipkincore.Annotation
108
+ switch s .Kind {
109
+ case models .SpanKindCLIENT :
110
+ annos = append (annos , & zipkincore.Annotation {
111
+ Value : zipkincore .SERVER_RECV ,
90
112
Host : localE ,
91
113
Timestamp : s .Timestamp ,
92
114
})
93
- tSpan . Annotations = append (tSpan . Annotations , & zipkincore.Annotation {
94
- Value : zipkincore .CLIENT_RECV ,
115
+ annos = append (annos , & zipkincore.Annotation {
116
+ Value : zipkincore .SERVER_SEND ,
95
117
Host : localE ,
96
118
Timestamp : s .Timestamp + s .Duration ,
97
119
})
98
- } else if s . Kind == models .SpanKindSERVER {
99
- tSpan . Annotations = append (tSpan . Annotations , & zipkincore.Annotation {
100
- Value : zipkincore .SERVER_RECV ,
120
+ case models .SpanKindSERVER :
121
+ annos = append (annos , & zipkincore.Annotation {
122
+ Value : zipkincore .CLIENT_SEND ,
101
123
Host : localE ,
102
124
Timestamp : s .Timestamp ,
103
125
})
104
- tSpan . Annotations = append (tSpan . Annotations , & zipkincore.Annotation {
105
- Value : zipkincore .SERVER_SEND ,
126
+ annos = append (annos , & zipkincore.Annotation {
127
+ Value : zipkincore .CLIENT_RECV ,
106
128
Host : localE ,
107
129
Timestamp : s .Timestamp + s .Duration ,
108
130
})
131
+ // TODO support for producer/consumer once idl supports it
109
132
}
110
- // TODO consumer producer
111
133
112
- // TODO
113
- //s.RemoteEndpoint
114
-
115
- fmt .Println ("V2 span" )
116
- fmt .Println (tSpan )
134
+ return annos
135
+ }
117
136
118
- return tSpan , nil
137
+ func endpointV2ToThrift (e * models.Endpoint ) (* zipkincore.Endpoint , error ) {
138
+ return eToThrift (string (e .IPV4 ), string (e .IPV6 ), int32 (e .Port ), e .ServiceName )
119
139
}
120
140
121
- func annToThrift (a * models.Annotation , e zipkincore.Endpoint ) * zipkincore.Annotation {
141
+ func annoV2ToThrift (a * models.Annotation , e zipkincore.Endpoint ) * zipkincore.Annotation {
122
142
ta := & zipkincore.Annotation {
123
143
Value : a .Value ,
124
144
Timestamp : a .Timestamp ,
125
145
Host : & e ,
126
146
}
127
147
return ta
128
148
}
149
+
150
+ func tagsToThrift (tags models.Tags , localE zipkincore.Endpoint ) []* zipkincore.BinaryAnnotation {
151
+ var bAnnos []* zipkincore.BinaryAnnotation
152
+ for k , v := range tags {
153
+ ba := & zipkincore.BinaryAnnotation {
154
+ Key : k ,
155
+ Value : []byte (v ),
156
+ AnnotationType : zipkincore .AnnotationType_STRING ,
157
+ Host : & localE ,
158
+ }
159
+ bAnnos = append (bAnnos , ba )
160
+ }
161
+ return bAnnos
162
+ }
0 commit comments