1
0
Эх сурвалжийг харах

Avoid expensive call to Span.fromContextOrNull(null) (#89135)

Workaround for #89107
David Turner 3 жил өмнө
parent
commit
c08111b5b7

+ 13 - 7
modules/apm/src/main/java/org/elasticsearch/tracing/apm/APMTracer.java

@@ -286,7 +286,7 @@ public class APMTracer extends AbstractLifecycleComponent implements org.elastic
 
     @Override
     public void addError(String spanId, Throwable throwable) {
-        final var span = Span.fromContextOrNull(spans.get(spanId));
+        final var span = spanFromContextOrNullWithoutLogging(spans.get(spanId));
         if (span != null) {
             span.recordException(throwable);
         }
@@ -294,7 +294,7 @@ public class APMTracer extends AbstractLifecycleComponent implements org.elastic
 
     @Override
     public void setAttribute(String spanId, String key, boolean value) {
-        final var span = Span.fromContextOrNull(spans.get(spanId));
+        final var span = spanFromContextOrNullWithoutLogging(spans.get(spanId));
         if (span != null) {
             span.setAttribute(key, value);
         }
@@ -302,7 +302,7 @@ public class APMTracer extends AbstractLifecycleComponent implements org.elastic
 
     @Override
     public void setAttribute(String spanId, String key, double value) {
-        final var span = Span.fromContextOrNull(spans.get(spanId));
+        final var span = spanFromContextOrNullWithoutLogging(spans.get(spanId));
         if (span != null) {
             span.setAttribute(key, value);
         }
@@ -310,7 +310,7 @@ public class APMTracer extends AbstractLifecycleComponent implements org.elastic
 
     @Override
     public void setAttribute(String spanId, String key, long value) {
-        final var span = Span.fromContextOrNull(spans.get(spanId));
+        final var span = spanFromContextOrNullWithoutLogging(spans.get(spanId));
         if (span != null) {
             span.setAttribute(key, value);
         }
@@ -318,7 +318,7 @@ public class APMTracer extends AbstractLifecycleComponent implements org.elastic
 
     @Override
     public void setAttribute(String spanId, String key, String value) {
-        final var span = Span.fromContextOrNull(spans.get(spanId));
+        final var span = spanFromContextOrNullWithoutLogging(spans.get(spanId));
         if (span != null) {
             span.setAttribute(key, value);
         }
@@ -326,7 +326,7 @@ public class APMTracer extends AbstractLifecycleComponent implements org.elastic
 
     @Override
     public void stopTrace(String spanId) {
-        final var span = Span.fromContextOrNull(spans.remove(spanId));
+        final var span = spanFromContextOrNullWithoutLogging(spans.remove(spanId));
         if (span != null) {
             logger.trace("Finishing trace [{}]", spanId);
             span.end();
@@ -335,12 +335,18 @@ public class APMTracer extends AbstractLifecycleComponent implements org.elastic
 
     @Override
     public void addEvent(String spanId, String eventName) {
-        final var span = Span.fromContextOrNull(spans.get(spanId));
+        final var span = spanFromContextOrNullWithoutLogging(spans.get(spanId));
         if (span != null) {
             span.addEvent(eventName);
         }
     }
 
+    private static Span spanFromContextOrNullWithoutLogging(Context context) {
+        // Span.fromContextOrNull(null) is super-expensive today, see https://github.com/elastic/elasticsearch/issues/89107
+        // and https://github.com/open-telemetry/opentelemetry-java/pull/4663
+        return context == null ? null : Span.fromContextOrNull(context);
+    }
+
     private static class MapKeyGetter implements TextMapGetter<Map<String, String>> {
 
         @Override