This repository was archived by the owner on Jun 9, 2025. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 7
Expand file tree
/
Copy pathoption.go
More file actions
152 lines (130 loc) · 4.48 KB
/
option.go
File metadata and controls
152 lines (130 loc) · 4.48 KB
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
144
145
146
147
148
149
150
151
152
// 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 2021 Datadog, Inc.
package dd_sdk_go_testing
import (
"runtime"
"sync"
"testing"
"github.com/DataDog/dd-sdk-go-testing/internal/constants"
"github.com/DataDog/dd-sdk-go-testing/internal/utils"
"gopkg.in/DataDog/dd-trace-go.v1/ddtrace"
"gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext"
"gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer"
)
var (
// tags contains information detected from CI/CD environment variables.
tags map[string]string
tagsOnce sync.Once
)
type config struct {
skip int
spanOpts []ddtrace.StartSpanOption
finishOpts []ddtrace.FinishOption
originalTestFunc func(*testing.T)
}
// Option represents an option that can be passed to NewServeMux or WrapHandler.
type Option func(*config)
func defaults(cfg *config) {
// When StartSpanWithFinish is called directly from test function.
cfg.skip = 1
cfg.spanOpts = []ddtrace.StartSpanOption{
tracer.SpanType(constants.SpanTypeTest),
tracer.Tag(constants.SpanKind, spanKind),
tracer.Tag(ext.ManualKeep, true),
}
// Ensure CI tags
ensureCITags()
forEachCITags(func(k, v string) {
cfg.spanOpts = append(cfg.spanOpts, tracer.Tag(k, v))
})
cfg.finishOpts = []ddtrace.FinishOption{}
}
func ensureCITags() {
tagsOnce.Do(ensureCITagsLocked)
}
func ensureCITagsLocked() {
localTags := utils.GetProviderTags()
localTags[constants.OSPlatform] = runtime.GOOS
localTags[constants.OSVersion] = utils.OSVersion()
localTags[constants.OSArchitecture] = runtime.GOARCH
localTags[constants.RuntimeName] = runtime.Compiler
localTags[constants.RuntimeVersion] = runtime.Version()
gitData, _ := utils.LocalGetGitData()
// Guess Git metadata from a local Git repository otherwise.
if _, ok := localTags[constants.CIWorkspacePath]; !ok {
localTags[constants.CIWorkspacePath] = gitData.SourceRoot
}
if _, ok := localTags[constants.GitRepositoryURL]; !ok {
localTags[constants.GitRepositoryURL] = gitData.RepositoryUrl
}
if _, ok := localTags[constants.GitCommitSHA]; !ok {
localTags[constants.GitCommitSHA] = gitData.CommitSha
}
if _, ok := localTags[constants.GitBranch]; !ok {
localTags[constants.GitBranch] = gitData.Branch
}
if localTags[constants.GitCommitSHA] == gitData.CommitSha {
if _, ok := localTags[constants.GitCommitAuthorDate]; !ok {
localTags[constants.GitCommitAuthorDate] = gitData.AuthorDate.String()
}
if _, ok := localTags[constants.GitCommitAuthorName]; !ok {
localTags[constants.GitCommitAuthorName] = gitData.AuthorName
}
if _, ok := localTags[constants.GitCommitAuthorEmail]; !ok {
localTags[constants.GitCommitAuthorEmail] = gitData.AuthorEmail
}
if _, ok := localTags[constants.GitCommitCommitterDate]; !ok {
localTags[constants.GitCommitCommitterDate] = gitData.CommitterDate.String()
}
if _, ok := localTags[constants.GitCommitCommitterName]; !ok {
localTags[constants.GitCommitCommitterName] = gitData.CommitterName
}
if _, ok := localTags[constants.GitCommitCommitterEmail]; !ok {
localTags[constants.GitCommitCommitterEmail] = gitData.CommitterEmail
}
if _, ok := localTags[constants.GitCommitMessage]; !ok {
localTags[constants.GitCommitMessage] = gitData.CommitMessage
}
}
// Replace global tags with local copy
tags = localTags
}
func getFromCITags(key string) (string, bool) {
if value, ok := tags[key]; ok {
return value, ok
}
return "", false
}
func forEachCITags(itemFunc func(string, string)) {
for k, v := range tags {
itemFunc(k, v)
}
}
// WithSpanOptions defines a set of additional ddtrace.StartSpanOption to be added
// to spans started by the integration.
func WithSpanOptions(opts ...ddtrace.StartSpanOption) Option {
return func(cfg *config) {
cfg.spanOpts = append(cfg.spanOpts, opts...)
}
}
// WithSkipFrames defines a how many frames should be skipped for caller autodetection.
// The value should be changed if StartSpanWithFinish is called from a custom wrapper.
func WithSkipFrames(skip int) Option {
return func(cfg *config) {
cfg.skip = skip
}
}
// WithIncrementSkipFrame increments how many frames should be skipped for caller by 1.
func WithIncrementSkipFrame() Option {
return func(cfg *config) {
cfg.skip = cfg.skip + 1
}
}
// WithOriginalTestFunc sets the original test function
func WithOriginalTestFunc(f func(*testing.T)) Option {
return func(cfg *config) {
cfg.originalTestFunc = f
}
}