opentelemetry-java-instrume.../dd-java-agent-ittests/src/test/java/datadog/trace/agent/integration/MongoClientInstrumentationT...

116 lines
4.1 KiB
Java

package datadog.trace.agent.integration;
import com.mongodb.MongoClient;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import datadog.opentracing.DDSpan;
import datadog.opentracing.DDTracer;
import datadog.trace.agent.test.TestUtils;
import datadog.trace.common.writer.ListWriter;
import de.flapdoodle.embed.mongo.MongodExecutable;
import de.flapdoodle.embed.mongo.MongodProcess;
import de.flapdoodle.embed.mongo.MongodStarter;
import de.flapdoodle.embed.mongo.config.IMongodConfig;
import de.flapdoodle.embed.mongo.config.MongodConfigBuilder;
import de.flapdoodle.embed.mongo.config.Net;
import de.flapdoodle.embed.mongo.distribution.Version;
import de.flapdoodle.embed.process.runtime.Network;
import io.opentracing.tag.Tags;
import java.net.UnknownHostException;
import org.bson.Document;
import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;
public class MongoClientInstrumentationTest {
public static final String MONGO_DB_NAME = "embedded";
public static final String MONGO_HOST = "localhost";
public static final int MONGO_PORT = 12345;
private static MongodExecutable mongodExe;
private static MongodProcess mongod;
private static MongoClient client;
private static final ListWriter writer = new ListWriter();
private static final DDTracer tracer = new DDTracer(writer);
public static void startLocalMongo() throws Exception {
final MongodStarter starter = MongodStarter.getDefaultInstance();
final IMongodConfig mongodConfig =
new MongodConfigBuilder()
.version(Version.Main.PRODUCTION)
.net(new Net(MONGO_HOST, MONGO_PORT, Network.localhostIsIPv6()))
.build();
mongodExe = starter.prepare(mongodConfig);
mongod = mongodExe.start();
}
public static void stopLocalMongo() throws Exception {
if (null != mongod) {
mongod.stop();
mongod = null;
}
if (null != mongodExe) {
mongodExe.stop();
mongodExe = null;
}
}
@BeforeClass
public static void setup() throws Exception {
TestUtils.registerOrReplaceGlobalTracer(tracer);
startLocalMongo();
client = new MongoClient(MONGO_HOST, MONGO_PORT);
}
@AfterClass
public static void destroy() throws Exception {
if (null != client) {
client.close();
client = null;
}
stopLocalMongo();
}
@Test
public void syncClientHasListener() {
Assert.assertEquals(1, client.getMongoClientOptions().getCommandListeners().size());
Assert.assertEquals(
"DDTracingCommandListener",
client.getMongoClientOptions().getCommandListeners().get(0).getClass().getSimpleName());
}
@Test
public void insertOperation() throws UnknownHostException {
final MongoDatabase db = client.getDatabase(MONGO_DB_NAME);
final String collectionName = "testCollection";
db.createCollection(collectionName);
final MongoCollection<Document> collection = db.getCollection(collectionName);
collection.insertOne(new Document("foo", "bar"));
Assert.assertEquals(1, collection.count());
Assert.assertEquals(3, writer.size());
final String createCollectionQuery =
"{ \"create\" : \"testCollection\", \"autoIndexId\" : \"?\", \"capped\" : \"?\" }";
final DDSpan trace0 = writer.get(0).get(0);
Assert.assertEquals("mongo.query", trace0.getOperationName());
Assert.assertEquals(createCollectionQuery, trace0.getResourceName());
Assert.assertEquals("mongodb", trace0.getType());
Assert.assertEquals("mongo", trace0.getServiceName());
Assert.assertEquals("java-mongo", trace0.getTags().get(Tags.COMPONENT.getKey()));
Assert.assertEquals(createCollectionQuery, trace0.getTags().get(Tags.DB_STATEMENT.getKey()));
Assert.assertEquals(MONGO_DB_NAME, trace0.getTags().get(Tags.DB_INSTANCE.getKey()));
Assert.assertEquals(MONGO_HOST, trace0.getTags().get(Tags.PEER_HOSTNAME.getKey()));
Assert.assertEquals("127.0.0.1", trace0.getTags().get(Tags.PEER_HOST_IPV4.getKey()));
Assert.assertEquals(MONGO_PORT, trace0.getTags().get(Tags.PEER_PORT.getKey()));
Assert.assertEquals("mongo", trace0.getTags().get(Tags.DB_TYPE.getKey()));
}
}