...
1 package opentracing
2
3 import (
4 "context"
5 "net"
6 "net/http"
7 "strconv"
8
9 opentracing "github.com/opentracing/opentracing-go"
10 "github.com/opentracing/opentracing-go/ext"
11
12 kithttp "github.com/go-kit/kit/transport/http"
13 "github.com/go-kit/log"
14 )
15
16
17
18
19 func ContextToHTTP(tracer opentracing.Tracer, logger log.Logger) kithttp.RequestFunc {
20 return func(ctx context.Context, req *http.Request) context.Context {
21
22 if span := opentracing.SpanFromContext(ctx); span != nil {
23
24 ext.HTTPMethod.Set(span, req.Method)
25 ext.HTTPUrl.Set(span, req.URL.String())
26 host, portString, err := net.SplitHostPort(req.URL.Host)
27 if err == nil {
28 ext.PeerHostname.Set(span, host)
29 if port, err := strconv.Atoi(portString); err == nil {
30 ext.PeerPort.Set(span, uint16(port))
31 }
32 } else {
33 ext.PeerHostname.Set(span, req.URL.Host)
34 }
35
36
37 if err = tracer.Inject(
38 span.Context(),
39 opentracing.HTTPHeaders,
40 opentracing.HTTPHeadersCarrier(req.Header),
41 ); err != nil {
42 logger.Log("err", err)
43 }
44 }
45 return ctx
46 }
47 }
48
49
50
51
52
53
54 func HTTPToContext(tracer opentracing.Tracer, operationName string, logger log.Logger) kithttp.RequestFunc {
55 return func(ctx context.Context, req *http.Request) context.Context {
56
57 var span opentracing.Span
58 wireContext, err := tracer.Extract(
59 opentracing.HTTPHeaders,
60 opentracing.HTTPHeadersCarrier(req.Header),
61 )
62 if err != nil && err != opentracing.ErrSpanContextNotFound {
63 logger.Log("err", err)
64 }
65
66 span = tracer.StartSpan(operationName, ext.RPCServerOption(wireContext))
67 ext.HTTPMethod.Set(span, req.Method)
68 ext.HTTPUrl.Set(span, req.URL.String())
69 return opentracing.ContextWithSpan(ctx, span)
70 }
71 }
72
View as plain text