-
-
Notifications
You must be signed in to change notification settings - Fork 30
/
service.go
121 lines (100 loc) · 2.49 KB
/
service.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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
package tracing
import (
"io"
"time"
"emperror.dev/errors"
opentracing "github.com/opentracing/opentracing-go"
"github.com/oxyno-zeta/s3-proxy/pkg/s3-proxy/config"
"github.com/oxyno-zeta/s3-proxy/pkg/s3-proxy/log"
"github.com/uber/jaeger-client-go"
jaegercfg "github.com/uber/jaeger-client-go/config"
jaegerprom "github.com/uber/jaeger-lib/metrics/prometheus"
)
type service struct {
closer io.Closer
tracer opentracing.Tracer
cfgManager config.Manager
logger log.Logger
metricsFactory *jaegerprom.Factory
}
func (s *service) GetTracer() opentracing.Tracer {
return s.tracer
}
func (s *service) Reload() error {
// Save closer
cl := s.closer
// Setup
err := s.setup()
if err != nil {
return err
}
// Close old one
err = cl.Close()
if err != nil {
return errors.WithStack(err)
}
return nil
}
func (s *service) setup() error {
cfg := s.cfgManager.GetConfig()
// Initialize configuration
jcfg := jaegercfg.Configuration{
ServiceName: "s3-proxy",
Sampler: &jaegercfg.SamplerConfig{
Type: jaeger.SamplerTypeConst,
Param: 1,
},
}
// Check if configuration can be set
if !cfg.Tracing.Enabled {
jcfg.Disabled = true
} else {
// Add reporter configuration
jcfg.Reporter = &jaegercfg.ReporterConfig{
LogSpans: cfg.Tracing.LogSpan,
QueueSize: cfg.Tracing.QueueSize,
}
// Check if flush interval is customized
if cfg.Tracing.FlushInterval != "" {
// Try to parse duration for flush interval
dur, err := time.ParseDuration(cfg.Tracing.FlushInterval)
if err != nil {
return errors.WithStack(err)
}
jcfg.Reporter.BufferFlushInterval = dur
}
// Check if UDP is customized
if cfg.Tracing.UDPHost != "" {
jcfg.Reporter.LocalAgentHostPort = cfg.Tracing.UDPHost
}
}
// Initialize tracer with a logger and a metrics factory
tracer, closer, err := jcfg.NewTracer(
jaegercfg.Logger(s.logger.GetTracingLogger()),
jaegercfg.Metrics(s.metricsFactory),
)
// Check error
if err != nil {
return errors.WithStack(err)
}
// Set the singleton opentracing.Tracer with the Jaeger tracer.
opentracing.SetGlobalTracer(tracer)
s.closer = closer
s.tracer = tracer
return nil
}
func newService(cfgManager config.Manager, logger log.Logger) (*service, error) {
// Create prometheus metrics factory
factory := jaegerprom.New()
svc := &service{
cfgManager: cfgManager,
logger: logger,
metricsFactory: factory,
}
// Run setup
err := svc.setup()
if err != nil {
return nil, err
}
return svc, nil
}