-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathconfig.go
133 lines (102 loc) · 2.77 KB
/
config.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
122
123
124
125
126
127
128
129
130
131
132
133
package redisotel
import (
"slices"
"go.opentelemetry.io/otel"
"go.opentelemetry.io/otel/attribute"
"go.opentelemetry.io/otel/metric"
"go.opentelemetry.io/otel/metric/noop"
semconv "go.opentelemetry.io/otel/semconv/v1.30.0"
"go.opentelemetry.io/otel/trace"
)
type config struct {
// Common options.
attrs []attribute.KeyValue
// Tracing options.
tp trace.TracerProvider
tracer trace.Tracer
dbQueryTextEnabled bool
// Metrics options.
metricsEnabled bool
mp metric.MeterProvider
meter metric.Meter
poolName string
}
// Option configures the instrumentation.
type Option interface {
apply(conf *config)
}
type option func(conf *config)
func (fn option) apply(conf *config) {
fn(conf)
}
func newConfig(opts ...Option) *config {
conf := &config{
attrs: []attribute.KeyValue{},
tp: otel.GetTracerProvider(),
tracer: nil,
dbQueryTextEnabled: false,
metricsEnabled: true,
mp: otel.GetMeterProvider(),
meter: nil,
poolName: "",
}
for _, opt := range opts {
opt.apply(conf)
}
conf.attrs = append(conf.attrs, semconv.DBSystemNameRedis)
if !conf.metricsEnabled { // use noop to disable metrics recording.
conf.mp = noop.NewMeterProvider()
}
conf.meter = conf.mp.Meter(
instrumName,
metric.WithInstrumentationVersion(version),
metric.WithSchemaURL(semconv.SchemaURL),
)
conf.tracer = conf.tp.Tracer(
instrumName,
trace.WithInstrumentationVersion(version),
trace.WithSchemaURL(semconv.SchemaURL),
)
return conf
}
// WithPoolName specifies the pool name to use in the attributes.
func WithPoolName(poolName string) Option {
return option(func(conf *config) {
conf.poolName = poolName
})
}
// WithAttributes specifies additional attributes to be added to the span.
func WithAttributes(attrs ...attribute.KeyValue) Option {
return option(func(conf *config) {
conf.attrs = append(conf.attrs, attrs...)
})
}
// WithTracerProvider specifies a tracer provider to use for creating a tracer.
// If none is specified, the global provider is used.
func WithTracerProvider(provider trace.TracerProvider) Option {
return option(func(conf *config) {
conf.tp = provider
})
}
// EnableDBQueryText tells the tracing hook to log raw redis commands.
func EnableDBQueryText() Option {
return option(func(conf *config) {
conf.dbQueryTextEnabled = true
})
}
// WithMeterProvider configures a metric.Meter used to create instruments.
func WithMeterProvider(mp metric.MeterProvider) Option {
return option(func(conf *config) {
conf.mp = mp
})
}
// DisableMetrics tells the hook not to record metrics.
func DisableMetrics() Option {
return option(func(conf *config) {
conf.metricsEnabled = false
})
}
// Attributes returns the common attributes.
func (conf *config) Attributes() []attribute.KeyValue {
return slices.Clone(conf.attrs)
}