-
Notifications
You must be signed in to change notification settings - Fork 2
/
httpclient.go
89 lines (73 loc) · 2.03 KB
/
httpclient.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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
// Package httpclient provide HTTP client for API calls with support for telemetry and logging.
package httpclient
import (
"io"
"github.com/keboola/go-client/pkg/client"
"github.com/keboola/go-client/pkg/client/trace"
"github.com/keboola/go-client/pkg/client/trace/otel"
"go.opentelemetry.io/contrib/propagators/b3"
"github.com/keboola/keboola-as-code/internal/pkg/telemetry"
)
type Config struct {
userAgent string
telemetry telemetry.Telemetry
debugWriter io.Writer
dumpWriter io.Writer
}
type Option func(c *Config)
func WithUserAgent(v string) Option {
return func(c *Config) {
c.userAgent = v
}
}
func WithTelemetry(v telemetry.Telemetry) Option {
return func(c *Config) {
c.telemetry = v
}
}
func WithDebugOutput(w io.Writer) Option {
return func(c *Config) {
c.debugWriter = w
}
}
func WithDumpOutput(w io.Writer) Option {
return func(c *Config) {
c.dumpWriter = w
}
}
func New(opts ...Option) client.Client {
// Apply options
conf := Config{userAgent: "keboola-go-client"}
for _, o := range opts {
o(&conf)
}
// Force HTTP2 transport
transport := client.HTTP2Transport()
// Create client
cl := client.New().
WithTransport(transport).
WithUserAgent(conf.userAgent)
// Enable telemetry
if conf.telemetry != nil {
cl = cl.WithTelemetry(
conf.telemetry.TracerProvider(),
conf.telemetry.MeterProvider(),
otel.WithRedactedHeaders("X-StorageAPI-Token", "X-KBC-ManageApiToken"),
otel.WithPropagators(
// DataDog supports multiple propagations: tracecontext, B3, legacy DataDog, ...
// W3C tracecontext propagator (propagation.TraceContext{}) is not working with the Storage API dd-trace-php ,
// so the B3 propagator is used.
b3.New(b3.WithInjectEncoding(b3.B3MultipleHeader)),
),
)
}
// Log each HTTP client request/response as debug message
if conf.debugWriter != nil {
cl = cl.AndTrace(trace.LogTracer(conf.debugWriter))
}
// Dump each HTTP client request/response body
if conf.dumpWriter != nil {
cl = cl.AndTrace(trace.DumpTracer(conf.dumpWriter))
}
return cl
}