diff --git a/inspectit-ocelot-config/src/main/java/rocks/inspectit/ocelot/config/model/tracing/TracingSettings.java b/inspectit-ocelot-config/src/main/java/rocks/inspectit/ocelot/config/model/tracing/TracingSettings.java index 90223fbf4f..43ad6337c0 100644 --- a/inspectit-ocelot-config/src/main/java/rocks/inspectit/ocelot/config/model/tracing/TracingSettings.java +++ b/inspectit-ocelot-config/src/main/java/rocks/inspectit/ocelot/config/model/tracing/TracingSettings.java @@ -19,7 +19,7 @@ public enum AddCommonTags { NEVER, ON_GLOBAL_ROOT, ON_LOCAL_ROOT, - ALWAYS; + ALWAYS } /** @@ -49,6 +49,6 @@ public enum AddCommonTags { * Generically defines behavior of adding common tags to spans. */ @NotNull - private AddCommonTags addTags; + private AddCommonTags addCommonTags; } diff --git a/inspectit-ocelot-config/src/main/resources/rocks/inspectit/ocelot/config/default/basics.yml b/inspectit-ocelot-config/src/main/resources/rocks/inspectit/ocelot/config/default/basics.yml index 1115cfe3f5..a90dc74ed2 100644 --- a/inspectit-ocelot-config/src/main/resources/rocks/inspectit/ocelot/config/default/basics.yml +++ b/inspectit-ocelot-config/src/main/resources/rocks/inspectit/ocelot/config/default/basics.yml @@ -31,9 +31,9 @@ inspectit: # this value can be overridden by the tracing settings of individual instrumentation rules. sample-probability: 1.0 - # defines to which spans to add common tags as attributes + # defines to when to add common tags as attributes to spans # options are: NEVER, ON_GLOBAL_ROOT, ON_LOCAL_ROOT, ALWAYS - add-tags: ON_LOCAL_ROOT + add-common-tags: ON_LOCAL_ROOT # settings regarding log correlation log-correlation: diff --git a/inspectit-ocelot-core/src/main/java/rocks/inspectit/ocelot/core/instrumentation/hook/MethodHookGenerator.java b/inspectit-ocelot-core/src/main/java/rocks/inspectit/ocelot/core/instrumentation/hook/MethodHookGenerator.java index a64097d829..4475b6caae 100644 --- a/inspectit-ocelot-core/src/main/java/rocks/inspectit/ocelot/core/instrumentation/hook/MethodHookGenerator.java +++ b/inspectit-ocelot-core/src/main/java/rocks/inspectit/ocelot/core/instrumentation/hook/MethodHookGenerator.java @@ -101,7 +101,7 @@ private List buildTracingEntryActions(RuleTracingSettings tracing) if (tracing.getStartSpan() || tracing.getContinueSpan() != null) { val actionBuilder = ContinueOrStartSpanAction.builder(); - actionBuilder.commonTagsToAttributesAction(commonTagsToAttributesManager.getAction()); + actionBuilder.commonTagsToAttributesManager(commonTagsToAttributesManager); if (tracing.getStartSpan()) { VariableAccessor name = Optional.ofNullable(tracing.getName()) diff --git a/inspectit-ocelot-core/src/main/java/rocks/inspectit/ocelot/core/instrumentation/hook/actions/span/ContinueOrStartSpanAction.java b/inspectit-ocelot-core/src/main/java/rocks/inspectit/ocelot/core/instrumentation/hook/actions/span/ContinueOrStartSpanAction.java index 44ccc4de89..9e64b338f0 100644 --- a/inspectit-ocelot-core/src/main/java/rocks/inspectit/ocelot/core/instrumentation/hook/actions/span/ContinueOrStartSpanAction.java +++ b/inspectit-ocelot-core/src/main/java/rocks/inspectit/ocelot/core/instrumentation/hook/actions/span/ContinueOrStartSpanAction.java @@ -11,7 +11,7 @@ import rocks.inspectit.ocelot.core.instrumentation.hook.MethodReflectionInformation; import rocks.inspectit.ocelot.core.instrumentation.hook.VariableAccessor; import rocks.inspectit.ocelot.core.instrumentation.hook.actions.IHookAction; -import rocks.inspectit.ocelot.core.instrumentation.hook.tags.CommonTagsToAttributesAction; +import rocks.inspectit.ocelot.core.instrumentation.hook.tags.CommonTagsToAttributesManager; import java.util.function.Predicate; @@ -69,7 +69,7 @@ public class ContinueOrStartSpanAction implements IHookAction { /** * Action that optionally adds common tags to the newly started span. */ - private CommonTagsToAttributesAction commonTagsToAttributesAction; + private CommonTagsToAttributesManager commonTagsToAttributesManager; @Override public String getName() { @@ -111,10 +111,8 @@ private void startSpan(ExecutionContext context) { if (remoteParent != null) { builder = Tracing.getTracer().spanBuilderWithRemoteParent(spanName, remoteParent); } else { - // TODO is there better way of checking ctx.hasEnteredSpan(); - // to avoid this stupid BlankSpan impl final Span currentSpan = Tracing.getTracer().getCurrentSpan(); - hasLocalParent = currentSpan != null && !BlankSpan.INSTANCE.equals(currentSpan); + hasLocalParent = currentSpan != BlankSpan.INSTANCE; builder = Tracing.getTracer().spanBuilder(spanName); } @@ -127,7 +125,7 @@ private void startSpan(ExecutionContext context) { // start span and add common tags final Span span = builder.startSpan(); - commonTagsToAttributesAction.writeCommonTags(span, remoteParent != null, hasLocalParent); + commonTagsToAttributesManager.writeCommonTags(span, remoteParent != null, hasLocalParent); // enter in the our context ctx.enterSpan(span); diff --git a/inspectit-ocelot-core/src/main/java/rocks/inspectit/ocelot/core/instrumentation/hook/tags/CommonTagsToAttributesAction.java b/inspectit-ocelot-core/src/main/java/rocks/inspectit/ocelot/core/instrumentation/hook/tags/CommonTagsToAttributesAction.java deleted file mode 100644 index ed6a6bdab5..0000000000 --- a/inspectit-ocelot-core/src/main/java/rocks/inspectit/ocelot/core/instrumentation/hook/tags/CommonTagsToAttributesAction.java +++ /dev/null @@ -1,55 +0,0 @@ -package rocks.inspectit.ocelot.core.instrumentation.hook.tags; - -import io.opencensus.trace.AttributeValue; -import io.opencensus.trace.Span; -import lombok.AccessLevel; -import lombok.Getter; -import lombok.Value; -import rocks.inspectit.ocelot.config.model.tracing.TracingSettings; -import rocks.inspectit.ocelot.core.tags.CommonTagsManager; - -@Value -@Getter(AccessLevel.PACKAGE) -public class CommonTagsToAttributesAction { - - /** - * Tags manager. - */ - private final CommonTagsManager commonTagsManager; - - /** - * Currently active setting. - */ - private final TracingSettings.AddCommonTags addCommonTags; - - /** - * Writes common tags to span depending on the current {@link #addCommonTags} setting and the provided information about the span. - * - * @param span Span - * @param hasRemoteParent If span has remote parent - * @param hasLocalParent If span has local parent - */ - public void writeCommonTags(Span span, boolean hasRemoteParent, boolean hasLocalParent) { - if (shouldAdd(hasRemoteParent, hasLocalParent)) { - commonTagsManager.getCommonTagValueMap() - .forEach((k, v) -> span.putAttribute(k, AttributeValue.stringAttributeValue(v))); - } - } - - /** - * If tags should be added. - */ - private boolean shouldAdd(boolean hasRemoteParent, boolean hasLocalParent) { - switch (addCommonTags) { - case ALWAYS: - return true; - case ON_LOCAL_ROOT: - return !hasLocalParent; - case ON_GLOBAL_ROOT: - return !hasRemoteParent && !hasLocalParent; - default: - return false; - } - } - -} diff --git a/inspectit-ocelot-core/src/main/java/rocks/inspectit/ocelot/core/instrumentation/hook/tags/CommonTagsToAttributesManager.java b/inspectit-ocelot-core/src/main/java/rocks/inspectit/ocelot/core/instrumentation/hook/tags/CommonTagsToAttributesManager.java index 681753d3d9..e2a33c2bd0 100644 --- a/inspectit-ocelot-core/src/main/java/rocks/inspectit/ocelot/core/instrumentation/hook/tags/CommonTagsToAttributesManager.java +++ b/inspectit-ocelot-core/src/main/java/rocks/inspectit/ocelot/core/instrumentation/hook/tags/CommonTagsToAttributesManager.java @@ -1,7 +1,9 @@ package rocks.inspectit.ocelot.core.instrumentation.hook.tags; import com.google.common.annotations.VisibleForTesting; -import lombok.Getter; +import io.opencensus.trace.AttributeValue; +import io.opencensus.trace.Span; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.event.EventListener; import org.springframework.stereotype.Component; import rocks.inspectit.ocelot.config.model.InspectitConfig; @@ -13,6 +15,9 @@ import javax.annotation.PostConstruct; import java.util.Objects; +/** + * This class is used when creating spans to determine if the common tags should be added to the created span or not. + */ @Component public class CommonTagsToAttributesManager { @@ -27,18 +32,18 @@ public class CommonTagsToAttributesManager { private final CommonTagsManager commonTagsManager; /** - * Action implementation. + * Currently active setting. */ - @Getter - private CommonTagsToAttributesAction action; + private TracingSettings.AddCommonTags addCommonTags; /** * Default constructor. */ + @Autowired public CommonTagsToAttributesManager(InspectitEnvironment env, CommonTagsManager commonTagsManager) { this.env = env; this.commonTagsManager = commonTagsManager; - this.action = new CommonTagsToAttributesAction(commonTagsManager, TracingSettings.AddCommonTags.NEVER); + this.addCommonTags = TracingSettings.AddCommonTags.NEVER; } /** @@ -50,8 +55,38 @@ public CommonTagsToAttributesManager(InspectitEnvironment env, CommonTagsManager void update() { InspectitConfig configuration = env.getCurrentConfig(); TracingSettings tracing = configuration.getTracing(); - if (!Objects.equals(tracing.getAddTags(), action.getAddCommonTags())) { - this.action = new CommonTagsToAttributesAction(commonTagsManager, tracing.getAddTags()); + if (!Objects.equals(tracing.getAddCommonTags(), addCommonTags)) { + this.addCommonTags = tracing.getAddCommonTags(); + } + } + + /** + * Writes common tags to span depending on the current {@link #addCommonTags} setting and the provided information about the span. + * + * @param span Span + * @param hasRemoteParent If span has remote parent + * @param hasLocalParent If span has local parent + */ + public void writeCommonTags(Span span, boolean hasRemoteParent, boolean hasLocalParent) { + if (shouldAdd(hasRemoteParent, hasLocalParent)) { + commonTagsManager.getCommonTagValueMap() + .forEach((k, v) -> span.putAttribute(k, AttributeValue.stringAttributeValue(v))); + } + } + + /** + * If tags should be added. + */ + private boolean shouldAdd(boolean hasRemoteParent, boolean hasLocalParent) { + switch (addCommonTags) { + case ALWAYS: + return true; + case ON_LOCAL_ROOT: + return !hasLocalParent; + case ON_GLOBAL_ROOT: + return !hasRemoteParent && !hasLocalParent; + default: + return false; } } diff --git a/inspectit-ocelot-core/src/test/java/rocks/inspectit/ocelot/core/instrumentation/hook/tags/CommonTagsToAttributesActionTest.java b/inspectit-ocelot-core/src/test/java/rocks/inspectit/ocelot/core/instrumentation/hook/tags/CommonTagsToAttributesManagerTest.java similarity index 69% rename from inspectit-ocelot-core/src/test/java/rocks/inspectit/ocelot/core/instrumentation/hook/tags/CommonTagsToAttributesActionTest.java rename to inspectit-ocelot-core/src/test/java/rocks/inspectit/ocelot/core/instrumentation/hook/tags/CommonTagsToAttributesManagerTest.java index f85b4709ea..c437c61a95 100644 --- a/inspectit-ocelot-core/src/test/java/rocks/inspectit/ocelot/core/instrumentation/hook/tags/CommonTagsToAttributesActionTest.java +++ b/inspectit-ocelot-core/src/test/java/rocks/inspectit/ocelot/core/instrumentation/hook/tags/CommonTagsToAttributesManagerTest.java @@ -6,9 +6,12 @@ import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; +import rocks.inspectit.ocelot.config.model.InspectitConfig; import rocks.inspectit.ocelot.config.model.tracing.TracingSettings; +import rocks.inspectit.ocelot.core.config.InspectitEnvironment; import rocks.inspectit.ocelot.core.tags.CommonTagsManager; import java.util.Collections; @@ -16,9 +19,13 @@ import static org.mockito.Mockito.*; @ExtendWith(MockitoExtension.class) -class CommonTagsToAttributesActionTest { +class CommonTagsToAttributesManagerTest { - CommonTagsToAttributesAction action; + @InjectMocks + CommonTagsToAttributesManager manager; + + @Mock + InspectitEnvironment env; @Mock CommonTagsManager commonTagsManager; @@ -26,31 +33,40 @@ class CommonTagsToAttributesActionTest { @Mock Span span; + @Mock + TracingSettings tracingSettings; + + @Mock + InspectitConfig config; + + @BeforeEach + void init() { + lenient().when(env.getCurrentConfig()).thenReturn(config); + lenient().when(config.getTracing()).thenReturn(tracingSettings); + } + @Nested class Never { - @BeforeEach - void init() { - action = new CommonTagsToAttributesAction(commonTagsManager, TracingSettings.AddCommonTags.NEVER); - } + // never is default @Test void newSpan() { - action.writeCommonTags(span, false, false); + manager.writeCommonTags(span, false, false); verifyNoMoreInteractions(span, commonTagsManager); } @Test void remoteParent() { - action.writeCommonTags(span, true, false); + manager.writeCommonTags(span, true, false); verifyNoMoreInteractions(span, commonTagsManager); } @Test void localParent() { - action.writeCommonTags(span, false, true); + manager.writeCommonTags(span, false, true); verifyNoMoreInteractions(span, commonTagsManager); } @@ -62,14 +78,15 @@ class GlobalRoot { @BeforeEach void init() { - action = new CommonTagsToAttributesAction(commonTagsManager, TracingSettings.AddCommonTags.ON_GLOBAL_ROOT); + when(tracingSettings.getAddCommonTags()).thenReturn(TracingSettings.AddCommonTags.ON_GLOBAL_ROOT); + manager.update(); } @Test void newSpan() { when(commonTagsManager.getCommonTagValueMap()).thenReturn(Collections.singletonMap("key", "value")); - action.writeCommonTags(span, false, false); + manager.writeCommonTags(span, false, false); verify(span).putAttribute("key", AttributeValue.stringAttributeValue("value")); verify(commonTagsManager).getCommonTagValueMap(); @@ -78,14 +95,14 @@ void newSpan() { @Test void remoteParent() { - action.writeCommonTags(span, true, false); + manager.writeCommonTags(span, true, false); verifyNoMoreInteractions(span, commonTagsManager); } @Test void localParent() { - action.writeCommonTags(span, false, true); + manager.writeCommonTags(span, false, true); verifyNoMoreInteractions(span, commonTagsManager); } @@ -97,14 +114,16 @@ class LocalRoot { @BeforeEach void init() { - action = new CommonTagsToAttributesAction(commonTagsManager, TracingSettings.AddCommonTags.ON_LOCAL_ROOT); + when(tracingSettings.getAddCommonTags()).thenReturn(TracingSettings.AddCommonTags.ON_LOCAL_ROOT); + manager.update(); } + @Test void newSpan() { when(commonTagsManager.getCommonTagValueMap()).thenReturn(Collections.singletonMap("key", "value")); - action.writeCommonTags(span, false, false); + manager.writeCommonTags(span, false, false); verify(span).putAttribute("key", AttributeValue.stringAttributeValue("value")); verify(commonTagsManager).getCommonTagValueMap(); @@ -115,7 +134,7 @@ void newSpan() { void remoteParent() { when(commonTagsManager.getCommonTagValueMap()).thenReturn(Collections.singletonMap("key", "value")); - action.writeCommonTags(span, true, false); + manager.writeCommonTags(span, true, false); verify(span).putAttribute("key", AttributeValue.stringAttributeValue("value")); verify(commonTagsManager).getCommonTagValueMap(); @@ -124,7 +143,7 @@ void remoteParent() { @Test void localParent() { - action.writeCommonTags(span, false, true); + manager.writeCommonTags(span, false, true); verifyNoMoreInteractions(span, commonTagsManager); } @@ -136,13 +155,14 @@ class Always { @BeforeEach void init() { - action = new CommonTagsToAttributesAction(commonTagsManager, TracingSettings.AddCommonTags.ALWAYS); when(commonTagsManager.getCommonTagValueMap()).thenReturn(Collections.singletonMap("key", "value")); + when(tracingSettings.getAddCommonTags()).thenReturn(TracingSettings.AddCommonTags.ALWAYS); + manager.update(); } @Test void newSpan() { - action.writeCommonTags(span, false, false); + manager.writeCommonTags(span, false, false); verify(span).putAttribute("key", AttributeValue.stringAttributeValue("value")); verify(commonTagsManager).getCommonTagValueMap(); @@ -151,7 +171,7 @@ void newSpan() { @Test void remoteParent() { - action.writeCommonTags(span, true, false); + manager.writeCommonTags(span, true, false); verify(span).putAttribute("key", AttributeValue.stringAttributeValue("value")); verify(commonTagsManager).getCommonTagValueMap(); @@ -160,7 +180,7 @@ void remoteParent() { @Test void localParent() { - action.writeCommonTags(span, false, true); + manager.writeCommonTags(span, false, true); verify(span).putAttribute("key", AttributeValue.stringAttributeValue("value")); verify(commonTagsManager).getCommonTagValueMap();