Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -92,8 +92,7 @@ public boolean hasProbeRelatedChanges() {

public boolean hasRateLimitRelatedChanged() {
return originalConfiguration != null
&& originalConfiguration.getSampling() != incomingConfiguration.getSampling()
|| hasProbeRelatedChanges();
&& originalConfiguration.getSampling() != incomingConfiguration.getSampling();
}

List<String> findChangesInBlockedTypes() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@
import com.datadog.debugger.probe.ExceptionProbe;
import com.datadog.debugger.probe.LogProbe;
import com.datadog.debugger.probe.ProbeDefinition;
import com.datadog.debugger.probe.Sampled;
import com.datadog.debugger.sink.DebuggerSink;
import com.datadog.debugger.util.ExceptionHelper;
import com.datadog.debugger.util.SpringHelper;
Expand Down Expand Up @@ -170,7 +169,7 @@ private void applyNewConfiguration(Configuration newConfiguration) {
if (changes.hasRateLimitRelatedChanged()) {
// apply rate limit config first to avoid racing with execution/instrumentation
// of probes requiring samplers
applyRateLimiter(changes, newConfiguration.getSampling());
applyRateLimiter(newConfiguration.getSampling());
}
currentConfiguration = newConfiguration;
if (changes.hasProbeRelatedChanges()) {
Expand Down Expand Up @@ -436,15 +435,7 @@ public ProbeImplementation resolve(int probeIndex) {
return probeMetadata.getProbe(probeIndex);
}

private static void applyRateLimiter(
ConfigurationComparer changes, LogProbe.Sampling globalSampling) {
// ensure rate is up-to-date for all new probes
for (ProbeDefinition added : changes.getAddedDefinitions()) {
if (added instanceof Sampled) {
Sampled probe = (Sampled) added;
probe.initSamplers();
}
}
private static void applyRateLimiter(LogProbe.Sampling globalSampling) {
// set global sampling
if (globalSampling != null) {
ProbeRateLimiter.setGlobalSnapshotRate(globalSampling.getSnapshotsPerSecond());
Expand Down
Original file line number Diff line number Diff line change
@@ -1,21 +1,24 @@
package com.datadog.debugger.agent;

import static com.datadog.debugger.agent.ConfigurationAcceptor.Source.REMOTE_CONFIG;
import static com.datadog.debugger.probe.ProbeDefinitionDeserializer.deserializeConfiguration;
import static com.datadog.debugger.probe.ProbeDefinitionDeserializer.deserializeLogProbe;
import static com.datadog.debugger.probe.ProbeDefinitionDeserializer.deserializeMetricProbe;
import static com.datadog.debugger.probe.ProbeDefinitionDeserializer.deserializeSpanDecorationProbe;
import static com.datadog.debugger.probe.ProbeDefinitionDeserializer.deserializeSpanProbe;
import static com.datadog.debugger.probe.ProbeDefinitionDeserializer.deserializeTriggerProbe;

import com.datadog.debugger.probe.LogProbe;
import com.datadog.debugger.probe.MetricProbe;
import com.datadog.debugger.probe.ProbeDefinition;
import com.datadog.debugger.probe.SpanDecorationProbe;
import com.datadog.debugger.probe.SpanProbe;
import com.datadog.debugger.probe.TriggerProbe;
import com.datadog.debugger.util.MoshiHelper;
import com.squareup.moshi.JsonAdapter;
import datadog.remoteconfig.PollingRateHinter;
import datadog.remoteconfig.state.ConfigKey;
import datadog.remoteconfig.state.ProductListener;
import datadog.trace.api.Config;
import datadog.trace.util.TagsHelper;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
Expand All @@ -24,7 +27,6 @@
import java.util.function.Consumer;
import java.util.function.Predicate;
import java.util.regex.Pattern;
import okio.Okio;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

Expand All @@ -37,54 +39,6 @@ public class DebuggerProductChangesListener implements ProductListener {
private static final Logger LOGGER =
LoggerFactory.getLogger(DebuggerProductChangesListener.class);

static class Adapter {
static final JsonAdapter<Configuration> CONFIGURATION_JSON_ADAPTER =
MoshiHelper.createMoshiConfig().adapter(Configuration.class);

static final JsonAdapter<MetricProbe> METRIC_PROBE_JSON_ADAPTER =
MoshiHelper.createMoshiConfig().adapter(MetricProbe.class);

static final JsonAdapter<LogProbe> LOG_PROBE_JSON_ADAPTER =
MoshiHelper.createMoshiConfig().adapter(LogProbe.class);

static final JsonAdapter<SpanProbe> SPAN_PROBE_JSON_ADAPTER =
MoshiHelper.createMoshiConfig().adapter(SpanProbe.class);

static final JsonAdapter<TriggerProbe> TRIGGER_PROBE_JSON_ADAPTER =
MoshiHelper.createMoshiConfig().adapter(TriggerProbe.class);

static final JsonAdapter<SpanDecorationProbe> SPAN_DECORATION_PROBE_JSON_ADAPTER =
MoshiHelper.createMoshiConfig().adapter(SpanDecorationProbe.class);

static Configuration deserializeConfiguration(byte[] content) throws IOException {
return deserialize(CONFIGURATION_JSON_ADAPTER, content);
}

static MetricProbe deserializeMetricProbe(byte[] content) throws IOException {
return deserialize(METRIC_PROBE_JSON_ADAPTER, content);
}

static LogProbe deserializeLogProbe(byte[] content) throws IOException {
return deserialize(LOG_PROBE_JSON_ADAPTER, content);
}

static SpanProbe deserializeSpanProbe(byte[] content) throws IOException {
return deserialize(SPAN_PROBE_JSON_ADAPTER, content);
}

static TriggerProbe deserializeTriggerProbe(byte[] content) throws IOException {
return deserialize(TRIGGER_PROBE_JSON_ADAPTER, content);
}

static SpanDecorationProbe deserializeSpanDecorationProbe(byte[] content) throws IOException {
return deserialize(SPAN_DECORATION_PROBE_JSON_ADAPTER, content);
}

private static <T> T deserialize(JsonAdapter<T> adapter, byte[] content) throws IOException {
return adapter.fromJson(Okio.buffer(Okio.source(new ByteArrayInputStream(content))));
}
}

private static final Predicate<String> IS_UUID =
Pattern.compile(
"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$")
Expand All @@ -105,22 +59,22 @@ public void accept(ConfigKey configKey, byte[] content, PollingRateHinter pollin
String configId = configKey.getConfigId();
try {
if (configId.startsWith(METRIC_PROBE_PREFIX)) {
MetricProbe metricProbe = Adapter.deserializeMetricProbe(content);
MetricProbe metricProbe = deserializeMetricProbe(content);
configChunks.put(configId, definitions -> definitions.add(metricProbe));
} else if (configId.startsWith(LOG_PROBE_PREFIX)) {
LogProbe logProbe = Adapter.deserializeLogProbe(content);
LogProbe logProbe = deserializeLogProbe(content);
configChunks.put(configId, definitions -> definitions.add(logProbe));
} else if (configId.startsWith(SPAN_PROBE_PREFIX)) {
SpanProbe spanProbe = Adapter.deserializeSpanProbe(content);
SpanProbe spanProbe = deserializeSpanProbe(content);
configChunks.put(configId, definitions -> definitions.add(spanProbe));
} else if (configId.startsWith(TRIGGER_PROBE_PREFIX)) {
TriggerProbe triggerProbe = Adapter.deserializeTriggerProbe(content);
TriggerProbe triggerProbe = deserializeTriggerProbe(content);
configChunks.put(configId, definitions -> definitions.add(triggerProbe));
} else if (configId.startsWith(SPAN_DECORATION_PROBE_PREFIX)) {
SpanDecorationProbe spanDecorationProbe = Adapter.deserializeSpanDecorationProbe(content);
SpanDecorationProbe spanDecorationProbe = deserializeSpanDecorationProbe(content);
configChunks.put(configId, definitions -> definitions.add(spanDecorationProbe));
} else if (IS_UUID.test(configId)) {
Configuration newConfig = Adapter.deserializeConfiguration(content);
Configuration newConfig = deserializeConfiguration(content);
if (newConfig.getService().equals(serviceName)) {
configChunks.put(
configId,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package com.datadog.debugger.probe;

import com.datadog.debugger.agent.Configuration;
import com.datadog.debugger.util.MoshiHelper;
import com.squareup.moshi.JsonAdapter;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import okio.Okio;

public class ProbeDefinitionDeserializer {
static final JsonAdapter<Configuration> CONFIGURATION_JSON_ADAPTER =
MoshiHelper.createMoshiConfig().adapter(Configuration.class);
static final JsonAdapter<MetricProbe> METRIC_PROBE_JSON_ADAPTER =
MoshiHelper.createMoshiConfig().adapter(MetricProbe.class);
static final JsonAdapter<LogProbe> LOG_PROBE_JSON_ADAPTER =
MoshiHelper.createMoshiConfig().adapter(LogProbe.class);
static final JsonAdapter<SpanProbe> SPAN_PROBE_JSON_ADAPTER =
MoshiHelper.createMoshiConfig().adapter(SpanProbe.class);
static final JsonAdapter<TriggerProbe> TRIGGER_PROBE_JSON_ADAPTER =
MoshiHelper.createMoshiConfig().adapter(TriggerProbe.class);
static final JsonAdapter<SpanDecorationProbe> SPAN_DECORATION_PROBE_JSON_ADAPTER =
MoshiHelper.createMoshiConfig().adapter(SpanDecorationProbe.class);

public static Configuration deserializeConfiguration(byte[] content) throws IOException {
return deserialize(CONFIGURATION_JSON_ADAPTER, content);
}

public static MetricProbe deserializeMetricProbe(byte[] content) throws IOException {
return deserialize(METRIC_PROBE_JSON_ADAPTER, content);
}

public static LogProbe deserializeLogProbe(byte[] content) throws IOException {
LogProbe logProbe = deserialize(LOG_PROBE_JSON_ADAPTER, content);
logProbe.initSamplers();
return logProbe;
}

public static SpanProbe deserializeSpanProbe(byte[] content) throws IOException {
return deserialize(SPAN_PROBE_JSON_ADAPTER, content);
}

public static TriggerProbe deserializeTriggerProbe(byte[] content) throws IOException {
TriggerProbe triggerProbe = deserialize(TRIGGER_PROBE_JSON_ADAPTER, content);
triggerProbe.initSamplers();
return triggerProbe;
}

public static SpanDecorationProbe deserializeSpanDecorationProbe(byte[] content)
throws IOException {
SpanDecorationProbe spanDecorationProbe =
deserialize(SPAN_DECORATION_PROBE_JSON_ADAPTER, content);
spanDecorationProbe.initSamplers();
return spanDecorationProbe;
}

private static <T> T deserialize(JsonAdapter<T> adapter, byte[] content) throws IOException {
return adapter.fromJson(Okio.buffer(Okio.source(new ByteArrayInputStream(content))));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -179,6 +179,18 @@ public SpanDecorationProbe(
this.decorations = decorations;
}

public SpanDecorationProbe(SpanDecorationProbe.Builder builder) {
this(
builder.language,
builder.probeId,
builder.tagStrs,
builder.where,
builder.evaluateAt,
builder.targetSpan,
builder.decorations);
initSamplers();
}

@Override
public InstrumentationResult.Status instrument(
MethodInfo methodInfo, List<DiagnosticMessage> diagnostics, List<Integer> probeIndices) {
Expand Down Expand Up @@ -399,26 +411,25 @@ public static SpanDecorationProbe.Builder builder() {

public static class Builder extends ProbeDefinition.Builder<SpanDecorationProbe.Builder> {
private TargetSpan targetSpan;
private List<Decoration> decorate;
private List<Decoration> decorations;

public Builder targetSpan(TargetSpan targetSpan) {
this.targetSpan = targetSpan;
return this;
}

public Builder decorate(List<Decoration> decorate) {
this.decorate = decorate;
public Builder decorations(List<Decoration> decorations) {
this.decorations = decorations;
return this;
}

public Builder decorate(Decoration decoration) {
this.decorate = Collections.singletonList(decoration);
public Builder decorations(Decoration decoration) {
this.decorations = Collections.singletonList(decoration);
return this;
}

public SpanDecorationProbe build() {
return new SpanDecorationProbe(
LANGUAGE, probeId, tagStrs, where, evaluateAt, targetSpan, decorate);
return new SpanDecorationProbe(this);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,11 @@ public TriggerProbe(ProbeId probeId, Where where) {
this(probeId, null, where, null, null);
}

public TriggerProbe(TriggerProbe.Builder builder) {
this(builder.probeId, builder.tagStrs, builder.where, builder.probeCondition, builder.sampling);
initSamplers();
}

@Override
public InstrumentationResult.Status instrument(
MethodInfo methodInfo, List<DiagnosticMessage> diagnostics, List<Integer> probeIndices) {
Expand Down Expand Up @@ -144,7 +149,7 @@ private void decorateTags() {

AgentSpan agentSpan = tracerAPI.activeSpan().getLocalRootSpan();
agentSpan.setTag(Tags.PROPAGATED_DEBUG, sessionId + ":1");
agentSpan.setTag(format("_dd.ld.probe_id.%s", probeId.getId()), true);
agentSpan.setTag(format("_dd.ld.probe_id.%s", getProbeId().getId()), true);
}

@Override
Expand Down Expand Up @@ -197,4 +202,27 @@ public String toString() {
version,
where);
}

public static TriggerProbe.Builder builder() {
return new TriggerProbe.Builder();
}

public static class Builder extends ProbeDefinition.Builder<TriggerProbe.Builder> {
private ProbeCondition probeCondition;
private Sampling sampling;

public TriggerProbe.Builder when(ProbeCondition probeCondition) {
this.probeCondition = probeCondition;
return this;
}

public TriggerProbe.Builder sampling(Sampling sampling) {
this.sampling = sampling;
return this;
}

public TriggerProbe build() {
return new TriggerProbe(this);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2824,7 +2824,7 @@ public void allProbesSameMethod() throws IOException, URISyntaxException {
.probeId(PROBE_ID)
.where(where)
.targetSpan(SpanDecorationProbe.TargetSpan.ACTIVE)
.decorate(
.decorations(
new SpanDecorationProbe.Decoration(
null,
Arrays.asList(
Expand All @@ -2842,7 +2842,7 @@ public void allProbesSameMethod() throws IOException, URISyntaxException {
.where(where)
.build())
.add(LogProbe.builder().probeId(PROBE_ID3).where(where).build())
.add(new TriggerProbe(PROBE_ID4, where))
.add(TriggerProbe.builder().probeId(PROBE_ID4).where(where).build())
.build();

CoreTracer tracer = CoreTracer.builder().build();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@
import com.datadog.debugger.probe.SpanDecorationProbe;
import com.datadog.debugger.probe.SpanProbe;
import com.datadog.debugger.probe.TriggerProbe;
import com.datadog.debugger.probe.Where;
import com.datadog.debugger.util.MoshiHelper;
import com.squareup.moshi.JsonAdapter;
import com.squareup.moshi.Types;
Expand Down Expand Up @@ -410,7 +409,10 @@ private static LogProbe createLog(

private static TriggerProbe createTriggerProbe(
String id, String typeName, String methodName, String signature) {
return new TriggerProbe(new ProbeId(id, 0), Where.of(typeName, methodName, signature));
return TriggerProbe.builder()
.probeId(new ProbeId(id, 0))
.where(typeName, methodName, signature)
.build();
}

private static SpanProbe createSpan(
Expand Down Expand Up @@ -438,7 +440,7 @@ private static SpanDecorationProbe createDecorationSpan(
.evaluateAt(MethodLocation.ENTRY)
.tags("tag1:value1", "tag2:value2")
.targetSpan(targetSpan)
.decorate(decoration)
.decorations(decoration)
.build();
}

Expand Down
Loading
Loading