4646import java .util .concurrent .Future ;
4747import java .util .concurrent .TimeUnit ;
4848import java .util .function .Function ;
49+ import javax .annotation .Nonnull ;
4950import org .jctools .queues .MpscCompoundQueue ;
5051import org .jctools .queues .SpmcArrayQueue ;
5152import 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 );
0 commit comments