-
Notifications
You must be signed in to change notification settings - Fork 297
/
Copy pathAbstractCouchbaseTest.groovy
169 lines (146 loc) · 5.28 KB
/
AbstractCouchbaseTest.groovy
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
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
package util
import com.couchbase.client.core.metrics.DefaultLatencyMetricsCollectorConfig
import com.couchbase.client.core.metrics.DefaultMetricsCollectorConfig
import com.couchbase.client.java.CouchbaseAsyncCluster
import com.couchbase.client.java.CouchbaseCluster
import com.couchbase.client.java.bucket.BucketType
import com.couchbase.client.java.cluster.BucketSettings
import com.couchbase.client.java.cluster.DefaultBucketSettings
import com.couchbase.client.java.env.CouchbaseEnvironment
import com.couchbase.client.java.env.DefaultCouchbaseEnvironment
import com.couchbase.mock.Bucket
import com.couchbase.mock.BucketConfiguration
import com.couchbase.mock.CouchbaseMock
import com.couchbase.mock.http.query.QueryServer
import datadog.trace.agent.test.asserts.TraceAssert
import datadog.trace.agent.test.naming.VersionedNamingTestBase
import datadog.trace.agent.test.utils.PortUtils
import datadog.trace.api.DDSpanTypes
import datadog.trace.bootstrap.instrumentation.api.Tags
import datadog.trace.core.DDSpan
import spock.lang.Shared
import java.util.concurrent.TimeUnit
import static datadog.trace.agent.test.utils.TraceUtils.runUnderTrace
import static datadog.trace.api.config.TraceInstrumentationConfig.DB_CLIENT_HOST_SPLIT_BY_INSTANCE
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeSpan
abstract class AbstractCouchbaseTest extends VersionedNamingTestBase {
static final USERNAME = "Administrator"
static final PASSWORD = "password"
@Shared
private int port = PortUtils.randomOpenPort()
@Shared
private String testBucketName = this.getClass().simpleName
@Shared
protected bucketCouchbase = DefaultBucketSettings.builder()
.enableFlush(true)
.name("$testBucketName-cb")
.password("test-pass")
.type(BucketType.COUCHBASE)
.quota(100)
.build()
@Shared
protected bucketMemcache = DefaultBucketSettings.builder()
.enableFlush(true)
.name("$testBucketName-mem")
.password("test-pass")
.type(BucketType.MEMCACHED)
.quota(100)
.build()
@Shared
CouchbaseMock mock
@Override
void configurePreAgent() {
super.configurePreAgent()
// This setting should have no effect since decorator returns null for the instance.
injectSysConfig(DB_CLIENT_HOST_SPLIT_BY_INSTANCE, "true")
}
def setupSpec() {
mock = new CouchbaseMock("127.0.0.1", port, 1, 1)
mock.httpServer.register("/query", new QueryServer())
mock.start()
println "CouchbaseMock listening on localhost:$port"
mock.createBucket(convert(bucketCouchbase))
mock.createBucket(convert(bucketMemcache))
}
private static BucketConfiguration convert(BucketSettings bucketSettings) {
def configuration = new BucketConfiguration()
configuration.name = bucketSettings.name()
configuration.password = bucketSettings.password()
configuration.type = Bucket.BucketType.valueOf(bucketSettings.type().name())
configuration.numNodes = 1
configuration.numReplicas = 0
return configuration
}
def cleanupSpec() {
mock?.stop()
}
protected DefaultCouchbaseEnvironment.Builder envBuilder(BucketSettings bucketSettings) {
// Couchbase seems to be really slow to start sometimes
def timeout = TimeUnit.SECONDS.toMillis(20)
return DefaultCouchbaseEnvironment.builder()
.bootstrapCarrierDirectPort(mock.getCarrierPort(bucketSettings.name()))
.bootstrapHttpDirectPort(port)
// settings to try to reduce variability in the tests:
.runtimeMetricsCollectorConfig(DefaultMetricsCollectorConfig.create(0, TimeUnit.DAYS))
.networkLatencyMetricsCollectorConfig(DefaultLatencyMetricsCollectorConfig.create(0, TimeUnit.DAYS))
.computationPoolSize(1)
.connectTimeout(timeout)
.disconnectTimeout(timeout)
.kvTimeout(timeout)
.managementTimeout(timeout)
.queryTimeout(timeout)
.viewTimeout(timeout)
.keepAliveTimeout(timeout)
.searchTimeout(timeout)
.analyticsTimeout(timeout)
.socketConnectTimeout(timeout.intValue())
}
protected void cleanupCluster(CouchbaseAsyncCluster cluster, CouchbaseEnvironment environment) {
try (def suppressScope = TEST_TRACER.muteTracing()) {
cluster?.disconnect()?.timeout(10, TimeUnit.SECONDS)?.toBlocking()?.single()
environment.shutdown()
}
}
protected void cleanupCluster(CouchbaseCluster cluster, CouchbaseEnvironment environment) {
try (def suppressScope = TEST_TRACER.muteTracing()) {
cluster?.disconnect()
environment.shutdown()
}
}
void assertCouchbaseCall(TraceAssert trace, String name, String bucketName = null, Object parentSpan = null) {
trace.span {
serviceName service()
resourceName name
operationName operation()
spanType DDSpanTypes.COUCHBASE
errored false
if (parentSpan == null) {
parent()
} else {
childOf((DDSpan) parentSpan)
}
tags {
"$Tags.COMPONENT" "couchbase-client"
"$Tags.SPAN_KIND" Tags.SPAN_KIND_CLIENT
"$Tags.DB_TYPE" "couchbase"
if (bucketName != null) {
"bucket" bucketName
}
//FIXME: check for peer.service when available
defaultTagsNoPeerService()
}
}
}
@Override
int version() {
return 0
}
@Override
String service() {
return "couchbase"
}
@Override
String operation() {
return "couchbase.call"
}
}