Skip to content

Commit 1dc4796

Browse files
committed
initial draft, need to add tests
1 parent 814f134 commit 1dc4796

File tree

8 files changed

+48
-38
lines changed

8 files changed

+48
-38
lines changed

agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/exporter/AgentLogExporter.java

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ public class AgentLogExporter implements LogRecordExporter {
4646
private final SamplingOverrides exceptionSamplingOverrides;
4747
private final LogDataMapper mapper;
4848
private final Consumer<TelemetryItem> telemetryItemConsumer;
49+
private final QuickPulse quickPulse;
4950

5051
public AgentLogExporter(
5152
int severityThreshold,
@@ -55,20 +56,12 @@ public AgentLogExporter(
5556
@Nullable QuickPulse quickPulse,
5657
BatchItemProcessor batchItemProcessor) {
5758
this.severityThreshold = severityThreshold;
58-
this.logSamplingOverrides = new SamplingOverrides(logSamplingOverrides);
59-
this.exceptionSamplingOverrides = new SamplingOverrides(exceptionSamplingOverrides);
59+
this.logSamplingOverrides = new SamplingOverrides(logSamplingOverrides, quickPulse);
60+
this.exceptionSamplingOverrides = new SamplingOverrides(exceptionSamplingOverrides, quickPulse);
61+
this.quickPulse = quickPulse;
6062
this.mapper = mapper;
6163
telemetryItemConsumer =
6264
telemetryItem -> {
63-
if (quickPulse != null) {
64-
try {
65-
logger.info("quickpulse.add from Log telemetryItemConsumer for {}", telemetryItem.getData().toJsonString());
66-
} catch (Exception e) {
67-
logger.error("failed to log telemetry item ", e);
68-
}
69-
70-
quickPulse.add(telemetryItem);
71-
}
7265
TelemetryObservers.INSTANCE
7366
.getObservers()
7467
.forEach(consumer -> consumer.accept(telemetryItem));
@@ -126,6 +119,13 @@ private void internalExport(LogRecordData log) {
126119
SpanContext spanContext = log.getSpanContext();
127120
Double parentSpanSampleRate = log.getAttributes().get(AiSemanticAttributes.SAMPLE_RATE);
128121

122+
TelemetryItem telemetryItem = null;
123+
if (quickPulse != null && quickPulse.isEnabled()) {
124+
telemetryItem = mapper.map(log, stack, parentSpanSampleRate);
125+
logger.debug("adding log to quick pulse: {}", telemetryItem.toJsonString());
126+
quickPulse.add(telemetryItem);
127+
}
128+
129129
AiFixedPercentageSampler sampler = samplingOverrides.getOverride(log.getAttributes());
130130

131131
boolean hasSamplingOverride = sampler != null;
@@ -142,7 +142,7 @@ private void internalExport(LogRecordData log) {
142142
if (hasSamplingOverride) {
143143
SamplingResult samplingResult = sampler.shouldSampleLog(spanContext, parentSpanSampleRate);
144144
if (samplingResult.getDecision() != SamplingDecision.RECORD_AND_SAMPLE) {
145-
logger.info("Sampling out log: {}", log.getBodyValue().asString());
145+
logger.info("Sampling out log for Breeze: {}", log.getBodyValue().asString());
146146
return;
147147
}
148148
sampleRate = samplingResult.getAttributes().get(AiSemanticAttributes.SAMPLE_RATE);
@@ -155,7 +155,9 @@ private void internalExport(LogRecordData log) {
155155
logger.debug("exporting log: {}", log);
156156

157157
// TODO (trask) no longer need to check AiSemanticAttributes.SAMPLE_RATE in map() method
158-
TelemetryItem telemetryItem = mapper.map(log, stack, sampleRate);
158+
if (telemetryItem == null) {
159+
telemetryItem = mapper.map(log, stack, sampleRate);
160+
}
159161
telemetryItemConsumer.accept(telemetryItem);
160162

161163
exportingLogLogger.recordSuccess();

agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/init/SecondEntryPoint.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -246,7 +246,7 @@ public void customize(AutoConfigurationCustomizer autoConfiguration) {
246246
configuration.preview.sampling.overrides.stream()
247247
.filter(override -> override.telemetryType == SamplingTelemetryType.EXCEPTION)
248248
.collect(Collectors.toList());
249-
SpanDataMapper mapper = createSpanDataMapper(telemetryClient, configuration.preview.captureHttpServer4xxAsError, new SamplingOverrides(exceptionSamplingOverrides));
249+
SpanDataMapper mapper = createSpanDataMapper(telemetryClient, configuration.preview.captureHttpServer4xxAsError, new SamplingOverrides(exceptionSamplingOverrides, quickPulse));
250250

251251
autoConfiguration
252252
.addPropertiesSupplier(

agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/sampling/AiFixedPercentageSampler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ private SamplingResult internalShouldSample(
7676
logger.info("sampling result: {}", samplingResult.getDecision().toString());
7777
return samplingResult;
7878
}
79-
samplingResult = SamplerUtil.shouldSample(traceId, percentage);
79+
samplingResult = SamplerUtil.shouldSample(traceId, percentage, quickPulse);
8080
logger.info("sampling result: {}", samplingResult.getDecision().toString());
8181
return samplingResult;//SamplerUtil.shouldSample(traceId, percentage);
8282
}

agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/sampling/AiSampler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ public SamplingResult shouldSample(
101101
return SamplingResult.recordAndSample();
102102
}
103103

104-
samplingResult = SamplerUtil.shouldSample(traceId, sp);
104+
samplingResult = SamplerUtil.shouldSample(traceId, sp, quickPulse);
105105
logger.info("sampling result: {}", samplingResult.getDecision().toString());
106106
return samplingResult; //SamplerUtil.shouldSample(traceId, sp);
107107
}

agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/sampling/SamplerUtil.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
import com.azure.monitor.opentelemetry.autoconfigure.implementation.AiSemanticAttributes;
77
import com.azure.monitor.opentelemetry.autoconfigure.implementation.SamplingScoreGeneratorV2;
8+
import com.azure.monitor.opentelemetry.autoconfigure.implementation.quickpulse.QuickPulse;
89
import io.opentelemetry.api.common.Attributes;
910
import io.opentelemetry.instrumentation.api.internal.cache.Cache;
1011
import io.opentelemetry.sdk.trace.samplers.SamplingDecision;
@@ -17,13 +18,19 @@ public class SamplerUtil {
1718
private static final Cache<Double, SamplingResult> recordAndSampleWithSampleRateMap =
1819
Cache.bounded(100);
1920

20-
static SamplingResult shouldSample(String traceId, double sp) {
21+
static SamplingResult shouldSample(String traceId, double sp, QuickPulse quickPulse) {
2122
SamplingResult samplingResult;
2223
if (sp == 0) {
24+
if (quickPulse != null && quickPulse.isEnabled()) {
25+
return SamplingResult.recordOnly();
26+
}
2327
return SamplingResult.drop();
2428
}
2529

2630
if (sp != 100 && !shouldRecordAndSample(traceId, sp)) {
31+
if (quickPulse != null && quickPulse.isEnabled()) {
32+
return SamplingResult.recordOnly();
33+
}
2734
return SamplingResult.drop();
2835
}
2936

agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/sampling/SamplingOverrides.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
package com.microsoft.applicationinsights.agent.internal.sampling;
55

66
import com.azure.monitor.opentelemetry.autoconfigure.implementation.SpanDataMapper;
7+
import com.azure.monitor.opentelemetry.autoconfigure.implementation.quickpulse.QuickPulse;
78
import com.microsoft.applicationinsights.agent.internal.configuration.Configuration.MatchType;
89
import com.microsoft.applicationinsights.agent.internal.configuration.Configuration.SamplingOverride;
910
import com.microsoft.applicationinsights.agent.internal.configuration.Configuration.SamplingOverrideAttribute;
@@ -25,10 +26,10 @@ public class SamplingOverrides {
2526
private static final Logger logger = LoggerFactory.getLogger(SamplingOverrides.class);
2627
private final List<MatcherGroup> matcherGroups;
2728

28-
public SamplingOverrides(List<SamplingOverride> overrides) {
29+
public SamplingOverrides(List<SamplingOverride> overrides, QuickPulse quickPulse) {
2930
matcherGroups = new ArrayList<>();
3031
for (SamplingOverride override : overrides) {
31-
matcherGroups.add(new MatcherGroup(override));
32+
matcherGroups.add(new MatcherGroup(override, quickPulse));
3233
}
3334
}
3435

@@ -48,15 +49,15 @@ private static class MatcherGroup {
4849
private final List<TempPredicate> predicates;
4950
private final AiFixedPercentageSampler sampler;
5051

51-
private MatcherGroup(SamplingOverride override) {
52+
private MatcherGroup(SamplingOverride override, QuickPulse quickPulse) {
5253
predicates = new ArrayList<>();
5354
for (SamplingOverrideAttribute attribute : override.attributes) {
5455
TempPredicate predicate = toPredicate(attribute);
5556
if (predicate != null) {
5657
predicates.add(predicate);
5758
}
5859
}
59-
sampler = AiFixedPercentageSampler.create(override.percentage);
60+
sampler = AiFixedPercentageSampler.create(override.percentage, quickPulse);
6061
}
6162

6263
AiFixedPercentageSampler getSampler() {

agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/sampling/SamplingOverridesSampler.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,8 @@ class SamplingOverridesSampler implements Sampler {
2929
List<SamplingOverride> dependencySamplingOverrides,
3030
Sampler delegate,
3131
QuickPulse quickPulse) {
32-
this.requestSamplingOverrides = new SamplingOverrides(requestSamplingOverrides);
33-
this.dependencySamplingOverrides = new SamplingOverrides(dependencySamplingOverrides);
32+
this.requestSamplingOverrides = new SamplingOverrides(requestSamplingOverrides, quickPulse);
33+
this.dependencySamplingOverrides = new SamplingOverrides(dependencySamplingOverrides, quickPulse);
3434
this.delegate = delegate;
3535
}
3636

agent/agent-tooling/src/test/java/com/microsoft/applicationinsights/agent/internal/sampling/SamplingOverridesTest.java

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ class SamplingOverridesTest {
2424
void shouldSampleByDefault() {
2525
// given
2626
List<SamplingOverride> overrides = new ArrayList<>();
27-
SamplingOverrides samplingOverrides = new SamplingOverrides(overrides);
27+
SamplingOverrides samplingOverrides = new SamplingOverrides(overrides, null);
2828
Attributes attributes = Attributes.empty();
2929

3030
// when
@@ -38,7 +38,7 @@ void shouldSampleByDefault() {
3838
void shouldFilterInRequest() {
3939
// given
4040
List<SamplingOverride> overrides = singletonList(newOverride(25));
41-
SamplingOverrides samplingOverrides = new SamplingOverrides(overrides);
41+
SamplingOverrides samplingOverrides = new SamplingOverrides(overrides, null);
4242
Attributes attributes = Attributes.empty();
4343

4444
// when
@@ -54,7 +54,7 @@ void shouldFilterStrictMatch() {
5454
// given
5555
List<SamplingOverride> overrides =
5656
singletonList(newOverride(25, newStrictAttribute("one", "1")));
57-
SamplingOverrides samplingOverrides = new SamplingOverrides(overrides);
57+
SamplingOverrides samplingOverrides = new SamplingOverrides(overrides, null);
5858
Attributes attributes = Attributes.of(AttributeKey.stringKey("one"), "1");
5959

6060
// when
@@ -70,7 +70,7 @@ void shouldNotFilterStrictMatch() {
7070
// given
7171
List<SamplingOverride> overrides =
7272
singletonList(newOverride(25, newStrictAttribute("one", "1")));
73-
SamplingOverrides samplingOverrides = new SamplingOverrides(overrides);
73+
SamplingOverrides samplingOverrides = new SamplingOverrides(overrides, null);
7474
Attributes attributes = Attributes.of(AttributeKey.stringKey("one"), "2");
7575

7676
// when
@@ -85,7 +85,7 @@ void shouldNotFilterMissingStrictMatch() {
8585
// given
8686
List<SamplingOverride> overrides =
8787
singletonList(newOverride(25, newStrictAttribute("one", "1")));
88-
SamplingOverrides samplingOverrides = new SamplingOverrides(overrides);
88+
SamplingOverrides samplingOverrides = new SamplingOverrides(overrides, null);
8989
Attributes attributes = Attributes.of(AttributeKey.stringKey("two"), "1");
9090

9191
// when
@@ -100,7 +100,7 @@ void shouldFilterRegexpMatch() {
100100
// given
101101
List<SamplingOverride> overrides =
102102
singletonList(newOverride(25, newRegexpAttribute("one", "1.*")));
103-
SamplingOverrides samplingOverrides = new SamplingOverrides(overrides);
103+
SamplingOverrides samplingOverrides = new SamplingOverrides(overrides, null);
104104
Attributes attributes = Attributes.of(AttributeKey.stringKey("one"), "11");
105105

106106
// when
@@ -116,7 +116,7 @@ void shouldNotFilterRegexpMatch() {
116116
// given
117117
List<SamplingOverride> overrides =
118118
singletonList(newOverride(25, newRegexpAttribute("one", "1.*")));
119-
SamplingOverrides samplingOverrides = new SamplingOverrides(overrides);
119+
SamplingOverrides samplingOverrides = new SamplingOverrides(overrides, null);
120120
Attributes attributes = Attributes.of(AttributeKey.stringKey("one"), "22");
121121

122122
// when
@@ -131,7 +131,7 @@ void shouldNotFilterMissingRegexpMatch() {
131131
// given
132132
List<SamplingOverride> overrides =
133133
singletonList(newOverride(25, newRegexpAttribute("one", "1.*")));
134-
SamplingOverrides samplingOverrides = new SamplingOverrides(overrides);
134+
SamplingOverrides samplingOverrides = new SamplingOverrides(overrides, null);
135135
Attributes attributes = Attributes.of(AttributeKey.stringKey("two"), "11");
136136

137137
// when
@@ -145,7 +145,7 @@ void shouldNotFilterMissingRegexpMatch() {
145145
void shouldFilterKeyOnlyMatch() {
146146
// given
147147
List<SamplingOverride> overrides = singletonList(newOverride(25, newKeyOnlyAttribute("one")));
148-
SamplingOverrides samplingOverrides = new SamplingOverrides(overrides);
148+
SamplingOverrides samplingOverrides = new SamplingOverrides(overrides, null);
149149
Attributes attributes = Attributes.of(AttributeKey.stringKey("one"), "11");
150150

151151
// when
@@ -160,7 +160,7 @@ void shouldFilterKeyOnlyMatch() {
160160
void shouldNotFilterKeyOnlyMatch() {
161161
// given
162162
List<SamplingOverride> overrides = singletonList(newOverride(25, newKeyOnlyAttribute("one")));
163-
SamplingOverrides samplingOverrides = new SamplingOverrides(overrides);
163+
SamplingOverrides samplingOverrides = new SamplingOverrides(overrides, null);
164164
Attributes attributes = Attributes.of(AttributeKey.stringKey("two"), "22");
165165

166166
// when
@@ -176,7 +176,7 @@ void shouldFilterMultiAttributes() {
176176
List<SamplingOverride> overrides =
177177
singletonList(
178178
newOverride(25, newStrictAttribute("one", "1"), newRegexpAttribute("two", "2.*")));
179-
SamplingOverrides samplerOverride = new SamplingOverrides(overrides);
179+
SamplingOverrides samplerOverride = new SamplingOverrides(overrides, null);
180180
Attributes attributes =
181181
Attributes.of(AttributeKey.stringKey("one"), "1", AttributeKey.stringKey("two"), "22");
182182

@@ -194,7 +194,7 @@ void shouldNotFilterMultiAttributes() {
194194
List<SamplingOverride> overrides =
195195
singletonList(
196196
newOverride(25, newStrictAttribute("one", "1"), newRegexpAttribute("two", "2.*")));
197-
SamplingOverrides samplingOverrides = new SamplingOverrides(overrides);
197+
SamplingOverrides samplingOverrides = new SamplingOverrides(overrides, null);
198198
Attributes attributes =
199199
Attributes.of(AttributeKey.stringKey("one"), "2", AttributeKey.stringKey("two"), "22");
200200

@@ -212,7 +212,7 @@ void shouldFilterMultiConfigsBothMatch() {
212212
Arrays.asList(
213213
newOverride(25, newStrictAttribute("one", "1")),
214214
newOverride(0, newRegexpAttribute("two", "2.*")));
215-
SamplingOverrides samplingOverrides = new SamplingOverrides(overrides);
215+
SamplingOverrides samplingOverrides = new SamplingOverrides(overrides, null);
216216
Attributes attributes =
217217
Attributes.of(AttributeKey.stringKey("one"), "1", AttributeKey.stringKey("two"), "22");
218218

@@ -231,7 +231,7 @@ void shouldFilterMultiConfigsOneMatch() {
231231
Arrays.asList(
232232
newOverride(50, newStrictAttribute("one", "1")),
233233
newOverride(25, newRegexpAttribute("two", "2.*")));
234-
SamplingOverrides samplingOverrides = new SamplingOverrides(overrides);
234+
SamplingOverrides samplingOverrides = new SamplingOverrides(overrides, null);
235235
Attributes attributes =
236236
Attributes.of(AttributeKey.stringKey("one"), "2", AttributeKey.stringKey("two"), "22");
237237

@@ -250,7 +250,7 @@ void shouldNotFilterMultiConfigsNoMatch() {
250250
Arrays.asList(
251251
newOverride(50, newStrictAttribute("one", "1")),
252252
newOverride(25, newRegexpAttribute("two", "2.*")));
253-
SamplingOverrides samplingOverrides = new SamplingOverrides(overrides);
253+
SamplingOverrides samplingOverrides = new SamplingOverrides(overrides, null);
254254
Attributes attributes =
255255
Attributes.of(AttributeKey.stringKey("one"), "2", AttributeKey.stringKey("two"), "33");
256256

0 commit comments

Comments
 (0)