You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicecomb.apache.org by wu...@apache.org on 2018/04/03 08:26:58 UTC

[incubator-servicecomb-java-chassis] 04/05: SCB-385 register publisher schemas to core

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 3e9e29ed3b6947e6e5c6c38bfcb98ca5c7433c46
Author: wujimin <wu...@huawei.com>
AuthorDate: Sat Mar 31 08:36:05 2018 +0800

    SCB-385 register publisher schemas to core
---
 .../metrics/core/MetricsBootListener.java          | 39 +++++++++-
 ...rvicecomb.foundation.metrics.MetricsInitializer |  3 +-
 .../metrics/core/TestMetricsBootListener.java      | 85 ++++++++++++++++++++++
 3 files changed, 123 insertions(+), 4 deletions(-)

diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/MetricsBootListener.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/MetricsBootListener.java
index 48c2837..289c879 100644
--- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/MetricsBootListener.java
+++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/MetricsBootListener.java
@@ -16,9 +16,18 @@
  */
 package org.apache.servicecomb.metrics.core;
 
+import javax.inject.Inject;
+
 import org.apache.servicecomb.core.BootListener;
+import org.apache.servicecomb.core.definition.schema.ProducerSchemaFactory;
 import org.apache.servicecomb.foundation.common.event.EventManager;
+import org.apache.servicecomb.foundation.common.utils.SPIServiceUtils;
 import org.apache.servicecomb.foundation.metrics.MetricsBootstrap;
+import org.apache.servicecomb.foundation.metrics.MetricsInitializer;
+import org.apache.servicecomb.metrics.core.publish.HealthCheckerRestPublisher;
+import org.apache.servicecomb.metrics.core.publish.MetricsRestPublisher;
+import org.apache.servicecomb.serviceregistry.RegistryUtils;
+import org.apache.servicecomb.serviceregistry.api.registry.Microservice;
 import org.springframework.stereotype.Component;
 
 import com.netflix.spectator.api.Spectator;
