From b5841a34bd52dad7f12cb2966b718b329bc07635 Mon Sep 17 00:00:00 2001 From: bgehrels Date: Wed, 20 Feb 2019 11:28:06 +0100 Subject: [PATCH 1/4] #116: create a new trace if none has been started yet during snapshot creation --- .../NakadiProducerAutoConfiguration.java | 7 +++-- .../flowid/NoopFlowIdComponent.java | 5 +++- .../flowid/TracerFlowIdComponent.java | 16 +++++++++++ .../impl/SnapshotEventCreationEndpoint.java | 6 +++- .../flowid/TracerFlowIdComponentTest.java | 28 +++++++++++++++++-- .../flowid/FlowIdComponent.java | 2 ++ 6 files changed, 56 insertions(+), 8 deletions(-) diff --git a/nakadi-producer-spring-boot-starter/src/main/java/org/zalando/nakadiproducer/NakadiProducerAutoConfiguration.java b/nakadi-producer-spring-boot-starter/src/main/java/org/zalando/nakadiproducer/NakadiProducerAutoConfiguration.java index e1d0f69f..3d8d30f1 100644 --- a/nakadi-producer-spring-boot-starter/src/main/java/org/zalando/nakadiproducer/NakadiProducerAutoConfiguration.java +++ b/nakadi-producer-spring-boot-starter/src/main/java/org/zalando/nakadiproducer/NakadiProducerAutoConfiguration.java @@ -6,6 +6,7 @@ import java.util.List; import java.util.Optional; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.AutoConfigureAfter; @@ -13,7 +14,6 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.autoconfigure.flyway.FlywayProperties; import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties; import org.springframework.boot.context.properties.EnableConfigurationProperties; @@ -45,6 +45,7 @@ @AutoConfigureAfter(name="org.zalando.tracer.spring.TracerAutoConfiguration") @EnableScheduling @EnableConfigurationProperties({ DataSourceProperties.class, FlywayProperties.class }) +@Slf4j public class NakadiProducerAutoConfiguration { @ConditionalOnMissingBean({NakadiPublishingClient.class, NakadiClient.class}) @@ -111,8 +112,8 @@ public FlowIdComponent flowIdComponent() { @Bean @ConditionalOnMissingBean public SnapshotEventCreationEndpoint snapshotEventCreationEndpoint( - SnapshotCreationService snapshotCreationService) { - return new SnapshotEventCreationEndpoint(snapshotCreationService); + SnapshotCreationService snapshotCreationService, FlowIdComponent flowIdComponent) { + return new SnapshotEventCreationEndpoint(snapshotCreationService, flowIdComponent); } @Bean diff --git a/nakadi-producer-spring-boot-starter/src/main/java/org/zalando/nakadiproducer/flowid/NoopFlowIdComponent.java b/nakadi-producer-spring-boot-starter/src/main/java/org/zalando/nakadiproducer/flowid/NoopFlowIdComponent.java index 2617a663..c760861c 100644 --- a/nakadi-producer-spring-boot-starter/src/main/java/org/zalando/nakadiproducer/flowid/NoopFlowIdComponent.java +++ b/nakadi-producer-spring-boot-starter/src/main/java/org/zalando/nakadiproducer/flowid/NoopFlowIdComponent.java @@ -7,7 +7,10 @@ public class NoopFlowIdComponent implements FlowIdComponent { @Override public String getXFlowIdValue() { - log.debug("No bean of class FlowIdComponent was found. Returning null."); return null; } + + @Override + public void startTraceIfNoneExists() { + } } diff --git a/nakadi-producer-spring-boot-starter/src/main/java/org/zalando/nakadiproducer/flowid/TracerFlowIdComponent.java b/nakadi-producer-spring-boot-starter/src/main/java/org/zalando/nakadiproducer/flowid/TracerFlowIdComponent.java index 92cc8745..8b3a552b 100644 --- a/nakadi-producer-spring-boot-starter/src/main/java/org/zalando/nakadiproducer/flowid/TracerFlowIdComponent.java +++ b/nakadi-producer-spring-boot-starter/src/main/java/org/zalando/nakadiproducer/flowid/TracerFlowIdComponent.java @@ -37,4 +37,20 @@ public String getXFlowIdValue() { } return null; } + + @Override + public void startTraceIfNoneExists() { + if (tracer != null) { + try { + tracer.get(X_FLOW_ID).getValue(); + } catch (IllegalArgumentException e) { + tracer.start(); + } catch (IllegalStateException e) { + log.warn("Unexpected Error while checking for an existing Trace Id {}. " + + "Please check your tracer configuration: {}", X_FLOW_ID, e.getMessage()); + } + } else { + log.warn("No bean of class Tracer was found. Returning null."); + } + } } diff --git a/nakadi-producer-spring-boot-starter/src/main/java/org/zalando/nakadiproducer/snapshots/impl/SnapshotEventCreationEndpoint.java b/nakadi-producer-spring-boot-starter/src/main/java/org/zalando/nakadiproducer/snapshots/impl/SnapshotEventCreationEndpoint.java index ef423054..3ad549b0 100644 --- a/nakadi-producer-spring-boot-starter/src/main/java/org/zalando/nakadiproducer/snapshots/impl/SnapshotEventCreationEndpoint.java +++ b/nakadi-producer-spring-boot-starter/src/main/java/org/zalando/nakadiproducer/snapshots/impl/SnapshotEventCreationEndpoint.java @@ -10,13 +10,16 @@ import lombok.AllArgsConstructor; import lombok.Getter; import org.springframework.lang.Nullable; +import org.zalando.nakadiproducer.flowid.FlowIdComponent; @Endpoint(id = "snapshot-event-creation") public class SnapshotEventCreationEndpoint { private final SnapshotCreationService snapshotCreationService; + private final FlowIdComponent flowIdComponent; - public SnapshotEventCreationEndpoint(SnapshotCreationService snapshotCreationService) { + public SnapshotEventCreationEndpoint(SnapshotCreationService snapshotCreationService, FlowIdComponent flowIdComponent) { this.snapshotCreationService = snapshotCreationService; + this.flowIdComponent = flowIdComponent; } @ReadOperation @@ -31,6 +34,7 @@ public void createFilteredSnapshotEvents( // Test in the IDE. So let's stick with arg0 for now. @Selector String arg0, @Nullable String filter) { + flowIdComponent.startTraceIfNoneExists(); snapshotCreationService.createSnapshotEvents(arg0, filter); } diff --git a/nakadi-producer-spring-boot-starter/src/test/java/org/zalando/nakadiproducer/flowid/TracerFlowIdComponentTest.java b/nakadi-producer-spring-boot-starter/src/test/java/org/zalando/nakadiproducer/flowid/TracerFlowIdComponentTest.java index 8d22f542..130e09cc 100644 --- a/nakadi-producer-spring-boot-starter/src/test/java/org/zalando/nakadiproducer/flowid/TracerFlowIdComponentTest.java +++ b/nakadi-producer-spring-boot-starter/src/test/java/org/zalando/nakadiproducer/flowid/TracerFlowIdComponentTest.java @@ -1,6 +1,9 @@ package org.zalando.nakadiproducer.flowid; import static org.junit.Assert.assertThat; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; import org.hamcrest.Matchers; import org.junit.Test; @@ -8,8 +11,7 @@ import org.mockito.Answers; import org.mockito.Mock; import org.mockito.Mockito; -import org.mockito.runners.MockitoJUnitRunner; -import org.zalando.nakadiproducer.flowid.TracerFlowIdComponent; +import org.mockito.junit.MockitoJUnitRunner; import org.zalando.tracer.Tracer; @RunWith(MockitoJUnitRunner.class) @@ -21,10 +23,30 @@ public class TracerFlowIdComponentTest { @Test public void makeSureItWorks() { TracerFlowIdComponent flowIdComponent = new TracerFlowIdComponent(tracer); - Mockito.when(tracer.get("X-Flow-ID").getValue()).thenReturn("A_FUNKY_VALUE"); + when(tracer.get("X-Flow-ID").getValue()).thenReturn("A_FUNKY_VALUE"); assertThat(flowIdComponent.getXFlowIdKey(), Matchers.equalTo("X-Flow-ID")); assertThat(flowIdComponent.getXFlowIdValue(), Matchers.equalTo("A_FUNKY_VALUE")); } + @Test + public void makeSureTraceWillBeStartedIfNoneExists() { + TracerFlowIdComponent flowIdComponent = new TracerFlowIdComponent(tracer); + when(tracer.get("X-Flow-ID")).thenThrow(new IllegalArgumentException()); + + flowIdComponent.startTraceIfNoneExists(); + + verify(tracer).start(); + } + + @Test + public void makeSureTraceWillNotStartedIfOneExists() { + TracerFlowIdComponent flowIdComponent = new TracerFlowIdComponent(tracer); + when(tracer.get("X-Flow-ID").getValue()).thenReturn("A_FUNKY_VALUE"); + + flowIdComponent.startTraceIfNoneExists(); + + verify(tracer, never()).start(); + } + } \ No newline at end of file diff --git a/nakadi-producer/src/main/java/org/zalando/nakadiproducer/flowid/FlowIdComponent.java b/nakadi-producer/src/main/java/org/zalando/nakadiproducer/flowid/FlowIdComponent.java index 8e3922dc..3d582b95 100644 --- a/nakadi-producer/src/main/java/org/zalando/nakadiproducer/flowid/FlowIdComponent.java +++ b/nakadi-producer/src/main/java/org/zalando/nakadiproducer/flowid/FlowIdComponent.java @@ -2,4 +2,6 @@ public interface FlowIdComponent { String getXFlowIdValue(); + + void startTraceIfNoneExists(); } From 8843522c593a5c9efb9329ff71e099e2b9782400 Mon Sep 17 00:00:00 2001 From: bgehrels Date: Wed, 20 Feb 2019 17:58:34 +0100 Subject: [PATCH 2/4] #116: fix misleading log message --- .../zalando/nakadiproducer/flowid/TracerFlowIdComponent.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nakadi-producer-spring-boot-starter/src/main/java/org/zalando/nakadiproducer/flowid/TracerFlowIdComponent.java b/nakadi-producer-spring-boot-starter/src/main/java/org/zalando/nakadiproducer/flowid/TracerFlowIdComponent.java index 8b3a552b..eb852f6b 100644 --- a/nakadi-producer-spring-boot-starter/src/main/java/org/zalando/nakadiproducer/flowid/TracerFlowIdComponent.java +++ b/nakadi-producer-spring-boot-starter/src/main/java/org/zalando/nakadiproducer/flowid/TracerFlowIdComponent.java @@ -50,7 +50,7 @@ public void startTraceIfNoneExists() { "Please check your tracer configuration: {}", X_FLOW_ID, e.getMessage()); } } else { - log.warn("No bean of class Tracer was found. Returning null."); + log.warn("No bean of class Tracer was found."); } } } From e72bc253391275ff104fd36378724a642e4f265b Mon Sep 17 00:00:00 2001 From: bgehrels Date: Tue, 26 Feb 2019 17:30:39 +0100 Subject: [PATCH 3/4] #116: check for the right exception when starting the trace, version bump --- nakadi-producer-spring-boot-starter/pom.xml | 2 +- .../zalando/nakadiproducer/flowid/TracerFlowIdComponent.java | 5 +---- nakadi-producer/pom.xml | 2 +- pom.xml | 2 +- 4 files changed, 4 insertions(+), 7 deletions(-) diff --git a/nakadi-producer-spring-boot-starter/pom.xml b/nakadi-producer-spring-boot-starter/pom.xml index ba6d6cb5..a9d581ce 100644 --- a/nakadi-producer-spring-boot-starter/pom.xml +++ b/nakadi-producer-spring-boot-starter/pom.xml @@ -10,7 +10,7 @@ org.zalando nakadi-producer-reactor - 20.1.0 + 20.2.0 nakadi-producer-spring-boot-starter diff --git a/nakadi-producer-spring-boot-starter/src/main/java/org/zalando/nakadiproducer/flowid/TracerFlowIdComponent.java b/nakadi-producer-spring-boot-starter/src/main/java/org/zalando/nakadiproducer/flowid/TracerFlowIdComponent.java index eb852f6b..c9a00923 100644 --- a/nakadi-producer-spring-boot-starter/src/main/java/org/zalando/nakadiproducer/flowid/TracerFlowIdComponent.java +++ b/nakadi-producer-spring-boot-starter/src/main/java/org/zalando/nakadiproducer/flowid/TracerFlowIdComponent.java @@ -43,11 +43,8 @@ public void startTraceIfNoneExists() { if (tracer != null) { try { tracer.get(X_FLOW_ID).getValue(); - } catch (IllegalArgumentException e) { + } catch (IllegalArgumentException|IllegalStateException e) { tracer.start(); - } catch (IllegalStateException e) { - log.warn("Unexpected Error while checking for an existing Trace Id {}. " + - "Please check your tracer configuration: {}", X_FLOW_ID, e.getMessage()); } } else { log.warn("No bean of class Tracer was found."); diff --git a/nakadi-producer/pom.xml b/nakadi-producer/pom.xml index f980e5e0..c465d490 100644 --- a/nakadi-producer/pom.xml +++ b/nakadi-producer/pom.xml @@ -10,7 +10,7 @@ org.zalando nakadi-producer-reactor - 20.1.0 + 20.2.0 nakadi-producer diff --git a/pom.xml b/pom.xml index 1915bc19..ca4371f5 100644 --- a/pom.xml +++ b/pom.xml @@ -15,7 +15,7 @@ nakadi-producer-reactor org.zalando - 20.1.0 + 20.2.0 pom Nakadi Event Producer Reactor From aa8c1ee776769be539ff00e63639fe8b2e02b880 Mon Sep 17 00:00:00 2001 From: bgehrels Date: Mon, 4 Mar 2019 12:35:29 +0100 Subject: [PATCH 4/4] #116: give a waring if the trace could not be started due to configuration issues --- .../flowid/TracerFlowIdComponent.java | 6 +++++- .../flowid/TracerFlowIdComponentTest.java | 15 ++++++++++++--- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/nakadi-producer-spring-boot-starter/src/main/java/org/zalando/nakadiproducer/flowid/TracerFlowIdComponent.java b/nakadi-producer-spring-boot-starter/src/main/java/org/zalando/nakadiproducer/flowid/TracerFlowIdComponent.java index c9a00923..a2778cd1 100644 --- a/nakadi-producer-spring-boot-starter/src/main/java/org/zalando/nakadiproducer/flowid/TracerFlowIdComponent.java +++ b/nakadi-producer-spring-boot-starter/src/main/java/org/zalando/nakadiproducer/flowid/TracerFlowIdComponent.java @@ -43,7 +43,11 @@ public void startTraceIfNoneExists() { if (tracer != null) { try { tracer.get(X_FLOW_ID).getValue(); - } catch (IllegalArgumentException|IllegalStateException e) { + } catch (IllegalArgumentException e) { + log.warn("No trace was configured for the name {}. Returning null. " + + "To configure Tracer provide an application property: " + + "tracer.traces.X-Flow-ID=flow-id", X_FLOW_ID); + } catch (IllegalStateException e) { tracer.start(); } } else { diff --git a/nakadi-producer-spring-boot-starter/src/test/java/org/zalando/nakadiproducer/flowid/TracerFlowIdComponentTest.java b/nakadi-producer-spring-boot-starter/src/test/java/org/zalando/nakadiproducer/flowid/TracerFlowIdComponentTest.java index 130e09cc..dfbf0e8d 100644 --- a/nakadi-producer-spring-boot-starter/src/test/java/org/zalando/nakadiproducer/flowid/TracerFlowIdComponentTest.java +++ b/nakadi-producer-spring-boot-starter/src/test/java/org/zalando/nakadiproducer/flowid/TracerFlowIdComponentTest.java @@ -10,7 +10,6 @@ import org.junit.runner.RunWith; import org.mockito.Answers; import org.mockito.Mock; -import org.mockito.Mockito; import org.mockito.junit.MockitoJUnitRunner; import org.zalando.tracer.Tracer; @@ -30,15 +29,25 @@ public void makeSureItWorks() { } @Test - public void makeSureTraceWillBeStartedIfNoneExists() { + public void makeSureTraceWillBeStartedIfNoneHasBeenStartedBefore() { TracerFlowIdComponent flowIdComponent = new TracerFlowIdComponent(tracer); - when(tracer.get("X-Flow-ID")).thenThrow(new IllegalArgumentException()); + when(tracer.get("X-Flow-ID").getValue()).thenThrow(new IllegalStateException()); flowIdComponent.startTraceIfNoneExists(); verify(tracer).start(); } + @Test + public void wontFailIfTraceHasNotBeenConfiguredInStartTrace() { + TracerFlowIdComponent flowIdComponent = new TracerFlowIdComponent(tracer); + when(tracer.get("X-Flow-ID")).thenThrow(new IllegalArgumentException()); + + flowIdComponent.startTraceIfNoneExists(); + + // then no exception is thrown + } + @Test public void makeSureTraceWillNotStartedIfOneExists() { TracerFlowIdComponent flowIdComponent = new TracerFlowIdComponent(tracer);