Skip to content

Commit 107144b

Browse files
author
cindy-peng
committed
"Add tracehandler test"
1 parent 246c1f5 commit 107144b

File tree

3 files changed

+36
-13
lines changed

3 files changed

+36
-13
lines changed

google-cloud-logging/src/main/java/com/google/cloud/logging/Context.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,9 @@ public class Context {
3737
private static final Pattern W3C_TRACE_CONTEXT_FORMAT =
3838
Pattern.compile(
3939
"^00-(?!00000000000000000000000000000000)[0-9a-f]{32}-(?!0000000000000000)[0-9a-f]{16}-[0-9a-f]{2}$");
40+
// Trace sampled flag for bit masking
41+
// see https://www.w3.org/TR/trace-context/#trace-flags for details
42+
private static final byte FLAG_SAMPLED = 1; // 00000001
4043
private final HttpRequest request;
4144
private final String traceId;
4245
private final String spanId;
@@ -144,7 +147,9 @@ public Builder setTraceSampled(boolean traceSampled) {
144147
@CanIgnoreReturnValue
145148
public Builder loadCloudTraceContext(String cloudTrace) {
146149
if (cloudTrace != null) {
150+
String traceSampledString = Iterables.get(Splitter.on(";o=").split(cloudTrace), 1);
147151
cloudTrace = Iterables.get(Splitter.on(';').split(cloudTrace), 0);
152+
148153
int split = cloudTrace.indexOf('/');
149154
if (split >= 0) {
150155
String traceId = cloudTrace.substring(0, split);
@@ -155,6 +160,10 @@ public Builder loadCloudTraceContext(String cloudTrace) {
155160
if (!spanId.isEmpty()) {
156161
setSpanId(spanId);
157162
}
163+
// do not set trace sampled flag without trace Id
164+
if (!traceSampledString.isEmpty()) {
165+
setTraceSampled(traceSampledString.equals("1"));
166+
}
158167
}
159168
} else if (!cloudTrace.isEmpty()) {
160169
setTraceId(cloudTrace);
@@ -186,7 +195,9 @@ public Builder loadW3CTraceParentContext(String traceParent) {
186195
List<String> fields = Splitter.on('-').splitToList(traceParent);
187196
setTraceId(fields.get(1));
188197
setSpanId(fields.get(2));
189-
// fields[3] contains flag(s)
198+
boolean sampled = (Integer.parseInt(fields.get(3), 16) & FLAG_SAMPLED) == FLAG_SAMPLED;
199+
System.out.println("trace: " + fields.get(1) + ", span: " + fields.get(2) + ", sampled string " + fields.get(3) + ", sampled boolean: " + sampled);
200+
setTraceSampled(sampled);
190201
}
191202
return this;
192203
}

google-cloud-logging/src/main/java/com/google/cloud/logging/LoggingHandler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,7 @@ public enum LogTarget {
171171

172172
private final WriteOption[] defaultWriteOptions;
173173

174-
/** Creates an handler that publishes messages to Cloud Logging. */
174+
/** Creates a handler that publishes messages to Cloud Logging. */
175175
public LoggingHandler() {
176176
this(null, null, null);
177177
}

google-cloud-logging/src/test/java/com/google/cloud/logging/ContextTest.java

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ public class ContextTest {
3737
// DO NOT use dash in trace and span id because W3C traceparent format uses dash as a delimieter
3838
private static final String TEST_TRACE_ID = "test_trace_id";
3939
private static final String TEST_SPAN_ID = "test_span_id";
40+
private static final boolean TEST_TRACE_SAMPLED = true;
4041

4142
private static final HttpRequest REQUEST =
4243
HttpRequest.newBuilder()
@@ -68,6 +69,7 @@ public class ContextTest {
6869
.setRequest(PARTIAL_REQUEST)
6970
.setTraceId(TEST_TRACE_ID)
7071
.setSpanId(TEST_SPAN_ID)
72+
.setTraceSampled(TEST_TRACE_SAMPLED)
7173
.build();
7274

7375
@Test
@@ -87,6 +89,7 @@ public void testCompareContexts() {
8789
.setServerIp(SERVER_IP)
8890
.setTraceId(TEST_TRACE_ID)
8991
.setSpanId(TEST_SPAN_ID)
92+
.setTraceSampled(TEST_TRACE_SAMPLED)
9093
.build();
9194

9295
assertNotEquals(TEST_CONTEXT, context1);
@@ -103,9 +106,11 @@ public void testContextBuilder() {
103106
assertEquals(PARTIAL_REQUEST, TEST_CONTEXT.getHttpRequest());
104107
assertEquals(TEST_TRACE_ID, TEST_CONTEXT.getTraceId());
105108
assertEquals(TEST_SPAN_ID, TEST_CONTEXT.getSpanId());
109+
assertEquals(TEST_TRACE_SAMPLED, TEST_CONTEXT.getTraceSampled());
106110
assertNull(emptyContext.getHttpRequest());
107111
assertNull(emptyContext.getTraceId());
108112
assertNull(emptyContext.getSpanId());
113+
assertFalse(emptyContext.getTraceSampled());
109114
assertEquals(TEST_CONTEXT, anotherContext);
110115
}
111116

@@ -114,40 +119,47 @@ public void testParsingCloudTraceContext() {
114119
final String X_CLOUD_TRACE_NO_TRACE = "/SPAN_ID;o=TRACE_TRUE";
115120
final String X_CLOUD_TRACE_ONLY = TEST_TRACE_ID;
116121
final String X_CLOUD_TRACE_WITH_SPAN = TEST_TRACE_ID + "/" + TEST_SPAN_ID;
117-
final String X_CLOUD_TRACE_FULL = TEST_TRACE_ID + "/" + TEST_SPAN_ID + ";o=TRACE_TRUE";
122+
final String X_CLOUD_TRACE_FULL = TEST_TRACE_ID + "/" + TEST_SPAN_ID + ";o=" + TEST_TRACE_SAMPLED;
118123

119124
Context.Builder builder = Context.newBuilder();
120125

121126
builder.loadCloudTraceContext(null);
122-
assertTraceAndSpan(builder.build(), null, null);
127+
assertTraceSpanAndSampled(builder.build(), null, null, false);
123128
builder.loadCloudTraceContext("");
124-
assertTraceAndSpan(builder.build(), null, null);
129+
assertTraceSpanAndSampled(builder.build(), null, null, false);
125130
builder.loadCloudTraceContext(X_CLOUD_TRACE_NO_TRACE);
126-
assertTraceAndSpan(builder.build(), null, null);
131+
assertTraceSpanAndSampled(builder.build(), null, null, false);
127132
builder.loadCloudTraceContext(X_CLOUD_TRACE_ONLY);
128-
assertTraceAndSpan(builder.build(), TEST_TRACE_ID, null);
133+
assertTraceSpanAndSampled(builder.build(), TEST_TRACE_ID, null, false);
129134
builder.loadCloudTraceContext(X_CLOUD_TRACE_WITH_SPAN);
130-
assertTraceAndSpan(builder.build(), TEST_TRACE_ID, TEST_SPAN_ID);
135+
assertTraceSpanAndSampled(builder.build(), TEST_TRACE_ID, TEST_SPAN_ID, false);
131136
builder.loadCloudTraceContext(X_CLOUD_TRACE_FULL);
132-
assertTraceAndSpan(builder.build(), TEST_TRACE_ID, TEST_SPAN_ID);
137+
assertTraceSpanAndSampled(builder.build(), TEST_TRACE_ID, TEST_SPAN_ID, TEST_TRACE_SAMPLED);
133138
}
134139

135140
@Test
136141
public void testParsingW3CTraceParent() {
137142
final String W3C_TEST_TRACE_ID = "12345678901234567890123456789012";
138143
final String W3C_TEST_SPAN_ID = "1234567890123456";
139-
final String W3C_TRACE_CONTEXT = "00-" + W3C_TEST_TRACE_ID + "-" + W3C_TEST_SPAN_ID + "-00";
144+
final String W3C_TEST_TRACE_SAMPLED = "0f";
145+
final String W3C_TRACE_CONTEXT = "00-" + W3C_TEST_TRACE_ID + "-" + W3C_TEST_SPAN_ID + "-" + W3C_TEST_TRACE_SAMPLED;
140146

141147
Context.Builder builder = Context.newBuilder();
142148

143149
builder.loadW3CTraceParentContext(null);
144-
assertTraceAndSpan(builder.build(), null, null);
150+
assertTraceSpanAndSampled(builder.build(), null, null, false);
145151
builder.loadW3CTraceParentContext(W3C_TRACE_CONTEXT);
146-
assertTraceAndSpan(builder.build(), W3C_TEST_TRACE_ID, W3C_TEST_SPAN_ID);
152+
assertTraceSpanAndSampled(builder.build(), W3C_TEST_TRACE_ID, W3C_TEST_SPAN_ID, true);
147153
}
148154

149-
private void assertTraceAndSpan(Context context, String expectedTraceId, String expectedSpanId) {
155+
private void assertTraceAndSpan1(Context context, String expectedTraceId, String expectedSpanId) {
150156
assertEquals(expectedTraceId, context.getTraceId());
151157
assertEquals(expectedSpanId, context.getSpanId());
152158
}
159+
160+
private void assertTraceSpanAndSampled(Context context, String expectedTraceId, String expectedSpanId, boolean expectedTraceSampled) {
161+
assertEquals(expectedTraceId, context.getTraceId());
162+
assertEquals(expectedSpanId, context.getSpanId());
163+
assertEquals(expectedTraceSampled, context.getTraceSampled());
164+
}
153165
}

0 commit comments

Comments
 (0)