@@ -27,12 +36,36 @@ import com.netflix.spectator.api.Spectator;
 public class MetricsBootListener implements BootListener {
   private MetricsBootstrap metricsBootstrap = new MetricsBootstrap();
 
+  @Inject
+  private ProducerSchemaFactory producerSchemaFactory;
+
   @Override
   public void onBootEvent(BootEvent event) {
-    if (!EventType.AFTER_REGISTRY.equals(event.getEventType())) {
-      return;
+    switch (event.getEventType()) {
+      case BEFORE_PRODUCER_PROVIDER:
+        registerSchemas();
+        break;
+      case AFTER_REGISTRY:
+        metricsBootstrap.start(Spectator.globalRegistry(), EventManager.getEventBus());
+        break;
+      default:
+        break;
     }
+  }
+
+  private void registerSchemas() {
+    Microservice microservice = RegistryUtils.getMicroservice();
+
+    producerSchemaFactory.getOrCreateProducerSchema(microservice.getServiceName(),
+        "healthEndpoint",
+        HealthCheckerRestPublisher.class,
+        new HealthCheckerRestPublisher());
 
-    metricsBootstrap.start(Spectator.globalRegistry(), EventManager.getEventBus());
+    MetricsRestPublisher metricsRestPublisher =
+        SPIServiceUtils.getTargetService(MetricsInitializer.class, MetricsRestPublisher.class);
+    producerSchemaFactory.getOrCreateProducerSchema(microservice.getServiceName(),
+        "metricsEndpoint",
+        metricsRestPublisher.getClass(),
+        metricsRestPublisher);
   }
 }
diff --git a/metrics/metrics-core/src/main/resources/META-INF/services/org.apache.servicecomb.foundation.metrics.MetricsInitializer b/metrics/metrics-core/src/main/resources/META-INF/services/org.apache.servicecomb.foundation.metrics.MetricsInitializer
index 2933349..fb6c466 100644
--- a/metrics/metrics-core/src/main/resources/META-INF/services/org.apache.servicecomb.foundation.metrics.MetricsInitializer
+++ b/metrics/metrics-core/src/main/resources/META-INF/services/org.apache.servicecomb.foundation.metrics.MetricsInitializer
@@ -16,4 +16,5 @@
 #
 
 org.apache.servicecomb.metrics.core.DefaultMetricsInitializer
-org.apache.servicecomb.metrics.core.publish.DefaultLogPublisher
\ No newline at end of file
+org.apache.servicecomb.metrics.core.publish.DefaultLogPublisher
+org.apache.servicecomb.metrics.core.publish.MetricsRestPublisher
\ No newline at end of file
diff --git a/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/TestMetricsBootListener.java b/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/TestMetricsBootListener.java
new file mode 100644
index 0000000..ce2d462
--- /dev/null
+++ b/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/TestMetricsBootListener.java
@@ -0,0 +1,85 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.servicecomb.metrics.core;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.servicecomb.core.BootListener.BootEvent;
+import org.apache.servicecomb.core.BootListener.EventType;
+import org.apache.servicecomb.core.definition.SchemaMeta;
+import org.apache.servicecomb.core.definition.schema.ProducerSchemaFactory;
+import org.apache.servicecomb.foundation.common.utils.SPIServiceUtils;
+import org.apache.servicecomb.foundation.metrics.MetricsInitializer;
+import org.apache.servicecomb.metrics.core.publish.HealthCheckerRestPublisher;
+import org.apache.servicecomb.metrics.core.publish.MetricsRestPublisher;
+import org.apache.servicecomb.serviceregistry.RegistryUtils;
+import org.apache.servicecomb.serviceregistry.api.registry.Microservice;
+import org.junit.Assert;
+import org.junit.Test;
+
+import mockit.Deencapsulation;
+import mockit.Expectations;
+import mockit.Mock;
+import mockit.MockUp;
+
+public class TestMetricsBootListener {
+  MetricsBootListener listener = new MetricsBootListener();
+
+  @Test
+  public void registerSchemas() {
+    List<Object[]> argsList = new ArrayList<>();
+
+    ProducerSchemaFactory producerSchemaFactory = new MockUp<ProducerSchemaFactory>() {
+      @Mock
+      SchemaMeta getOrCreateProducerSchema(String microserviceName, String schemaId,
+          Class<?> producerClass,
+          Object producerInstance) {
+        argsList.add(new Object[] {microserviceName, schemaId, producerClass, producerInstance});
+        return null;
+      }
+    }.getMockInstance();
+    Deencapsulation.setField(listener, "producerSchemaFactory", producerSchemaFactory);
+
+    Microservice microservice = new Microservice();
+    microservice.setServiceName("name");
+    new Expectations(RegistryUtils.class) {
+      {
+        RegistryUtils.getMicroservice();
+        result = microservice;
+      }
+    };
+
+    BootEvent event = new BootEvent();
+    event.setEventType(EventType.BEFORE_PRODUCER_PROVIDER);
+    listener.onBootEvent(event);
+
+    Object[] args = argsList.get(0);
+    Assert.assertEquals("name", args[0]);
+    Assert.assertEquals("healthEndpoint", args[1]);
+    Assert.assertEquals(HealthCheckerRestPublisher.class, args[2]);
+    Assert.assertEquals(HealthCheckerRestPublisher.class, args[3].getClass());
+
+    MetricsRestPublisher metricsRestPublisher =
+        SPIServiceUtils.getTargetService(MetricsInitializer.class, MetricsRestPublisher.class);
+    args = argsList.get(1);
+    Assert.assertEquals("name", args[0]);
+    Assert.assertEquals("metricsEndpoint", args[1]);
+    Assert.assertEquals(MetricsRestPublisher.class, args[2]);
+    Assert.assertSame(metricsRestPublisher, args[3]);
+  }
+}

-- 
To stop receiving notification emails like this one, please contact
wujimin@apache.org.