From 8469a4e425bba2327628a40fa6aaa35295d33a02 Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Thu, 17 Dec 2015 18:00:40 +0100 Subject: [PATCH] [#73] Added Fallback for enpoint locating. FIxes #73 --- spring-cloud-sleuth-zipkin/pom.xml | 6 +++ .../zipkin/FallbackHavingEndpointLocator.java | 34 ++++++++++++ .../zipkin/ZipkinAutoConfiguration.java | 7 ++- .../FallbackHavingEndpointLocatorTest.java | 53 +++++++++++++++++++ 4 files changed, 99 insertions(+), 1 deletion(-) create mode 100644 spring-cloud-sleuth-zipkin/src/main/java/org/springframework/cloud/sleuth/zipkin/FallbackHavingEndpointLocator.java create mode 100644 spring-cloud-sleuth-zipkin/src/test/java/org/springframework/cloud/sleuth/zipkin/FallbackHavingEndpointLocatorTest.java diff --git a/spring-cloud-sleuth-zipkin/pom.xml b/spring-cloud-sleuth-zipkin/pom.xml index 610de99ac..6029e4d97 100644 --- a/spring-cloud-sleuth-zipkin/pom.xml +++ b/spring-cloud-sleuth-zipkin/pom.xml @@ -56,6 +56,12 @@ spring-boot-starter-test test + + org.assertj + assertj-core + 2.1.0 + test + diff --git a/spring-cloud-sleuth-zipkin/src/main/java/org/springframework/cloud/sleuth/zipkin/FallbackHavingEndpointLocator.java b/spring-cloud-sleuth-zipkin/src/main/java/org/springframework/cloud/sleuth/zipkin/FallbackHavingEndpointLocator.java new file mode 100644 index 000000000..aad440560 --- /dev/null +++ b/spring-cloud-sleuth-zipkin/src/main/java/org/springframework/cloud/sleuth/zipkin/FallbackHavingEndpointLocator.java @@ -0,0 +1,34 @@ +package org.springframework.cloud.sleuth.zipkin; + +import com.twitter.zipkin.gen.Endpoint; +import lombok.extern.slf4j.Slf4j; + +/** + * Endpoint locator that will try to call an endpoint via Discovery Client + * and will fallback to Server Properties if an exception is thrown + */ +@Slf4j +public class FallbackHavingEndpointLocator implements EndpointLocator { + + private final DiscoveryClientEndpointLocator discoveryClientEndpointLocator; + private final ServerPropertiesEndpointLocator serverPropertiesEndpointLocator; + + public FallbackHavingEndpointLocator(DiscoveryClientEndpointLocator discoveryClientEndpointLocator, + ServerPropertiesEndpointLocator serverPropertiesEndpointLocator) { + this.discoveryClientEndpointLocator = discoveryClientEndpointLocator; + this.serverPropertiesEndpointLocator = serverPropertiesEndpointLocator; + } + + @Override + public Endpoint local() { + if (discoveryClientEndpointLocator == null) { + return serverPropertiesEndpointLocator.local(); + } + try { + return discoveryClientEndpointLocator.local(); + } catch (Exception e) { + log.warn("Exception occurred while trying to fetch the Zipkin process endpoint. Falling back to server properties endpoint locator.", e); + return serverPropertiesEndpointLocator.local(); + } + } +} diff --git a/spring-cloud-sleuth-zipkin/src/main/java/org/springframework/cloud/sleuth/zipkin/ZipkinAutoConfiguration.java b/spring-cloud-sleuth-zipkin/src/main/java/org/springframework/cloud/sleuth/zipkin/ZipkinAutoConfiguration.java index 72e1095d0..165ab1b30 100644 --- a/spring-cloud-sleuth-zipkin/src/main/java/org/springframework/cloud/sleuth/zipkin/ZipkinAutoConfiguration.java +++ b/spring-cloud-sleuth-zipkin/src/main/java/org/springframework/cloud/sleuth/zipkin/ZipkinAutoConfiguration.java @@ -84,10 +84,15 @@ public class ZipkinAutoConfiguration { @Bean public EndpointLocator zipkinEndpointLocator() { + return new FallbackHavingEndpointLocator(discoveryClientEndpointLocator(), + new ServerPropertiesEndpointLocator(this.serverProperties)); + } + + private DiscoveryClientEndpointLocator discoveryClientEndpointLocator() { if (this.client!=null) { return new DiscoveryClientEndpointLocator(this.client); } - return new ServerPropertiesEndpointLocator(this.serverProperties); + return null; } } diff --git a/spring-cloud-sleuth-zipkin/src/test/java/org/springframework/cloud/sleuth/zipkin/FallbackHavingEndpointLocatorTest.java b/spring-cloud-sleuth-zipkin/src/test/java/org/springframework/cloud/sleuth/zipkin/FallbackHavingEndpointLocatorTest.java new file mode 100644 index 000000000..84b05fcc5 --- /dev/null +++ b/spring-cloud-sleuth-zipkin/src/test/java/org/springframework/cloud/sleuth/zipkin/FallbackHavingEndpointLocatorTest.java @@ -0,0 +1,53 @@ +package org.springframework.cloud.sleuth.zipkin; + +import com.twitter.zipkin.gen.Endpoint; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.BDDMockito; +import org.mockito.Mock; +import org.mockito.runners.MockitoJUnitRunner; + +import static org.assertj.core.api.BDDAssertions.then; + +@RunWith(MockitoJUnitRunner.class) +public class FallbackHavingEndpointLocatorTest { + + @Mock DiscoveryClientEndpointLocator discoveryClientEndpointLocator; + @Mock ServerPropertiesEndpointLocator serverPropertiesEndpointLocator; + Endpoint expectedEndpoint = new Endpoint(); + + @Test + public void should_use_system_property_locator_if_discovery_client_locator_is_not_present() { + BDDMockito.given(serverPropertiesEndpointLocator.local()).willReturn(expectedEndpoint); + FallbackHavingEndpointLocator sut = new FallbackHavingEndpointLocator(null, + serverPropertiesEndpointLocator); + + Endpoint endpoint = sut.local(); + + then(endpoint).isSameAs(expectedEndpoint); + } + + @Test + public void should_use_system_property_locator_if_discovery_client_locator_throws_an_exception() { + BDDMockito.given(discoveryClientEndpointLocator.local()).willThrow(new RuntimeException()); + BDDMockito.given(serverPropertiesEndpointLocator.local()).willReturn(expectedEndpoint); + FallbackHavingEndpointLocator sut = new FallbackHavingEndpointLocator(discoveryClientEndpointLocator, + serverPropertiesEndpointLocator); + + Endpoint endpoint = sut.local(); + + then(endpoint).isSameAs(expectedEndpoint); + } + + @Test + public void should_use_discovery_client_locator_by_default() { + BDDMockito.given(discoveryClientEndpointLocator.local()).willReturn(expectedEndpoint); + BDDMockito.given(serverPropertiesEndpointLocator.local()).willThrow(new RuntimeException()); + FallbackHavingEndpointLocator sut = new FallbackHavingEndpointLocator(discoveryClientEndpointLocator, + serverPropertiesEndpointLocator); + + Endpoint endpoint = sut.local(); + + then(endpoint).isSameAs(expectedEndpoint); + } +} \ No newline at end of file