podman
99 строк · 2.4 Кб
1package client
2
3import (
4"fmt"
5"net/http"
6
7"github.com/go-openapi/strfmt"
8"github.com/opentracing/opentracing-go"
9"github.com/opentracing/opentracing-go/ext"
10"github.com/opentracing/opentracing-go/log"
11
12"github.com/go-openapi/runtime"
13)
14
15type tracingTransport struct {
16transport runtime.ClientTransport
17host string
18opts []opentracing.StartSpanOption
19}
20
21func newOpenTracingTransport(transport runtime.ClientTransport, host string, opts []opentracing.StartSpanOption,
22) runtime.ClientTransport {
23return &tracingTransport{
24transport: transport,
25host: host,
26opts: opts,
27}
28}
29
30func (t *tracingTransport) Submit(op *runtime.ClientOperation) (interface{}, error) {
31if op.Context == nil {
32return t.transport.Submit(op)
33}
34
35params := op.Params
36reader := op.Reader
37
38var span opentracing.Span
39defer func() {
40if span != nil {
41span.Finish()
42}
43}()
44
45op.Params = runtime.ClientRequestWriterFunc(func(req runtime.ClientRequest, reg strfmt.Registry) error {
46span = createClientSpan(op, req.GetHeaderParams(), t.host, t.opts)
47return params.WriteToRequest(req, reg)
48})
49
50op.Reader = runtime.ClientResponseReaderFunc(func(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
51if span != nil {
52code := response.Code()
53ext.HTTPStatusCode.Set(span, uint16(code))
54if code >= 400 {
55ext.Error.Set(span, true)
56}
57}
58return reader.ReadResponse(response, consumer)
59})
60
61submit, err := t.transport.Submit(op)
62if err != nil && span != nil {
63ext.Error.Set(span, true)
64span.LogFields(log.Error(err))
65}
66return submit, err
67}
68
69func createClientSpan(op *runtime.ClientOperation, header http.Header, host string,
70opts []opentracing.StartSpanOption) opentracing.Span {
71ctx := op.Context
72span := opentracing.SpanFromContext(ctx)
73
74if span != nil {
75opts = append(opts, ext.SpanKindRPCClient)
76span, _ = opentracing.StartSpanFromContextWithTracer(
77ctx, span.Tracer(), operationName(op), opts...)
78
79ext.Component.Set(span, "go-openapi")
80ext.PeerHostname.Set(span, host)
81span.SetTag("http.path", op.PathPattern)
82ext.HTTPMethod.Set(span, op.Method)
83
84_ = span.Tracer().Inject(
85span.Context(),
86opentracing.HTTPHeaders,
87opentracing.HTTPHeadersCarrier(header))
88
89return span
90}
91return nil
92}
93
94func operationName(op *runtime.ClientOperation) string {
95if op.ID != "" {
96return op.ID
97}
98return fmt.Sprintf("%s_%s", op.Method, op.PathPattern)
99}
100