This is an automated email from the ASF dual-hosted git repository. wujimin pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/incubator-servicecomb-java-chassis.git
commit b32d4fb155bb1a83aa45c14fe86f6bd19b3c1e00 Author: zhengyangyong <[email protected]> AuthorDate: Sat Jan 6 11:06:35 2018 +0800 SCB-166 fix pr Signed-off-by: zhengyangyong <[email protected]> --- .../java/io/servicecomb/metrics/common/Health.java | 18 +++------- metrics/metrics-core/pom.xml | 4 +++ .../health/DefaultMicroserviceHealthChecker.java | 5 ++- .../core/publish/DefaultHealthCheckerManager.java | 39 ++++++++++++++++++++++ ...ker.java => CustomHealthCheckerAnnotation.java} | 8 +++-- ...mHealthChecker.java => MySqlHealthChecker.java} | 26 +++++++++++++-- .../metrics/extendhealthcheck/SimpleService.java | 2 +- 7 files changed, 81 insertions(+), 21 deletions(-) diff --git a/samples/metrics-extend-healthcheck/src/main/java/io/servicecomb/samples/metrics/extendhealthcheck/CustomHealthChecker.java b/metrics/metrics-common/src/main/java/io/servicecomb/metrics/common/Health.java similarity index 63% copy from samples/metrics-extend-healthcheck/src/main/java/io/servicecomb/samples/metrics/extendhealthcheck/CustomHealthChecker.java copy to metrics/metrics-common/src/main/java/io/servicecomb/metrics/common/Health.java index 1960de8..eb8c59f 100644 --- a/samples/metrics-extend-healthcheck/src/main/java/io/servicecomb/samples/metrics/extendhealthcheck/CustomHealthChecker.java +++ b/metrics/metrics-common/src/main/java/io/servicecomb/metrics/common/Health.java @@ -15,20 +15,12 @@ * limitations under the License. */ -package io.servicecomb.samples.metrics.extendhealthcheck; +package io.servicecomb.metrics.common; -import io.servicecomb.metrics.common.HealthCheckResult; -import io.servicecomb.metrics.common.HealthChecker; +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; -public class CustomHealthChecker implements HealthChecker { - @Override - public String getName() { - return "custom"; - } +@Target(value = {ElementType.TYPE}) +public @interface Health { - @Override - public HealthCheckResult check() { - //add your health check code here - return new HealthCheckResult(true, "demo health check", "no extra data"); - } } diff --git a/metrics/metrics-core/pom.xml b/metrics/metrics-core/pom.xml index 2566bbe..17115e4 100644 --- a/metrics/metrics-core/pom.xml +++ b/metrics/metrics-core/pom.xml @@ -47,6 +47,10 @@ <artifactId>slf4j-log4j12</artifactId> <scope>test</scope> </dependency> + <dependency> + <groupId>org.springframework</groupId> + <artifactId>spring-core</artifactId> + </dependency> </dependencies> </project> \ No newline at end of file diff --git a/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/health/DefaultMicroserviceHealthChecker.java b/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/health/DefaultMicroserviceHealthChecker.java index f4fe4c1..df2d81e 100644 --- a/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/health/DefaultMicroserviceHealthChecker.java +++ b/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/health/DefaultMicroserviceHealthChecker.java @@ -17,6 +17,8 @@ package io.servicecomb.metrics.core.health; +import javax.ws.rs.core.Response.Status; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -27,6 +29,7 @@ import io.servicecomb.metrics.common.HealthChecker; import io.servicecomb.serviceregistry.RegistryUtils; import io.servicecomb.serviceregistry.api.registry.Microservice; import io.servicecomb.serviceregistry.api.registry.MicroserviceInstance; +import io.servicecomb.swagger.invocation.exception.InvocationException; public class DefaultMicroserviceHealthChecker implements HealthChecker { @@ -56,7 +59,7 @@ public class DefaultMicroserviceHealthChecker implements HealthChecker { } catch (Exception e) { String error = "unable load microservice info from RegistryUtils"; logger.error(error, e); - return error; + throw new InvocationException(Status.INTERNAL_SERVER_ERROR, error); } } } diff --git a/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/publish/DefaultHealthCheckerManager.java b/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/publish/DefaultHealthCheckerManager.java index 0393ab9..9cb5cb3 100644 --- a/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/publish/DefaultHealthCheckerManager.java +++ b/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/publish/DefaultHealthCheckerManager.java @@ -19,13 +19,21 @@ package io.servicecomb.metrics.core.publish; import static javax.ws.rs.core.Response.Status.BAD_REQUEST; +import java.util.ArrayList; +import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.config.BeanDefinition; +import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider; +import org.springframework.core.type.filter.AnnotationTypeFilter; import org.springframework.stereotype.Component; +import io.servicecomb.metrics.common.Health; import io.servicecomb.metrics.common.HealthCheckResult; import io.servicecomb.metrics.common.HealthChecker; import io.servicecomb.metrics.core.health.DefaultMicroserviceHealthChecker; @@ -33,12 +41,19 @@ import io.servicecomb.swagger.invocation.exception.InvocationException; @Component public class DefaultHealthCheckerManager implements HealthCheckerManager { + + private static Logger logger = LoggerFactory.getLogger(DefaultHealthCheckerManager.class); + private final Map<String, HealthChecker> healthCheckers; public DefaultHealthCheckerManager() { this.healthCheckers = new ConcurrentHashMap<>(); HealthChecker defaultHealthChecker = new DefaultMicroserviceHealthChecker(); this.healthCheckers.put(defaultHealthChecker.getName(), defaultHealthChecker); + + for (HealthChecker checker : getAllAnnotationHealthChecker()) { + this.healthCheckers.put(checker.getName(), checker); + } } @Override @@ -59,4 +74,28 @@ public class DefaultHealthCheckerManager implements HealthCheckerManager { } throw new InvocationException(BAD_REQUEST, "HealthChecker name : " + name + " unregister"); } + + private List<HealthChecker> getAllAnnotationHealthChecker() { + List<HealthChecker> checkers = new ArrayList<>(); + ClassPathScanningCandidateComponentProvider scanner = new ClassPathScanningCandidateComponentProvider(false); + scanner.addIncludeFilter(new AnnotationTypeFilter(Health.class)); + for (BeanDefinition definition : scanner.findCandidateComponents("./")) { + try { + Class<?> beanClass = Class.forName(definition.getBeanClassName()); + if (HealthChecker.class.isAssignableFrom(beanClass)) { + try { + checkers.add((HealthChecker) beanClass.getConstructor(null).newInstance()); + } catch (Exception e) { + logger.error("construct health check class failed", e); + } + } else { + logger.error( + "health annotation class:" + definition.getBeanClassName() + " not implement HealthChecker interface"); + } + } catch (ClassNotFoundException e) { + logger.error("health check class not found", e); + } + } + return checkers; + } } diff --git a/samples/metrics-extend-healthcheck/src/main/java/io/servicecomb/samples/metrics/extendhealthcheck/CustomHealthChecker.java b/samples/metrics-extend-healthcheck/src/main/java/io/servicecomb/samples/metrics/extendhealthcheck/CustomHealthCheckerAnnotation.java similarity index 81% copy from samples/metrics-extend-healthcheck/src/main/java/io/servicecomb/samples/metrics/extendhealthcheck/CustomHealthChecker.java copy to samples/metrics-extend-healthcheck/src/main/java/io/servicecomb/samples/metrics/extendhealthcheck/CustomHealthCheckerAnnotation.java index 1960de8..6816abd 100644 --- a/samples/metrics-extend-healthcheck/src/main/java/io/servicecomb/samples/metrics/extendhealthcheck/CustomHealthChecker.java +++ b/samples/metrics-extend-healthcheck/src/main/java/io/servicecomb/samples/metrics/extendhealthcheck/CustomHealthCheckerAnnotation.java @@ -17,10 +17,13 @@ package io.servicecomb.samples.metrics.extendhealthcheck; +import io.servicecomb.metrics.common.Health; import io.servicecomb.metrics.common.HealthCheckResult; import io.servicecomb.metrics.common.HealthChecker; -public class CustomHealthChecker implements HealthChecker { +//this health check will auto register because Health Annotation +@Health +public class CustomHealthCheckerAnnotation implements HealthChecker { @Override public String getName() { return "custom"; @@ -28,7 +31,6 @@ public class CustomHealthChecker implements HealthChecker { @Override public HealthCheckResult check() { - //add your health check code here - return new HealthCheckResult(true, "demo health check", "no extra data"); + return new HealthCheckResult(true, "custom", "no extra data"); } } diff --git a/samples/metrics-extend-healthcheck/src/main/java/io/servicecomb/samples/metrics/extendhealthcheck/CustomHealthChecker.java b/samples/metrics-extend-healthcheck/src/main/java/io/servicecomb/samples/metrics/extendhealthcheck/MySqlHealthChecker.java similarity index 59% rename from samples/metrics-extend-healthcheck/src/main/java/io/servicecomb/samples/metrics/extendhealthcheck/CustomHealthChecker.java rename to samples/metrics-extend-healthcheck/src/main/java/io/servicecomb/samples/metrics/extendhealthcheck/MySqlHealthChecker.java index 1960de8..620857d 100644 --- a/samples/metrics-extend-healthcheck/src/main/java/io/servicecomb/samples/metrics/extendhealthcheck/CustomHealthChecker.java +++ b/samples/metrics-extend-healthcheck/src/main/java/io/servicecomb/samples/metrics/extendhealthcheck/MySqlHealthChecker.java @@ -17,18 +17,38 @@ package io.servicecomb.samples.metrics.extendhealthcheck; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.SQLException; + import io.servicecomb.metrics.common.HealthCheckResult; import io.servicecomb.metrics.common.HealthChecker; -public class CustomHealthChecker implements HealthChecker { +//this is a demo health checker for mysql +public class MySqlHealthChecker implements HealthChecker { @Override public String getName() { - return "custom"; + return "mysql"; } @Override public HealthCheckResult check() { //add your health check code here - return new HealthCheckResult(true, "demo health check", "no extra data"); + Connection connection = null; + try { + connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/test_db?useSSL=false", "root", "pwd"); + return new HealthCheckResult(true, "local mysql health check", ""); + } catch (SQLException e) { + e.printStackTrace(); + return new HealthCheckResult(false, "local mysql health check", e.toString()); + } finally { + if (connection != null) { + try { + connection.close(); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } } } diff --git a/samples/metrics-extend-healthcheck/src/main/java/io/servicecomb/samples/metrics/extendhealthcheck/SimpleService.java b/samples/metrics-extend-healthcheck/src/main/java/io/servicecomb/samples/metrics/extendhealthcheck/SimpleService.java index 5e24cb2..a25cdba 100644 --- a/samples/metrics-extend-healthcheck/src/main/java/io/servicecomb/samples/metrics/extendhealthcheck/SimpleService.java +++ b/samples/metrics-extend-healthcheck/src/main/java/io/servicecomb/samples/metrics/extendhealthcheck/SimpleService.java @@ -38,7 +38,7 @@ public class SimpleService { this.manager = manager; //register your custom health check - this.manager.register(new CustomHealthChecker()); + this.manager.register(new MySqlHealthChecker()); } @GetMapping(path = "/f") -- To stop receiving notification emails like this one, please contact "[email protected]" <[email protected]>.
