Merge pull request #885 from DataDog/tyler/instance-name-testing

Additional testing for split-by-instance config
This commit is contained in:
Tyler Benson 2019-07-15 01:27:49 -04:00 committed by GitHub
commit ec931463a4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 76 additions and 43 deletions

View File

@ -16,6 +16,7 @@ import com.couchbase.mock.CouchbaseMock
import com.couchbase.mock.http.query.QueryServer import com.couchbase.mock.http.query.QueryServer
import datadog.trace.agent.test.AgentTestRunner import datadog.trace.agent.test.AgentTestRunner
import datadog.trace.agent.test.utils.PortUtils import datadog.trace.agent.test.utils.PortUtils
import datadog.trace.api.Config
import spock.lang.Shared import spock.lang.Shared
import java.util.concurrent.RejectedExecutionException import java.util.concurrent.RejectedExecutionException
@ -87,6 +88,9 @@ abstract class AbstractCouchbaseTest extends AgentTestRunner {
// Cache buckets: // Cache buckets:
couchbaseCluster.openBucket(bucketCouchbase.name(), bucketCouchbase.password()) couchbaseCluster.openBucket(bucketCouchbase.name(), bucketCouchbase.password())
memcacheCluster.openBucket(bucketMemcache.name(), bucketMemcache.password()) memcacheCluster.openBucket(bucketMemcache.name(), bucketMemcache.password())
// This setting should have no effect since decorator returns null for the instance.
System.setProperty(Config.PREFIX + Config.DB_CLIENT_HOST_SPLIT_BY_INSTANCE, "true")
} }
private static BucketConfiguration convert(BucketSettings bucketSettings) { private static BucketConfiguration convert(BucketSettings bucketSettings) {
@ -112,6 +116,8 @@ abstract class AbstractCouchbaseTest extends AgentTestRunner {
} }
mock?.stop() mock?.stop()
System.clearProperty(Config.PREFIX + Config.DB_CLIENT_HOST_SPLIT_BY_INSTANCE)
} }
private DefaultCouchbaseEnvironment.Builder envBuilder(BucketSettings bucketSettings) { private DefaultCouchbaseEnvironment.Builder envBuilder(BucketSettings bucketSettings) {

View File

@ -3,11 +3,13 @@ import com.datastax.driver.core.Session
import datadog.opentracing.DDSpan import datadog.opentracing.DDSpan
import datadog.trace.agent.test.AgentTestRunner import datadog.trace.agent.test.AgentTestRunner
import datadog.trace.agent.test.asserts.TraceAssert import datadog.trace.agent.test.asserts.TraceAssert
import datadog.trace.api.Config
import datadog.trace.api.DDSpanTypes import datadog.trace.api.DDSpanTypes
import io.opentracing.tag.Tags import io.opentracing.tag.Tags
import org.cassandraunit.utils.EmbeddedCassandraServerHelper import org.cassandraunit.utils.EmbeddedCassandraServerHelper
import spock.lang.Shared import spock.lang.Shared
import static datadog.trace.agent.test.utils.ConfigUtils.withConfigOverride
import static datadog.trace.agent.test.utils.TraceUtils.basicSpan import static datadog.trace.agent.test.utils.TraceUtils.basicSpan
import static datadog.trace.agent.test.utils.TraceUtils.runUnderTrace import static datadog.trace.agent.test.utils.TraceUtils.runUnderTrace
@ -44,17 +46,19 @@ class CassandraClientTest extends AgentTestRunner {
setup: setup:
Session session = cluster.connect(keyspace) Session session = cluster.connect(keyspace)
withConfigOverride(Config.DB_CLIENT_HOST_SPLIT_BY_INSTANCE, "$renameService") {
session.execute(statement) session.execute(statement)
}
expect: expect:
assertTraces(keyspace ? 2 : 1) { assertTraces(keyspace ? 2 : 1) {
if (keyspace) { if (keyspace) {
trace(0, 1) { trace(0, 1) {
cassandraSpan(it, 0, "USE $keyspace", null) cassandraSpan(it, 0, "USE $keyspace", null, false)
} }
} }
trace(keyspace ? 1 : 0, 1) { trace(keyspace ? 1 : 0, 1) {
cassandraSpan(it, 0, statement, keyspace) cassandraSpan(it, 0, statement, keyspace, renameService)
} }
} }
@ -62,19 +66,21 @@ class CassandraClientTest extends AgentTestRunner {
session.close() session.close()
where: where:
statement | keyspace statement | keyspace | renameService
"DROP KEYSPACE IF EXISTS sync_test" | null "DROP KEYSPACE IF EXISTS sync_test" | null | false
"CREATE KEYSPACE sync_test WITH REPLICATION = {'class':'SimpleStrategy', 'replication_factor':3}" | null "CREATE KEYSPACE sync_test WITH REPLICATION = {'class':'SimpleStrategy', 'replication_factor':3}" | null | true
"CREATE TABLE sync_test.users ( id UUID PRIMARY KEY, name text )" | "sync_test" "CREATE TABLE sync_test.users ( id UUID PRIMARY KEY, name text )" | "sync_test" | false
"INSERT INTO sync_test.users (id, name) values (uuid(), 'alice')" | "sync_test" "INSERT INTO sync_test.users (id, name) values (uuid(), 'alice')" | "sync_test" | false
"SELECT * FROM users where name = 'alice' ALLOW FILTERING" | "sync_test" "SELECT * FROM users where name = 'alice' ALLOW FILTERING" | "sync_test" | true
} }
def "test async"() { def "test async"() {
setup: setup:
Session session = cluster.connect(keyspace) Session session = cluster.connect(keyspace)
runUnderTrace("parent") { runUnderTrace("parent") {
withConfigOverride(Config.DB_CLIENT_HOST_SPLIT_BY_INSTANCE, "$renameService") {
session.executeAsync(statement) session.executeAsync(statement)
}
blockUntilChildSpansFinished(1) blockUntilChildSpansFinished(1)
} }
@ -82,12 +88,12 @@ class CassandraClientTest extends AgentTestRunner {
assertTraces(keyspace ? 2 : 1) { assertTraces(keyspace ? 2 : 1) {
if (keyspace) { if (keyspace) {
trace(0, 1) { trace(0, 1) {
cassandraSpan(it, 0, "USE $keyspace", null) cassandraSpan(it, 0, "USE $keyspace", null, false)
} }
} }
trace(keyspace ? 1 : 0, 2) { trace(keyspace ? 1 : 0, 2) {
basicSpan(it, 0, "parent") basicSpan(it, 0, "parent")
cassandraSpan(it, 1, statement, keyspace, span(0)) cassandraSpan(it, 1, statement, keyspace, renameService, span(0))
} }
} }
@ -95,17 +101,17 @@ class CassandraClientTest extends AgentTestRunner {
session.close() session.close()
where: where:
statement | keyspace statement | keyspace | renameService
"DROP KEYSPACE IF EXISTS async_test" | null "DROP KEYSPACE IF EXISTS async_test" | null | false
"CREATE KEYSPACE async_test WITH REPLICATION = {'class':'SimpleStrategy', 'replication_factor':3}" | null "CREATE KEYSPACE async_test WITH REPLICATION = {'class':'SimpleStrategy', 'replication_factor':3}" | null | true
"CREATE TABLE async_test.users ( id UUID PRIMARY KEY, name text )" | "async_test" "CREATE TABLE async_test.users ( id UUID PRIMARY KEY, name text )" | "async_test" | false
"INSERT INTO async_test.users (id, name) values (uuid(), 'alice')" | "async_test" "INSERT INTO async_test.users (id, name) values (uuid(), 'alice')" | "async_test" | false
"SELECT * FROM users where name = 'alice' ALLOW FILTERING" | "async_test" "SELECT * FROM users where name = 'alice' ALLOW FILTERING" | "async_test" | true
} }
def cassandraSpan(TraceAssert trace, int index, String statement, String keyspace, Object parentSpan = null, Throwable exception = null) { def cassandraSpan(TraceAssert trace, int index, String statement, String keyspace, boolean renameService, Object parentSpan = null, Throwable exception = null) {
trace.span(index) { trace.span(index) {
serviceName "cassandra" serviceName renameService && keyspace ? keyspace : "cassandra"
operationName "cassandra.query" operationName "cassandra.query"
resourceName statement resourceName statement
spanType DDSpanTypes.CASSANDRA spanType DDSpanTypes.CASSANDRA

View File

@ -2,6 +2,7 @@ import com.mchange.v2.c3p0.ComboPooledDataSource
import com.zaxxer.hikari.HikariConfig import com.zaxxer.hikari.HikariConfig
import com.zaxxer.hikari.HikariDataSource import com.zaxxer.hikari.HikariDataSource
import datadog.trace.agent.test.AgentTestRunner import datadog.trace.agent.test.AgentTestRunner
import datadog.trace.api.Config
import datadog.trace.api.DDSpanTypes import datadog.trace.api.DDSpanTypes
import io.opentracing.tag.Tags import io.opentracing.tag.Tags
import javax.sql.DataSource import javax.sql.DataSource
@ -17,6 +18,7 @@ import java.sql.PreparedStatement
import java.sql.ResultSet import java.sql.ResultSet
import java.sql.Statement import java.sql.Statement
import static datadog.trace.agent.test.utils.ConfigUtils.withConfigOverride
import static datadog.trace.agent.test.utils.TraceUtils.runUnderTrace import static datadog.trace.agent.test.utils.TraceUtils.runUnderTrace
class JDBCInstrumentationTest extends AgentTestRunner { class JDBCInstrumentationTest extends AgentTestRunner {
@ -154,8 +156,10 @@ class JDBCInstrumentationTest extends AgentTestRunner {
setup: setup:
Statement statement = connection.createStatement() Statement statement = connection.createStatement()
ResultSet resultSet = runUnderTrace("parent") { ResultSet resultSet = runUnderTrace("parent") {
withConfigOverride(Config.DB_CLIENT_HOST_SPLIT_BY_INSTANCE, "$renameService") {
return statement.executeQuery(query) return statement.executeQuery(query)
} }
}
expect: expect:
resultSet.next() resultSet.next()
@ -167,8 +171,8 @@ class JDBCInstrumentationTest extends AgentTestRunner {
parent() parent()
} }
span(1) { span(1) {
serviceName renameService ? dbName.toLowerCase() : driver
operationName "${driver}.query" operationName "${driver}.query"
serviceName driver
resourceName query resourceName query
spanType DDSpanTypes.SQL spanType DDSpanTypes.SQL
childOf span(0) childOf span(0)
@ -193,22 +197,22 @@ class JDBCInstrumentationTest extends AgentTestRunner {
connection.close() connection.close()
where: where:
driver | connection | username | query driver | connection | username | renameService | query
"h2" | new Driver().connect(jdbcUrls.get("h2"), null) | null | "SELECT 3" "h2" | new Driver().connect(jdbcUrls.get("h2"), null) | null | false | "SELECT 3"
"derby" | new EmbeddedDriver().connect(jdbcUrls.get("derby"), null) | "APP" | "SELECT 3 FROM SYSIBM.SYSDUMMY1" "derby" | new EmbeddedDriver().connect(jdbcUrls.get("derby"), null) | "APP" | false | "SELECT 3 FROM SYSIBM.SYSDUMMY1"
"hsqldb" | new JDBCDriver().connect(jdbcUrls.get("hsqldb"), null) | "SA" | "SELECT 3 FROM INFORMATION_SCHEMA.SYSTEM_USERS" "hsqldb" | new JDBCDriver().connect(jdbcUrls.get("hsqldb"), null) | "SA" | false | "SELECT 3 FROM INFORMATION_SCHEMA.SYSTEM_USERS"
"h2" | new Driver().connect(jdbcUrls.get("h2"), connectionProps) | null | "SELECT 3" "h2" | new Driver().connect(jdbcUrls.get("h2"), connectionProps) | null | true | "SELECT 3"
"derby" | new EmbeddedDriver().connect(jdbcUrls.get("derby"), connectionProps) | "APP" | "SELECT 3 FROM SYSIBM.SYSDUMMY1" "derby" | new EmbeddedDriver().connect(jdbcUrls.get("derby"), connectionProps) | "APP" | true | "SELECT 3 FROM SYSIBM.SYSDUMMY1"
"hsqldb" | new JDBCDriver().connect(jdbcUrls.get("hsqldb"), connectionProps) | "SA" | "SELECT 3 FROM INFORMATION_SCHEMA.SYSTEM_USERS" "hsqldb" | new JDBCDriver().connect(jdbcUrls.get("hsqldb"), connectionProps) | "SA" | true | "SELECT 3 FROM INFORMATION_SCHEMA.SYSTEM_USERS"
"h2" | cpDatasources.get("tomcat").get("h2").getConnection() | null | "SELECT 3" "h2" | cpDatasources.get("tomcat").get("h2").getConnection() | null | false | "SELECT 3"
"derby" | cpDatasources.get("tomcat").get("derby").getConnection() | "APP" | "SELECT 3 FROM SYSIBM.SYSDUMMY1" "derby" | cpDatasources.get("tomcat").get("derby").getConnection() | "APP" | false | "SELECT 3 FROM SYSIBM.SYSDUMMY1"
"hsqldb" | cpDatasources.get("tomcat").get("hsqldb").getConnection() | "SA" | "SELECT 3 FROM INFORMATION_SCHEMA.SYSTEM_USERS" "hsqldb" | cpDatasources.get("tomcat").get("hsqldb").getConnection() | "SA" | true | "SELECT 3 FROM INFORMATION_SCHEMA.SYSTEM_USERS"
"h2" | cpDatasources.get("hikari").get("h2").getConnection() | null | "SELECT 3" "h2" | cpDatasources.get("hikari").get("h2").getConnection() | null | false | "SELECT 3"
"derby" | cpDatasources.get("hikari").get("derby").getConnection() | "APP" | "SELECT 3 FROM SYSIBM.SYSDUMMY1" "derby" | cpDatasources.get("hikari").get("derby").getConnection() | "APP" | true | "SELECT 3 FROM SYSIBM.SYSDUMMY1"
"hsqldb" | cpDatasources.get("hikari").get("hsqldb").getConnection() | "SA" | "SELECT 3 FROM INFORMATION_SCHEMA.SYSTEM_USERS" "hsqldb" | cpDatasources.get("hikari").get("hsqldb").getConnection() | "SA" | false | "SELECT 3 FROM INFORMATION_SCHEMA.SYSTEM_USERS"
"h2" | cpDatasources.get("c3p0").get("h2").getConnection() | null | "SELECT 3" "h2" | cpDatasources.get("c3p0").get("h2").getConnection() | null | true | "SELECT 3"
"derby" | cpDatasources.get("c3p0").get("derby").getConnection() | "APP" | "SELECT 3 FROM SYSIBM.SYSDUMMY1" "derby" | cpDatasources.get("c3p0").get("derby").getConnection() | "APP" | false | "SELECT 3 FROM SYSIBM.SYSDUMMY1"
"hsqldb" | cpDatasources.get("c3p0").get("hsqldb").getConnection() | "SA" | "SELECT 3 FROM INFORMATION_SCHEMA.SYSTEM_USERS" "hsqldb" | cpDatasources.get("c3p0").get("hsqldb").getConnection() | "SA" | false | "SELECT 3 FROM INFORMATION_SCHEMA.SYSTEM_USERS"
} }
@Unroll @Unroll

View File

@ -1,4 +1,5 @@
import datadog.trace.agent.test.AgentTestRunner import datadog.trace.agent.test.AgentTestRunner
import datadog.trace.api.Config
import datadog.trace.api.DDSpanTypes import datadog.trace.api.DDSpanTypes
import io.opentracing.tag.Tags import io.opentracing.tag.Tags
import redis.clients.jedis.Jedis import redis.clients.jedis.Jedis
@ -22,11 +23,16 @@ class JedisClientTest extends AgentTestRunner {
def setupSpec() { def setupSpec() {
println "Using redis: $redisServer.args" println "Using redis: $redisServer.args"
redisServer.start() redisServer.start()
// This setting should have no effect since decorator returns null for the instance.
System.setProperty(Config.PREFIX + Config.DB_CLIENT_HOST_SPLIT_BY_INSTANCE, "true")
} }
def cleanupSpec() { def cleanupSpec() {
redisServer.stop() redisServer.stop()
// jedis.close() // not available in the early version we're using. // jedis.close() // not available in the early version we're using.
System.clearProperty(Config.PREFIX + Config.DB_CLIENT_HOST_SPLIT_BY_INSTANCE)
} }
def setup() { def setup() {

View File

@ -6,6 +6,7 @@ import com.mongodb.client.MongoCollection
import com.mongodb.client.MongoDatabase import com.mongodb.client.MongoDatabase
import datadog.opentracing.DDSpan import datadog.opentracing.DDSpan
import datadog.trace.agent.test.asserts.TraceAssert import datadog.trace.agent.test.asserts.TraceAssert
import datadog.trace.api.Config
import datadog.trace.api.DDSpanTypes import datadog.trace.api.DDSpanTypes
import io.opentracing.tag.Tags import io.opentracing.tag.Tags
import org.bson.BsonDocument import org.bson.BsonDocument
@ -13,6 +14,7 @@ import org.bson.BsonString
import org.bson.Document import org.bson.Document
import spock.lang.Shared import spock.lang.Shared
import static datadog.trace.agent.test.utils.ConfigUtils.withConfigOverride
import static datadog.trace.agent.test.utils.PortUtils.UNUSABLE_PORT import static datadog.trace.agent.test.utils.PortUtils.UNUSABLE_PORT
import static datadog.trace.agent.test.utils.TraceUtils.runUnderTrace import static datadog.trace.agent.test.utils.TraceUtils.runUnderTrace
@ -38,18 +40,21 @@ class MongoClientTest extends MongoBaseTest {
MongoDatabase db = client.getDatabase(dbName) MongoDatabase db = client.getDatabase(dbName)
when: when:
withConfigOverride(Config.DB_CLIENT_HOST_SPLIT_BY_INSTANCE, "$renameService") {
db.createCollection(collectionName) db.createCollection(collectionName)
}
then: then:
assertTraces(1) { assertTraces(1) {
trace(0, 1) { trace(0, 1) {
mongoSpan(it, 0, "{\"create\":\"$collectionName\",\"capped\":\"?\"}") mongoSpan(it, 0, "{\"create\":\"$collectionName\",\"capped\":\"?\"}", renameService)
} }
} }
where: where:
dbName = "test_db" dbName = "test_db"
collectionName = "testCollection" collectionName = "testCollection"
renameService << [false, true]
} }
def "test create collection no description"() { def "test create collection no description"() {
@ -62,7 +67,7 @@ class MongoClientTest extends MongoBaseTest {
then: then:
assertTraces(1) { assertTraces(1) {
trace(0, 1) { trace(0, 1) {
mongoSpan(it, 0, "{\"create\":\"$collectionName\",\"capped\":\"?\"}", dbName) mongoSpan(it, 0, "{\"create\":\"$collectionName\",\"capped\":\"?\"}", false, dbName)
} }
} }
@ -228,9 +233,9 @@ class MongoClientTest extends MongoBaseTest {
collectionName = "testCollection" collectionName = "testCollection"
} }
def mongoSpan(TraceAssert trace, int index, String statement, String instance = "some-description", Object parentSpan = null, Throwable exception = null) { def mongoSpan(TraceAssert trace, int index, String statement, boolean renameService = false, String instance = "some-description", Object parentSpan = null, Throwable exception = null) {
trace.span(index) { trace.span(index) {
serviceName "mongo" serviceName renameService ? instance : "mongo"
operationName "mongo.query" operationName "mongo.query"
resourceName { resourceName {
assert it.replace(" ", "") == statement assert it.replace(" ", "") == statement

View File

@ -3,6 +3,7 @@ package datadog.trace.instrumentation.spymemcached
import com.google.common.util.concurrent.MoreExecutors import com.google.common.util.concurrent.MoreExecutors
import datadog.trace.agent.test.AgentTestRunner import datadog.trace.agent.test.AgentTestRunner
import datadog.trace.agent.test.asserts.TraceAssert import datadog.trace.agent.test.asserts.TraceAssert
import datadog.trace.api.Config
import datadog.trace.api.DDSpanTypes import datadog.trace.api.DDSpanTypes
import io.opentracing.tag.Tags import io.opentracing.tag.Tags
import net.spy.memcached.CASResponse import net.spy.memcached.CASResponse
@ -71,12 +72,17 @@ class SpymemcachedTest extends AgentTestRunner {
memcachedContainer.getMappedPort(defaultMemcachedPort) memcachedContainer.getMappedPort(defaultMemcachedPort)
) )
} }
// This setting should have no effect since decorator returns null for the instance.
System.setProperty(Config.PREFIX + Config.DB_CLIENT_HOST_SPLIT_BY_INSTANCE, "true")
} }
def cleanupSpec() { def cleanupSpec() {
if (memcachedContainer) { if (memcachedContainer) {
memcachedContainer.stop() memcachedContainer.stop()
} }
System.clearProperty(Config.PREFIX + Config.DB_CLIENT_HOST_SPLIT_BY_INSTANCE)
} }
ReentrantLock queueLock ReentrantLock queueLock