/
option.go
143 lines (124 loc) · 4.72 KB
/
option.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
139
140
141
142
143
// Unless explicitly stated otherwise all files in this repository are licensed
// under the Apache License Version 2.0.
// This product includes software developed at Datadog (https://www.datadoghq.com/).
// Copyright 2016 Datadog, Inc.
package sql
import (
"math"
"gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer"
"gopkg.in/DataDog/dd-trace-go.v1/internal"
)
type config struct {
serviceName string
analyticsRate float64
dsn string
childSpansOnly bool
commentInjectionMode commentInjectionMode
}
// commentInjectionMode represents the mode of sql comment injection
type commentInjectionMode int
const (
commentInjectionDisabled commentInjectionMode = 0 // Default value, sql comment injection disabled
fullSQLCommentInjection commentInjectionMode = 1 // Full sql comment injection is enabled: include dynamic values like span id, trace id and sampling priority.
staticTagsSQLCommentInjection commentInjectionMode = 2 // Static sql comment injection only: this includes values that are set once during the lifetime of an application: service name, env, version.
)
// Option represents an option that can be passed to Register, Open or OpenDB.
type Option func(*config)
type registerConfig = config
// RegisterOption has been deprecated in favor of Option.
type RegisterOption = Option
func defaults(cfg *config) {
// default cfg.serviceName set in Register based on driver name
// cfg.analyticsRate = globalconfig.AnalyticsRate()
if internal.BoolEnv("DD_TRACE_SQL_ANALYTICS_ENABLED", false) {
cfg.analyticsRate = 1.0
} else {
cfg.analyticsRate = math.NaN()
}
}
// WithServiceName sets the given service name when registering a driver,
// or opening a database connection.
func WithServiceName(name string) Option {
return func(cfg *config) {
cfg.serviceName = name
}
}
// WithAnalytics enables Trace Analytics for all started spans.
func WithAnalytics(on bool) Option {
return func(cfg *config) {
if on {
cfg.analyticsRate = 1.0
} else {
cfg.analyticsRate = math.NaN()
}
}
}
// WithAnalyticsRate sets the sampling rate for Trace Analytics events
// correlated to started spans.
func WithAnalyticsRate(rate float64) Option {
return func(cfg *config) {
if rate >= 0.0 && rate <= 1.0 {
cfg.analyticsRate = rate
} else {
cfg.analyticsRate = math.NaN()
}
}
}
// WithDSN allows the data source name (DSN) to be provided when
// using OpenDB and a driver.Connector.
// The value is used to automatically set tags on spans.
func WithDSN(name string) Option {
return func(cfg *config) {
cfg.dsn = name
}
}
// WithChildSpansOnly causes spans to be created only when
// there is an existing parent span in the Context.
func WithChildSpansOnly() Option {
return func(cfg *config) {
cfg.childSpansOnly = true
}
}
// WithCommentInjection enables injection of tags as sql comments on traced queries.
// This includes dynamic values like span id, trace id and sampling priority which can make queries
// unique for some cache implementations. Use WithStaticTagsCommentInjection if this is a concern.
func WithCommentInjection() Option {
return func(cfg *config) {
cfg.commentInjectionMode = fullSQLCommentInjection
}
}
// WithStaticTagsCommentInjection enables injection of static tags as sql comments on traced queries.
// This excludes dynamic values like span id, trace id and sampling priority which can make a query
// unique and have side effects on caching.
func WithStaticTagsCommentInjection() Option {
return func(cfg *config) {
cfg.commentInjectionMode = staticTagsSQLCommentInjection
}
}
// WithoutCommentInjection disables injection of sql comments on traced queries.
func WithoutCommentInjection() Option {
return func(cfg *config) {
cfg.commentInjectionMode = commentInjectionDisabled
}
}
func injectionOptionsForMode(mode commentInjectionMode, discardDynamicTags bool) (opts []tracer.InjectionOption) {
switch {
case mode == fullSQLCommentInjection && !discardDynamicTags:
return []tracer.InjectionOption{
tracer.WithTraceIDKey(tracer.TraceIDSQLCommentKey),
tracer.WithSpanIDKey(tracer.SpanIDSQLCommentKey),
tracer.WithSamplingPriorityKey(tracer.SamplingPrioritySQLCommentKey),
tracer.WithServiceNameKey(tracer.ServiceNameSQLCommentKey),
tracer.WithEnvironmentKey(tracer.ServiceEnvironmentSQLCommentKey),
tracer.WithParentVersionKey(tracer.ServiceVersionSQLCommentKey),
}
case mode == fullSQLCommentInjection && discardDynamicTags || mode == staticTagsSQLCommentInjection:
return []tracer.InjectionOption{
tracer.WithServiceNameKey(tracer.ServiceNameSQLCommentKey),
tracer.WithEnvironmentKey(tracer.ServiceEnvironmentSQLCommentKey),
tracer.WithParentVersionKey(tracer.ServiceVersionSQLCommentKey),
}
default:
return []tracer.InjectionOption{}
}
}