Skip to content

Commit 72859b4

Browse files
committed
Tracing: added abstract-based unit tests
These tests verify that the span tree structure is valid and that spans are filled with tags of proper content, by providing a mock implementation of TracingInfo.
1 parent f4a0016 commit 72859b4

File tree

3 files changed

+570
-0
lines changed

3 files changed

+570
-0
lines changed
Lines changed: 206 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,206 @@
1+
/*
2+
* Copyright (C) 2021 ScyllaDB
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package com.datastax.driver.core.tracing;
18+
19+
import static org.junit.Assert.assertFalse;
20+
import static org.junit.Assert.assertNotNull;
21+
import static org.testng.Assert.assertEquals;
22+
import static org.testng.Assert.assertNotEquals;
23+
import static org.testng.Assert.assertNull;
24+
import static org.testng.Assert.assertTrue;
25+
26+
import com.datastax.driver.core.BoundStatement;
27+
import com.datastax.driver.core.CCMTestsSupport;
28+
import com.datastax.driver.core.ConsistencyLevel;
29+
import com.datastax.driver.core.PreparedStatement;
30+
import com.datastax.driver.core.Session;
31+
import com.datastax.driver.core.policies.DefaultRetryPolicy;
32+
import com.datastax.driver.core.policies.NoSpeculativeExecutionPolicy;
33+
import com.datastax.driver.core.policies.PagingOptimizingLoadBalancingPolicy;
34+
import java.util.ArrayList;
35+
import java.util.Collection;
36+
import org.testng.annotations.Test;
37+
38+
public class BasicTracingTest extends CCMTestsSupport {
39+
private static TestTracingInfoFactory testTracingInfoFactory;
40+
private Session session;
41+
42+
@Override
43+
public void onTestContextInitialized() {
44+
initializeTestTracing();
45+
session.execute("USE " + keyspace);
46+
session.execute("CREATE TABLE t (k int PRIMARY KEY, v int)");
47+
48+
Collection<TracingInfo> spans = testTracingInfoFactory.getSpans();
49+
spans.clear();
50+
}
51+
52+
@Test(groups = "short")
53+
public void simpleTracingTest() {
54+
session.execute("INSERT INTO t(k, v) VALUES (1, 7)");
55+
56+
Collection<TracingInfo> spans = testTracingInfoFactory.getSpans();
57+
assertNotEquals(spans.size(), 0);
58+
59+
TracingInfo rootSpan = getRoot(spans);
60+
assertTrue(rootSpan instanceof TestTracingInfo);
61+
TestTracingInfo root = (TestTracingInfo) rootSpan;
62+
63+
assertTrue(root.isSpanStarted());
64+
assertTrue(root.isSpanFinished());
65+
assertEquals(root.getStatusCode(), TracingInfo.StatusCode.OK);
66+
67+
spans.clear();
68+
}
69+
70+
@Test(groups = "short")
71+
public void tagsTest() {
72+
PreparedStatement prepared = session.prepare("INSERT INTO t(k, v) VALUES (?, ?)");
73+
74+
Collection<TracingInfo> prepareSpans = testTracingInfoFactory.getSpans();
75+
assertNotEquals(prepareSpans.size(), 0);
76+
assertTrue(getRoot(prepareSpans) instanceof TestTracingInfo);
77+
prepareSpans.clear();
78+
79+
BoundStatement bound = prepared.bind(1, 7);
80+
session.execute(bound);
81+
82+
Collection<TracingInfo> spans = testTracingInfoFactory.getSpans();
83+
assertNotEquals(spans.size(), 0);
84+
85+
TracingInfo rootSpan = getRoot(spans);
86+
assertTrue(rootSpan instanceof TestTracingInfo);
87+
TestTracingInfo root = (TestTracingInfo) rootSpan;
88+
89+
assertTrue(root.isSpanStarted());
90+
assertTrue(root.isSpanFinished());
91+
assertEquals(root.getStatusCode(), TracingInfo.StatusCode.OK);
92+
93+
// these tags should be set for request span
94+
assertEquals(root.getStatementType(), "prepared");
95+
assertEquals(root.getBatchSize(), new Integer(1));
96+
assertEquals(root.getConsistencyLevel(), ConsistencyLevel.ONE);
97+
assertNull(root.getRowsCount()); // no rows are returned in insert
98+
assertTrue(root.getLoadBalancingPolicy() instanceof PagingOptimizingLoadBalancingPolicy);
99+
assertTrue(root.getSpeculativeExecutionPolicy() instanceof NoSpeculativeExecutionPolicy);
100+
assertTrue(root.getRetryPolicy() instanceof DefaultRetryPolicy);
101+
assertFalse(root.getQueryPaged());
102+
assertNull(root.getStatement()); // because of precision level NORMAL
103+
// these are tags specific to bound statement
104+
assertEquals(root.getKeyspace(), keyspace);
105+
assertEquals(root.getPartitionKey(), "k=1");
106+
assertEquals(root.getTable(), "t");
107+
108+
// these tags should not be set for request span
109+
assertNull(root.getPeerName());
110+
assertNull(root.getPeerIP());
111+
assertNull(root.getPeerPort());
112+
assertNull(root.getRetryCount());
113+
114+
ArrayList<TracingInfo> speculativeExecutions = getChildren(spans, root);
115+
assertTrue(speculativeExecutions.size() > 0);
116+
117+
for (TracingInfo speculativeExecutionSpan : speculativeExecutions) {
118+
assertTrue(speculativeExecutionSpan instanceof TestTracingInfo);
119+
TestTracingInfo tracingInfo = (TestTracingInfo) speculativeExecutionSpan;
120+
121+
// these tags should not be set for speculative execution span
122+
assertNull(tracingInfo.getStatementType());
123+
assertNull(tracingInfo.getBatchSize());
124+
assertNull(tracingInfo.getConsistencyLevel());
125+
assertNull(tracingInfo.getRowsCount());
126+
assertNull(tracingInfo.getLoadBalancingPolicy());
127+
assertNull(tracingInfo.getRetryPolicy());
128+
assertNull(tracingInfo.getQueryPaged());
129+
assertNull(tracingInfo.getStatement());
130+
assertNull(tracingInfo.getPeerName());
131+
assertNull(tracingInfo.getPeerIP());
132+
assertNull(tracingInfo.getPeerPort());
133+
// these are tags specific to bound statement
134+
assertNull(tracingInfo.getKeyspace());
135+
assertNull(tracingInfo.getPartitionKey());
136+
assertNull(tracingInfo.getTable());
137+
138+
// this tag should be set for speculative execution span
139+
assertTrue(tracingInfo.getRetryCount() >= 0);
140+
}
141+
142+
ArrayList<TracingInfo> queries = new ArrayList<TracingInfo>();
143+
for (TracingInfo tracingInfo : speculativeExecutions) {
144+
queries.addAll(getChildren(spans, tracingInfo));
145+
}
146+
assertTrue(queries.size() > 0);
147+
148+
for (TracingInfo querySpan : queries) {
149+
assertTrue(querySpan instanceof TestTracingInfo);
150+
TestTracingInfo tracingInfo = (TestTracingInfo) querySpan;
151+
152+
// these tags should not be set for query span
153+
assertNull(tracingInfo.getStatementType());
154+
assertNull(tracingInfo.getBatchSize());
155+
assertNull(tracingInfo.getConsistencyLevel());
156+
assertNull(tracingInfo.getRowsCount());
157+
assertNull(tracingInfo.getLoadBalancingPolicy());
158+
assertNull(tracingInfo.getRetryPolicy());
159+
assertNull(tracingInfo.getQueryPaged());
160+
assertNull(tracingInfo.getStatement());
161+
assertNull(tracingInfo.getRetryCount());
162+
// these are tags specific to bound statement
163+
assertNull(tracingInfo.getKeyspace());
164+
assertNull(tracingInfo.getPartitionKey());
165+
assertNull(tracingInfo.getTable());
166+
167+
// these tags should be set for query span
168+
assertNotNull(tracingInfo.getPeerName());
169+
assertNotNull(tracingInfo.getPeerIP());
170+
assertNotNull(tracingInfo.getPeerPort());
171+
assertTrue(tracingInfo.getPeerPort() >= 0 && tracingInfo.getPeerPort() <= 65535);
172+
}
173+
174+
spans.clear();
175+
}
176+
177+
private void initializeTestTracing() {
178+
testTracingInfoFactory = new TestTracingInfoFactory(PrecisionLevel.NORMAL);
179+
cluster().setTracingInfoFactory(testTracingInfoFactory);
180+
session = cluster().connect();
181+
}
182+
183+
private TracingInfo getRoot(Collection<TracingInfo> spans) {
184+
TracingInfo root = null;
185+
for (TracingInfo tracingInfo : spans) {
186+
if (tracingInfo instanceof TestTracingInfo
187+
&& ((TestTracingInfo) tracingInfo).getParent() == null) {
188+
assertNull(root); // There should be only one root.
189+
root = tracingInfo;
190+
}
191+
}
192+
193+
return root;
194+
}
195+
196+
private ArrayList<TracingInfo> getChildren(Collection<TracingInfo> spans, TracingInfo parent) {
197+
ArrayList<TracingInfo> children = new ArrayList<TracingInfo>();
198+
for (TracingInfo tracingInfo : spans) {
199+
if (tracingInfo instanceof TestTracingInfo
200+
&& ((TestTracingInfo) tracingInfo).getParent() == parent) {
201+
children.add(tracingInfo);
202+
}
203+
}
204+
return children;
205+
}
206+
}

0 commit comments

Comments
 (0)