Skip to content

Commit ad01b46

Browse files
authored
Simplifying Oversampling Mitigation (#356)
1 parent 5dce456 commit ad01b46

File tree

11 files changed

+116
-128
lines changed

11 files changed

+116
-128
lines changed

aws-xray-recorder-sdk-core/src/main/java/com/amazonaws/xray/AWSXRayRecorder.java

+1-5
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@
3232
import com.amazonaws.xray.exceptions.SubsegmentNotFoundException;
3333
import com.amazonaws.xray.internal.FastIdGenerator;
3434
import com.amazonaws.xray.internal.IdGenerator;
35-
import com.amazonaws.xray.internal.SamplingStrategyOverride;
3635
import com.amazonaws.xray.internal.SecureIdGenerator;
3736
import com.amazonaws.xray.listeners.SegmentListener;
3837
import com.amazonaws.xray.strategy.ContextMissingStrategy;
@@ -636,10 +635,7 @@ public Subsegment beginSubsegmentWithoutSampling(String name) {
636635
// context to be propagated downstream
637636
return Subsegment.noOp(this, false);
638637
}
639-
return context.beginSubsegmentWithSamplingOverride(
640-
this,
641-
name,
642-
SamplingStrategyOverride.FALSE);
638+
return context.beginSubsegmentWithoutSampling(this, name);
643639
}
644640

