Skip to content

Commit

Permalink
Merge 730e9c2 into ce4fb5d
Browse files Browse the repository at this point in the history
  • Loading branch information
zhengyangyong committed Dec 12, 2017
2 parents ce4fb5d + 730e9c2 commit 93cd576
Show file tree
Hide file tree
Showing 11 changed files with 96 additions and 47 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -39,11 +39,11 @@
import io.servicecomb.common.rest.locator.ServicePathManager;
import io.servicecomb.core.Const;
import io.servicecomb.core.Invocation;
import io.servicecomb.core.metrics.InvocationStartedEvent;
import io.servicecomb.core.definition.MicroserviceMeta;
import io.servicecomb.core.definition.OperationMeta;
import io.servicecomb.core.metrics.InvocationStartedEvent;
import io.servicecomb.foundation.common.utils.EventUtils;
import io.servicecomb.foundation.common.utils.JsonUtils;
import io.servicecomb.foundation.metrics.event.MetricsEventManager;
import io.servicecomb.foundation.vertx.http.HttpServletRequestEx;
import io.servicecomb.foundation.vertx.http.HttpServletResponseEx;
import io.servicecomb.foundation.vertx.stream.BufferOutputStream;
Expand Down Expand Up @@ -106,7 +106,7 @@ protected void scheduleInvocation() {

InvocationStartedEvent startedEvent = new InvocationStartedEvent(operationMeta.getMicroserviceQualifiedName(),
System.nanoTime());
MetricsEventManager.triggerEvent(startedEvent);
EventUtils.triggerEvent(startedEvent);

operationMeta.getExecutor().execute(() -> {
synchronized (this.requestEx) {
Expand Down
6 changes: 3 additions & 3 deletions core/src/main/java/io/servicecomb/core/Invocation.java
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@
import io.servicecomb.core.metrics.InvocationFinishedEvent;
import io.servicecomb.core.metrics.InvocationStartProcessingEvent;
import io.servicecomb.core.provider.consumer.ReferenceConfig;
import io.servicecomb.foundation.metrics.event.MetricsEventManager;
import io.servicecomb.foundation.common.utils.EventUtils;
import io.servicecomb.swagger.invocation.AsyncResponse;
import io.servicecomb.swagger.invocation.InvocationType;
import io.servicecomb.swagger.invocation.SwaggerInvocation;
Expand Down Expand Up @@ -183,13 +183,13 @@ public String getMicroserviceQualifiedName() {

public void triggerStartProcessingEvent() {
this.startProcessingTime = System.nanoTime();
MetricsEventManager.triggerEvent(new InvocationStartProcessingEvent(
EventUtils.triggerEvent(new InvocationStartProcessingEvent(
operationMeta.getMicroserviceQualifiedName(), startProcessingTime, startProcessingTime - startTime));
}

public void triggerFinishedEvent() {
long finishedTime = System.nanoTime();
MetricsEventManager
EventUtils
.triggerEvent(new InvocationFinishedEvent(operationMeta.getMicroserviceQualifiedName(),
String.valueOf(this.invocationType), finishedTime,
finishedTime - startProcessingTime,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,9 @@

package io.servicecomb.core.metrics;

import io.servicecomb.foundation.metrics.event.MetricsEvent;
import io.servicecomb.foundation.common.event.Event;

public class InvocationFinishedEvent implements MetricsEvent {
public class InvocationFinishedEvent implements Event {
private final String operationName;

private final long finishedTime;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,9 @@

package io.servicecomb.core.metrics;

import io.servicecomb.foundation.metrics.event.MetricsEvent;
import io.servicecomb.foundation.common.event.Event;

public class InvocationStartProcessingEvent implements MetricsEvent {
public class InvocationStartProcessingEvent implements Event {
private final String operationName;

private final long startProcessingTime;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,9 @@

package io.servicecomb.core.metrics;

import io.servicecomb.foundation.metrics.event.MetricsEvent;
import io.servicecomb.foundation.common.event.Event;

public class InvocationStartedEvent implements MetricsEvent {
public class InvocationStartedEvent implements Event {
private final String operationName;

private final long startedTime;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@
* limitations under the License.
*/

package io.servicecomb.foundation.metrics.event;
package io.servicecomb.foundation.common.event;

//Common event interface for metrics event extension
public interface MetricsEvent {
//Common event interface for event extension
public interface Event {
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,26 +14,34 @@
* limitations under the License.
*/

package io.servicecomb.foundation.metrics.event;
package io.servicecomb.foundation.common.event;

import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;

public class MetricsEventManager {
private static final Map<Class<? extends MetricsEvent>, List<MetricsEventListener>> allEvents = new ConcurrentHashMap<>();
public class EventBus {
private final Map<Class<? extends Event>, List<EventListener>> allEventListeners = new ConcurrentHashMap<>();

public static void registerEventListener(MetricsEventListener eventListener) {
List<MetricsEventListener> eventListeners = allEvents
public void registerEventListener(EventListener eventListener) {
List<EventListener> eventListeners = allEventListeners
.computeIfAbsent(eventListener.getConcernedEvent(), f -> new CopyOnWriteArrayList<>());
eventListeners.add(eventListener);
}

public static void triggerEvent(MetricsEvent event) {
List<MetricsEventListener> eventListeners = allEvents.getOrDefault(event.getClass(), Collections.emptyList());
for (MetricsEventListener eventListener : eventListeners) {
public void unregisterEventListener(EventListener eventListener) {
List<EventListener> eventListeners = allEventListeners
.computeIfAbsent(eventListener.getConcernedEvent(), f -> new CopyOnWriteArrayList<>());
if (eventListeners.contains(eventListener)) {
eventListeners.remove(eventListener);
}
}

public void triggerEvent(Event event) {
List<EventListener> eventListeners = allEventListeners.getOrDefault(event.getClass(), Collections.emptyList());
for (EventListener eventListener : eventListeners) {
eventListener.process(event);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,14 +14,14 @@
* limitations under the License.
*/

package io.servicecomb.foundation.metrics.event;
package io.servicecomb.foundation.common.event;

//Common event listener interface,java chassis component can trigger event let high level metrics component perceive meter meta data.
public interface MetricsEventListener {
//Common event listener interface,java chassis component can trigger event let high level component perceive data change.
public interface EventListener {

//what is type event this listener concerned
Class<? extends MetricsEvent> getConcernedEvent();
Class<? extends Event> getConcernedEvent();

//process metric data
void process(MetricsEvent data);
//process event data
void process(Event data);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
/*
* Copyright 2017 Huawei Technologies Co., Ltd
*
* Licensed 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 io.servicecomb.foundation.common.utils;

import io.servicecomb.foundation.common.event.Event;
import io.servicecomb.foundation.common.event.EventBus;
import io.servicecomb.foundation.common.event.EventListener;

public final class EventUtils {
private static final EventBus eventBus = new EventBus();

public static void registerEventListener(EventListener eventListener) {
eventBus.registerEventListener(eventListener);
}

public static void unregisterEventListener(EventListener eventListener) {
eventBus.unregisterEventListener(eventListener);
}

public static void triggerEvent(Event event) {
eventBus.triggerEvent(event);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
* limitations under the License.
*/

package io.servicecomb.foundation.metrics;
package io.servicecomb.foundation.common.event;

import static org.awaitility.Awaitility.await;

Expand All @@ -24,36 +24,40 @@
import org.junit.Assert;
import org.junit.Test;

import io.servicecomb.foundation.metrics.event.MetricsEvent;
import io.servicecomb.foundation.metrics.event.MetricsEventListener;
import io.servicecomb.foundation.metrics.event.MetricsEventManager;
import io.servicecomb.foundation.common.utils.EventUtils;

public class TestMetricsEventManager {
public class TestEventBus {

@Test
public void testManager() {
public void test() throws InterruptedException {
AtomicBoolean eventReceived = new AtomicBoolean(false);

MetricsEventManager.registerEventListener(new MetricsEventListener() {
EventListener listener = new EventListener() {
@Override
public Class<? extends MetricsEvent> getConcernedEvent() {
return TestMetricsEvent.class;
public Class<? extends Event> getConcernedEvent() {
return TestEvent.class;
}

@Override
public void process(MetricsEvent data) {
public void process(Event data) {
eventReceived.set(true);
}
});

MetricsEventManager.triggerEvent(new TestMetricsEvent());
};

EventUtils.registerEventListener(listener);
EventUtils.triggerEvent(new TestEvent());
await().atMost(1, TimeUnit.SECONDS)
.until(eventReceived::get);

Assert.assertTrue(eventReceived.get());

eventReceived.set(false);

EventUtils.unregisterEventListener(listener);
EventUtils.triggerEvent(new TestEvent());
Thread.sleep(1000);
Assert.assertFalse(eventReceived.get());
}

private class TestMetricsEvent implements MetricsEvent {
private class TestEvent implements Event {
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,12 +28,12 @@
import io.servicecomb.core.Const;
import io.servicecomb.core.CseContext;
import io.servicecomb.core.Invocation;
import io.servicecomb.core.metrics.InvocationStartedEvent;
import io.servicecomb.core.definition.MicroserviceMeta;
import io.servicecomb.core.definition.MicroserviceMetaManager;
import io.servicecomb.core.definition.OperationMeta;
import io.servicecomb.core.definition.SchemaMeta;
import io.servicecomb.foundation.metrics.event.MetricsEventManager;
import io.servicecomb.core.metrics.InvocationStartedEvent;
import io.servicecomb.foundation.common.utils.EventUtils;
import io.servicecomb.foundation.vertx.tcp.TcpConnection;
import io.servicecomb.swagger.invocation.Response;
import io.servicecomb.swagger.invocation.exception.InvocationException;
Expand Down Expand Up @@ -164,7 +164,7 @@ private void sendResponse(Map<String, String> context, Response response) {
public void execute() {
InvocationStartedEvent startedEvent = new InvocationStartedEvent(operationMeta.getMicroserviceQualifiedName(),
System.nanoTime());
MetricsEventManager.triggerEvent(startedEvent);
EventUtils.triggerEvent(startedEvent);

operationMeta.getExecutor().execute(() -> runInExecutor(startedEvent));
}
Expand Down

0 comments on commit 93cd576

Please sign in to comment.