Skip to content

Commit 077bcfb

Browse files
authored
Avoid getTag overhead in ConflatingMetricsAggregator (#10070)
1 parent 7f014ae commit 077bcfb

File tree

3 files changed

+35
-13
lines changed

3 files changed

+35
-13
lines changed

dd-trace-core/src/main/java/datadog/trace/common/metrics/ConflatingMetricsAggregator.java

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
import java.util.concurrent.Future;
4747
import java.util.concurrent.TimeUnit;
4848
import java.util.function.Function;
49+
import javax.annotation.Nonnull;
4950
import org.jctools.queues.MpscCompoundQueue;
5051
import org.jctools.queues.SpmcArrayQueue;
5152
import org.slf4j.Logger;
@@ -276,15 +277,16 @@ public boolean publish(List<? extends CoreSpan<?>> trace) {
276277
if (features.supportsMetrics()) {
277278
for (CoreSpan<?> span : trace) {
278279
boolean isTopLevel = span.isTopLevel();
279-
if (shouldComputeMetric(span)) {
280+
final CharSequence spanKind = span.unsafeGetTag(SPAN_KIND, "");
281+
if (shouldComputeMetric(span, spanKind)) {
280282
final CharSequence resourceName = span.getResourceName();
281283
if (resourceName != null && ignoredResources.contains(resourceName.toString())) {
282284
// skip publishing all children
283285
forceKeep = false;
284286
break;
285287
}
286288
counted++;
287-
forceKeep |= publish(span, isTopLevel);
289+
forceKeep |= publish(span, isTopLevel, spanKind);
288290
}
289291
}
290292
healthMetrics.onClientStatTraceComputed(
@@ -293,21 +295,19 @@ public boolean publish(List<? extends CoreSpan<?>> trace) {
293295
return forceKeep;
294296
}
295297

296-
private boolean shouldComputeMetric(CoreSpan<?> span) {
297-
return (span.isMeasured() || span.isTopLevel() || spanKindEligible(span))
298+
private boolean shouldComputeMetric(CoreSpan<?> span, @Nonnull CharSequence spanKind) {
299+
return (span.isMeasured() || span.isTopLevel() || spanKindEligible(spanKind))
298300
&& span.getLongRunningVersion()
299301
<= 0 // either not long-running or unpublished long-running span
300302
&& span.getDurationNano() > 0;
301303
}
302304

303-
private boolean spanKindEligible(CoreSpan<?> span) {
304-
final Object spanKind = span.getTag(SPAN_KIND);
305+
private boolean spanKindEligible(@Nonnull CharSequence spanKind) {
305306
// use toString since it could be a CharSequence...
306-
return spanKind != null && ELIGIBLE_SPAN_KINDS_FOR_METRICS.contains(spanKind.toString());
307+
return ELIGIBLE_SPAN_KINDS_FOR_METRICS.contains(spanKind.toString());
307308
}
308309

309-
private boolean publish(CoreSpan<?> span, boolean isTopLevel) {
310-
final CharSequence spanKind = span.getTag(SPAN_KIND, "");
310+
private boolean publish(CoreSpan<?> span, boolean isTopLevel, CharSequence spanKind) {
311311
MetricKey newKey =
312312
new MetricKey(
313313
span.getResourceName(),
@@ -353,9 +353,10 @@ private boolean publish(CoreSpan<?> span, boolean isTopLevel) {
353353

354354
private List<UTF8BytesString> getPeerTags(CoreSpan<?> span, String spanKind) {
355355
if (ELIGIBLE_SPAN_KINDS_FOR_PEER_AGGREGATION.contains(spanKind)) {
356-
List<UTF8BytesString> peerTags = new ArrayList<>();
357-
for (String peerTag : features.peerTags()) {
358-
Object value = span.getTag(peerTag);
356+
final Set<String> eligiblePeerTags = features.peerTags();
357+
List<UTF8BytesString> peerTags = new ArrayList<>(eligiblePeerTags.size());
358+
for (String peerTag : eligiblePeerTags) {
359+
Object value = span.unsafeGetTag(peerTag);
359360
if (value != null) {
360361
final Pair<DDCache<String, UTF8BytesString>, Function<String, UTF8BytesString>>
361362
cacheAndCreator = PEER_TAGS_CACHE.computeIfAbsent(peerTag, PEER_TAGS_CACHE_ADDER);
@@ -368,7 +369,7 @@ private List<UTF8BytesString> getPeerTags(CoreSpan<?> span, String spanKind) {
368369
return peerTags;
369370
} else if (SPAN_KIND_INTERNAL.equals(spanKind)) {
370371
// in this case only the base service should be aggregated if present
371-
final Object baseService = span.getTag(BASE_SERVICE);
372+
final Object baseService = span.unsafeGetTag(BASE_SERVICE);
372373
if (baseService != null) {
373374
final Pair<DDCache<String, UTF8BytesString>, Function<String, UTF8BytesString>>
374375
cacheAndCreator = PEER_TAGS_CACHE.computeIfAbsent(BASE_SERVICE, PEER_TAGS_CACHE_ADDER);

dd-trace-core/src/main/java/datadog/trace/core/CoreSpan.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,14 @@ public interface CoreSpan<T extends CoreSpan<T>> {
5757

5858
<U> U getTag(CharSequence name);
5959

60+
default <U> U unsafeGetTag(CharSequence name, U defaultValue) {
61+
return getTag(name, defaultValue);
62+
}
63+
64+
default <U> U unsafeGetTag(CharSequence name) {
65+
return getTag(name);
66+
}
67+
6068
boolean hasSamplingPriority();
6169

6270
boolean isMeasured();

dd-trace-core/src/main/java/datadog/trace/core/DDSpan.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -505,6 +505,19 @@ public Object getTag(final String tag) {
505505
return context.getTag(tag);
506506
}
507507

508+
@Override
509+
@SuppressWarnings("unchecked")
510+
public <U> U unsafeGetTag(CharSequence name, U defaultValue) {
511+
Object tag = unsafeGetTag(name);
512+
return null == tag ? defaultValue : (U) tag;
513+
}
514+
515+
@Override
516+
@SuppressWarnings("unchecked")
517+
public <U> U unsafeGetTag(CharSequence name) {
518+
return (U) context.unsafeGetTag(String.valueOf(name));
519+
}
520+
508521
@Override
509522
@Nonnull
510523
public final DDSpanContext context() {

0 commit comments

Comments
 (0)