645641
/**

aws-xray-recorder-sdk-core/src/main/java/com/amazonaws/xray/contexts/LambdaSegmentContext.java

+15-17
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525
import com.amazonaws.xray.entities.TraceHeader.SampleDecision;
2626
import com.amazonaws.xray.entities.TraceID;
2727
import com.amazonaws.xray.exceptions.SubsegmentNotFoundException;
28-
import com.amazonaws.xray.internal.SamplingStrategyOverride;
2928
import com.amazonaws.xray.listeners.SegmentListener;
3029
import java.util.List;
3130
import java.util.Objects;
@@ -62,11 +61,17 @@ private static FacadeSegment newFacadeSegment(AWSXRayRecorder recorder, String n
6261
}
6362

6463
@Override
65-
public Subsegment beginSubsegmentWithSamplingOverride(
64+
public Subsegment beginSubsegmentWithoutSampling(
6665
AWSXRayRecorder recorder,
67-
String name,
68-
SamplingStrategyOverride samplingStrategyOverride) {
66+
String name) {
6967

68+
Subsegment subsegment = beginSubsegment(recorder, name);
69+
subsegment.setSampledFalse();
70+
return subsegment;
71+
}
72+
73+
@Override
74+
public Subsegment beginSubsegment(AWSXRayRecorder recorder, String name) {
7075
if (logger.isDebugEnabled()) {
7176
logger.debug("Beginning subsegment named: " + name);
7277
}
@@ -75,12 +80,11 @@ public Subsegment beginSubsegmentWithSamplingOverride(
7580
if (entity == null) { // First subsgment of a subsegment branch.
7681
Segment parentSegment = newFacadeSegment(recorder, name);
7782

78-
boolean isRecording = parentSegment.isRecording() &&
79-
samplingStrategyOverride == SamplingStrategyOverride.DISABLED;
83+
boolean isRecording = parentSegment.isRecording();
8084

8185
Subsegment subsegment = isRecording
82-
? new SubsegmentImpl(recorder, name, parentSegment, samplingStrategyOverride)
83-
: Subsegment.noOp(parentSegment, recorder, samplingStrategyOverride);
86+
? new SubsegmentImpl(recorder, name, parentSegment)
87+
: Subsegment.noOp(parentSegment, recorder);
8488
subsegment.setParent(parentSegment);
8589
// Enable FacadeSegment to keep track of its subsegments for subtree streaming
8690
parentSegment.addSubsegment(subsegment);
@@ -97,12 +101,11 @@ public Subsegment beginSubsegmentWithSamplingOverride(
97101
}
98102
Segment parentSegment = parentSubsegment.getParentSegment();
99103

100-
boolean isRecording = parentSegment.isRecording() &&
101-
samplingStrategyOverride == SamplingStrategyOverride.DISABLED;
104+
boolean isRecording = parentSegment.isRecording();
102105

103106
Subsegment subsegment = isRecording
104-
? new SubsegmentImpl(recorder, name, parentSegment, samplingStrategyOverride)
105-
: Subsegment.noOp(parentSegment, recorder, samplingStrategyOverride);
107+
? new SubsegmentImpl(recorder, name, parentSegment)
108+
: Subsegment.noOp(parentSegment, recorder);
106109
subsegment.setParent(parentSubsegment);
107110
parentSubsegment.addSubsegment(subsegment);
108111
setTraceEntity(subsegment);
@@ -116,11 +119,6 @@ public Subsegment beginSubsegmentWithSamplingOverride(
116119
}
117120
}
118121

119-
@Override
120-
public Subsegment beginSubsegment(AWSXRayRecorder recorder, String name) {
121-
return beginSubsegmentWithSamplingOverride(recorder, name, SamplingStrategyOverride.DISABLED);
122-
}
123-
124122
@Override
125123
public void endSubsegment(AWSXRayRecorder recorder) {
126124
Entity current = getTraceEntity();

aws-xray-recorder-sdk-core/src/main/java/com/amazonaws/xray/contexts/SegmentContext.java

+2-4
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020
import com.amazonaws.xray.entities.Entity;
2121
import com.amazonaws.xray.entities.Segment;
2222
import com.amazonaws.xray.entities.Subsegment;
23-
import com.amazonaws.xray.internal.SamplingStrategyOverride;
2423
import java.util.Objects;
2524
import org.apache.commons.logging.Log;
2625
import org.apache.commons.logging.LogFactory;
@@ -66,10 +65,9 @@ default void clearTraceEntity() {
6665

6766
Subsegment beginSubsegment(AWSXRayRecorder recorder, String name);
6867

69-
Subsegment beginSubsegmentWithSamplingOverride(
68+
Subsegment beginSubsegmentWithoutSampling(
7069
AWSXRayRecorder recorder,
71-
String name,
72-
SamplingStrategyOverride samplingStrategyOverride);
70+
String name);
7371

7472
void endSubsegment(AWSXRayRecorder recorder);
7573
}

aws-xray-recorder-sdk-core/src/main/java/com/amazonaws/xray/contexts/ThreadLocalSegmentContext.java

+14-15
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222
import com.amazonaws.xray.entities.SubsegmentImpl;
2323
import com.amazonaws.xray.exceptions.SegmentNotFoundException;
2424
import com.amazonaws.xray.exceptions.SubsegmentNotFoundException;
25-
import com.amazonaws.xray.internal.SamplingStrategyOverride;
2625
import com.amazonaws.xray.listeners.SegmentListener;
2726
import java.util.List;
2827
import java.util.Objects;
@@ -34,23 +33,29 @@ public class ThreadLocalSegmentContext implements SegmentContext {
3433
LogFactory.getLog(ThreadLocalSegmentContext.class);
3534

3635
@Override
37-
public Subsegment beginSubsegmentWithSamplingOverride(
36+
public Subsegment beginSubsegmentWithoutSampling(
3837
AWSXRayRecorder recorder,
39-
String name,
40-
SamplingStrategyOverride samplingStrategyOverride) {
38+
String name) {
39+
Subsegment subsegment = beginSubsegment(recorder, name);
40+
subsegment.setSampledFalse();
41+
return subsegment;
42+
}
43+
44+
@Override
45+
public Subsegment beginSubsegment(AWSXRayRecorder recorder, String name) {
4146
Entity current = getTraceEntity();
4247
if (current == null) {
4348
recorder.getContextMissingStrategy().contextMissing("Failed to begin subsegment named '" + name
4449
+ "': segment cannot be found.", SegmentNotFoundException.class);
45-
return Subsegment.noOp(recorder, false, samplingStrategyOverride);
50+
return Subsegment.noOp(recorder, false);
4651
}
4752
if (logger.isDebugEnabled()) {
4853
logger.debug("Beginning subsegment named: " + name);
4954
}
5055
Segment parentSegment = current.getParentSegment();
51-
Subsegment subsegment = parentSegment.isRecording() && (samplingStrategyOverride == SamplingStrategyOverride.DISABLED)
52-
? new SubsegmentImpl(recorder, name, parentSegment, samplingStrategyOverride)
53-
: Subsegment.noOp(parentSegment, recorder, samplingStrategyOverride);
56+
Subsegment subsegment = parentSegment.isRecording()
57+
? new SubsegmentImpl(recorder, name, parentSegment)
58+
: Subsegment.noOp(parentSegment, recorder);
5459
subsegment.setParent(current);
5560
current.addSubsegment(subsegment);
5661
setTraceEntity(subsegment);
@@ -63,11 +68,6 @@ public Subsegment beginSubsegmentWithSamplingOverride(
6368
return subsegment;
6469
}
6570

66-
@Override
67-
public Subsegment beginSubsegment(AWSXRayRecorder recorder, String name) {
68-
return beginSubsegmentWithSamplingOverride(recorder, name, SamplingStrategyOverride.DISABLED);
69-
}
70-
7171
@Override
7272
public void endSubsegment(AWSXRayRecorder recorder) {
7373
Entity current = getTraceEntity();
@@ -87,8 +87,7 @@ public void endSubsegment(AWSXRayRecorder recorder) {
8787
.filter(Objects::nonNull)
8888
.forEach(listener -> listener.beforeEndSubsegment(currentSubsegment));
8989

90-
if ((currentSubsegment.end() &&
91-
currentSubsegment.getSamplingStrategyOverride() == SamplingStrategyOverride.DISABLED)) {
90+
if (currentSubsegment.end() && currentSubsegment.isSampled()) {
9291
recorder.sendSegment(currentSubsegment.getParentSegment());
9392
} else {
9493
if (recorder.getStreamingStrategy().requiresStreaming(currentSubsegment.getParentSegment())) {

aws-xray-recorder-sdk-core/src/main/java/com/amazonaws/xray/entities/DummySubsegment.java

+23-10
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
package com.amazonaws.xray.entities;
1717

1818
import com.amazonaws.xray.AWSXRayRecorder;
19-
import com.amazonaws.xray.internal.SamplingStrategyOverride;
19+
import com.fasterxml.jackson.annotation.JsonIgnore;
2020
import java.util.ArrayList;
2121
import java.util.HashSet;
2222
import java.util.List;
@@ -44,21 +44,20 @@ public class DummySubsegment implements Subsegment {
4444
private TraceID traceId;
4545
private Segment parentSegment;
4646

47-
private SamplingStrategyOverride samplingStrategyOverride;
47+
@JsonIgnore
48+
private boolean isSampled;
49+
50+
@JsonIgnore
51+
private boolean isRecording;
4852

4953
public DummySubsegment(AWSXRayRecorder creator) {
5054
this(creator, TraceID.create(creator));
5155
}
5256

53-
public DummySubsegment(AWSXRayRecorder creator, TraceID traceId, SamplingStrategyOverride samplingStrategyOverride) {
57+
public DummySubsegment(AWSXRayRecorder creator, TraceID traceId) {
5458
this.creator = creator;
5559
this.traceId = traceId;
5660
this.parentSegment = new DummySegment(creator);
57-
this.samplingStrategyOverride = samplingStrategyOverride;
58-
}
59-
60-
public DummySubsegment(AWSXRayRecorder creator, TraceID traceId) {
61-
this(creator, traceId, SamplingStrategyOverride.DISABLED);
6261
}
6362

6463
@Override
@@ -396,7 +395,21 @@ public void removeSubsegment(Subsegment subsegment) {
396395
}
397396

398397
@Override
399-
public SamplingStrategyOverride getSamplingStrategyOverride() {
400-
return samplingStrategyOverride;
398+
@JsonIgnore
399+
public boolean isSampled() {
400+
return isSampled;
401+
}
402+
403+
@Override
404+
@JsonIgnore
405+
public boolean isRecording() {
406+
return isRecording;
407+
}
408+
409+
@Override
410+
@JsonIgnore
411+
public void setSampledFalse() {
412+
isSampled = false;
413+
isRecording = false;
401414
}
402415
}

aws-xray-recorder-sdk-core/src/main/java/com/amazonaws/xray/entities/NoOpSubSegment.java

+21-14
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
package com.amazonaws.xray.entities;
1717

1818
import com.amazonaws.xray.AWSXRayRecorder;
19-
import com.amazonaws.xray.internal.SamplingStrategyOverride;
2019
import com.fasterxml.jackson.annotation.JsonIgnore;
2120
import java.util.List;
2221
import java.util.Map;
@@ -34,30 +33,24 @@ class NoOpSubSegment implements Subsegment {
3433
private volatile Entity parent;
3534

3635
@JsonIgnore
37-
private SamplingStrategyOverride samplingStrategyOverride;
36+
private boolean isSampled;
37+
38+
@JsonIgnore
39+
private boolean isRecording;
3840

3941
NoOpSubSegment(Segment parentSegment, AWSXRayRecorder creator) {
4042
this(parentSegment, creator, true);
4143
}
4244

43-
NoOpSubSegment(Segment parentSegment, AWSXRayRecorder creator, boolean shouldPropagate) {
44-
this(parentSegment, creator, shouldPropagate, SamplingStrategyOverride.DISABLED);
45-
}
46-
47-
NoOpSubSegment(Segment parentSegment, AWSXRayRecorder creator, SamplingStrategyOverride samplingStrategyOverride) {
48-
this(parentSegment, creator, true, samplingStrategyOverride);
49-
}
5045

5146
NoOpSubSegment(
5247
Segment parentSegment,
5348
AWSXRayRecorder creator,
54-
boolean shouldPropagate,
55-
SamplingStrategyOverride samplingStrategyOverride) {
49+
boolean shouldPropagate) {
5650
this.parentSegment = parentSegment;
5751
this.creator = creator;
5852
this.shouldPropagate = shouldPropagate;
5953
parent = parentSegment;
60-
this.samplingStrategyOverride = samplingStrategyOverride;
6154
}
6255

6356
@Override
@@ -391,7 +384,21 @@ public void close() {
391384
}
392385

393386
@Override
394-
public SamplingStrategyOverride getSamplingStrategyOverride() {
395-
return samplingStrategyOverride;
387+
@JsonIgnore
388+
public boolean isSampled() {
389+
return isSampled;
390+
}
391+
392+
@Override
393+
@JsonIgnore
394+
public boolean isRecording() {
395+
return isRecording;
396+
}
397+
398+
@Override
399+
@JsonIgnore
400+
public void setSampledFalse() {
401+
isSampled = false;
402+
isRecording = false;
396403
}
397404
}

aws-xray-recorder-sdk-core/src/main/java/com/amazonaws/xray/entities/Subsegment.java

+4-17
Original file line numberDiff line numberDiff line change
@@ -16,21 +16,11 @@
1616
package com.amazonaws.xray.entities;
1717

1818
import com.amazonaws.xray.AWSXRayRecorder;
19-
import com.amazonaws.xray.internal.SamplingStrategyOverride;
2019
import com.fasterxml.jackson.annotation.JsonIgnore;
2120
import java.util.Set;
2221
import org.checkerframework.checker.nullness.qual.Nullable;
2322

2423
public interface Subsegment extends Entity {
25-
26-
static Subsegment noOp(AWSXRayRecorder recorder, boolean shouldPropagate, SamplingStrategyOverride samplingStrategyOverride) {
27-
return new NoOpSubSegment(Segment.noOp(TraceID.invalid(), recorder), recorder, shouldPropagate, samplingStrategyOverride);
28-
}
29-
30-
static Subsegment noOp(Segment parent, AWSXRayRecorder recorder, SamplingStrategyOverride samplingStrategyOverride) {
31-
return new NoOpSubSegment(parent, recorder, samplingStrategyOverride);
32-
}
33-
3424
static Subsegment noOp(AWSXRayRecorder recorder, boolean shouldPropagate) {
3525
return new NoOpSubSegment(Segment.noOp(TraceID.invalid(), recorder), recorder, shouldPropagate);
3626
}
@@ -119,15 +109,12 @@ static Subsegment noOp(Segment parent, AWSXRayRecorder recorder) {
119109
@Override
120110
void close();
121111

122-
SamplingStrategyOverride getSamplingStrategyOverride();
112+
@JsonIgnore
113+
boolean isSampled();
123114

124115
@JsonIgnore
125-
default boolean isSampled() {
126-
return getParentSegment().isSampled() && getSamplingStrategyOverride() == SamplingStrategyOverride.DISABLED;
127-
}
116+
boolean isRecording();
128117

129118
@JsonIgnore
130-
default boolean isRecording() {
131-
return getParentSegment().isRecording() && getSamplingStrategyOverride() == SamplingStrategyOverride.DISABLED;
132-
}
119+
void setSampledFalse();
133120
}

0 commit comments

Comments
 (0)