-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathconfig.go
138 lines (106 loc) · 2.82 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
134
135
136
137
138
package redisotel
import (
"slices"
"go.opentelemetry.io/otel"
"go.opentelemetry.io/otel/attribute"
"go.opentelemetry.io/otel/metric"
semconv "go.opentelemetry.io/otel/semconv/v1.27.0"
"go.opentelemetry.io/otel/trace"
)
type config struct {
// Common options.
attrs []attribute.KeyValue
// Tracing options.
tp trace.TracerProvider
tracer trace.Tracer
dbStmtEnabled 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,
dbStmtEnabled: false,
metricsEnabled: true,
mp: otel.GetMeterProvider(),
meter: nil,
poolName: "",
}
for _, opt := range opts {
opt.apply(conf)
}
conf.attrs = append(conf.attrs, semconv.DBSystemRedis)
if conf.meter == nil && conf.metricsEnabled {
conf.meter = conf.mp.Meter(
instrumName,
metric.WithInstrumentationVersion(version),
metric.WithSchemaURL(semconv.SchemaURL),
)
}
if conf.tracer == nil {
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
})
}
// WithDBStatement tells the tracing hook not to log raw redis commands.
func WithDBStatement(on bool) Option {
return option(func(conf *config) {
conf.dbStmtEnabled = on
})
}
// 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)
}
// MetricsEnabled returns true if metrics are enabled.
func (conf *config) MetricsEnabled() bool {
return conf.metricsEnabled
}