/
resty.go
63 lines (50 loc) · 1.39 KB
/
resty.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
package kresty
import (
"time"
"github.com/go-resty/resty/v2"
"go.opentelemetry.io/otel"
"go.opentelemetry.io/otel/codes"
semconv "go.opentelemetry.io/otel/semconv/v1.4.0"
"go.opentelemetry.io/otel/trace"
)
type Client = resty.Client
type Config struct {
BaseURL string `toml:"baseURL"`
Timeout time.Duration `toml:"timeout"`
}
func (c Config) Build() *Client {
cc := resty.New()
cc.SetBaseURL(c.BaseURL)
cc.SetTimeout(c.Timeout)
cc.RemoveProxy()
cc.OnError(func(r *resty.Request, err error) {
span := trace.SpanFromContext(r.Context())
if span.SpanContext().IsValid() {
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
}
span.End()
}
})
cc.OnBeforeRequest(func(c *resty.Client, r *resty.Request) error {
span := trace.SpanFromContext(r.Context())
if span.SpanContext().IsValid() {
ctx, _ := otel.Tracer("github.com/go-kod/kod").Start(r.Context(), r.URL, trace.WithSpanKind(trace.SpanKindClient))
r.SetContext(ctx)
}
return nil
})
cc.OnAfterResponse(func(c *resty.Client, r *resty.Response) error {
span := trace.SpanFromContext(r.Request.Context())
if span.SpanContext().IsValid() {
span.SetAttributes(semconv.HTTPClientAttributesFromHTTPRequest(r.Request.RawRequest)...)
span.SetAttributes(
semconv.HTTPStatusCodeKey.Int64(int64(r.StatusCode())),
)
span.End()
}
return nil
})
return cc
}