This is an automated email from the ASF dual-hosted git repository. liubao pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/incubator-servicecomb-java-chassis.git
commit 18ca4ed45fd47c69aabdaec9820584a7ec6b23d7 Author: wujimin <wuji...@huawei.com> AuthorDate: Mon Mar 12 16:26:06 2018 +0800 SCB-383 define metrics init and poll mechanism --- .../foundation/metrics/MetricsBootstrap.java | 82 +++++++++++++++++++ .../foundation/metrics/MetricsBootstrapConfig.java | 36 ++++++++ .../foundation/metrics/MetricsInitializer.java | 27 ++++++ .../foundation/metrics/PolledEvent.java | 37 +++++++++ .../foundation/metrics/TestMetricsBootstrap.java | 95 ++++++++++++++++++++++ 5 files changed, 277 insertions(+) diff --git a/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/MetricsBootstrap.java b/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/MetricsBootstrap.java new file mode 100644 index 0000000..2335264 --- /dev/null +++ b/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/MetricsBootstrap.java @@ -0,0 +1,82 @@ +/* + * 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.foundation.metrics; + +import java.util.List; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; + +import org.apache.servicecomb.foundation.common.utils.SPIServiceUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.google.common.collect.Lists; +import com.google.common.eventbus.EventBus; +import com.google.common.util.concurrent.ThreadFactoryBuilder; +import com.netflix.spectator.api.CompositeRegistry; +import com.netflix.spectator.api.Meter; + +public class MetricsBootstrap { + private static final Logger LOGGER = LoggerFactory.getLogger(MetricsBootstrap.class); + + private CompositeRegistry globalRegistry; + + private EventBus eventBus; + + private MetricsBootstrapConfig config = new MetricsBootstrapConfig(); + + private ScheduledExecutorService executorService; + + public void start(CompositeRegistry globalRegistry, EventBus eventBus) { + this.globalRegistry = globalRegistry; + this.eventBus = eventBus; + this.executorService = Executors.newScheduledThreadPool(1, + new ThreadFactoryBuilder() + .setNameFormat("spectator-poller-%d") + .build()); + + loadMetricsInitializers(); + startPoll(); + } + + public void shutdown() { + executorService.shutdown(); + } + + protected void loadMetricsInitializers() { + SPIServiceUtils.getSortedService(MetricsInitializer.class).forEach(initializer -> { + LOGGER.info("Found MetricsInitializer: {}", initializer.getClass().getName()); + + initializer.init(globalRegistry, eventBus, config); + }); + } + + protected void startPoll() { + executorService.scheduleAtFixedRate(this::pollMeters, + 0, + config.getMsPollInterval(), + TimeUnit.MILLISECONDS); + } + + protected void pollMeters() { + List<Meter> meters = Lists.newArrayList(globalRegistry.iterator()); + PolledEvent event = new PolledEvent(meters); + + eventBus.post(event); + } +} diff --git a/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/MetricsBootstrapConfig.java b/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/MetricsBootstrapConfig.java new file mode 100644 index 0000000..41baa95 --- /dev/null +++ b/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/MetricsBootstrapConfig.java @@ -0,0 +1,36 @@ +/* + * 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.foundation.metrics; + +import com.netflix.config.DynamicPropertyFactory; + +public class MetricsBootstrapConfig { + public static final String METRICS_WINDOW_TIME = "servicecomb.metrics.window_time"; + + public static final int DEFAULT_METRICS_WINDOW_TIME = 5000; + + private long msPollInterval; + + public MetricsBootstrapConfig() { + msPollInterval = + DynamicPropertyFactory.getInstance().getIntProperty(METRICS_WINDOW_TIME, DEFAULT_METRICS_WINDOW_TIME).get();; + } + + public long getMsPollInterval() { + return msPollInterval; + } +} diff --git a/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/MetricsInitializer.java b/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/MetricsInitializer.java new file mode 100644 index 0000000..5e1aaef --- /dev/null +++ b/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/MetricsInitializer.java @@ -0,0 +1,27 @@ +/* + * 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.foundation.metrics; + +import com.google.common.eventbus.EventBus; +import com.netflix.spectator.api.CompositeRegistry; + +public interface MetricsInitializer { + /** + * if create new registry, must add to globalRegistry + */ + void init(CompositeRegistry globalRegistry, EventBus eventBus, MetricsBootstrapConfig config); +} diff --git a/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/PolledEvent.java b/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/PolledEvent.java new file mode 100644 index 0000000..b2aa070 --- /dev/null +++ b/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/PolledEvent.java @@ -0,0 +1,37 @@ +/* + * 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.foundation.metrics; + +import java.util.List; + +import com.netflix.spectator.api.Meter; + +public class PolledEvent { + private List<Meter> meters; + + public PolledEvent(List<Meter> meters) { + this.meters = meters; + } + + public List<Meter> getMeters() { + return meters; + } + + public void setMeters(List<Meter> meters) { + this.meters = meters; + } +} diff --git a/foundations/foundation-metrics/src/test/java/org/apache/servicecomb/foundation/metrics/TestMetricsBootstrap.java b/foundations/foundation-metrics/src/test/java/org/apache/servicecomb/foundation/metrics/TestMetricsBootstrap.java new file mode 100644 index 0000000..b8280f4 --- /dev/null +++ b/foundations/foundation-metrics/src/test/java/org/apache/servicecomb/foundation/metrics/TestMetricsBootstrap.java @@ -0,0 +1,95 @@ +/* + * 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.foundation.metrics; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import org.apache.servicecomb.foundation.common.utils.SPIServiceUtils; +import org.hamcrest.Matchers; +import org.junit.After; +import org.junit.Assert; +import org.junit.Test; + +import com.google.common.eventbus.EventBus; +import com.google.common.eventbus.Subscribe; +import com.netflix.spectator.api.CompositeRegistry; +import com.netflix.spectator.api.Meter; + +import mockit.Expectations; +import mockit.Mocked; + +public class TestMetricsBootstrap { + MetricsBootstrap bootstrap = new MetricsBootstrap(); + + @Mocked + CompositeRegistry globalRegistry; + + EventBus eventBus = new EventBus(); + + @After + public void teardown() { + bootstrap.shutdown(); + } + + @Test + public void loadMetricsInitializers() { + List<MetricsInitializer> initList = new ArrayList<>(); + MetricsInitializer metricsInitializer = new MetricsInitializer() { + @Override + public void init(CompositeRegistry globalRegistry, EventBus eventBus, MetricsBootstrapConfig config) { + initList.add(this); + } + }; + new Expectations(SPIServiceUtils.class) { + { + SPIServiceUtils.getSortedService(MetricsInitializer.class); + result = Arrays.asList(metricsInitializer, metricsInitializer); + } + }; + + bootstrap.start(globalRegistry, eventBus); + + Assert.assertThat(initList, Matchers.contains(metricsInitializer, metricsInitializer)); + } + + @Test + public void pollMeters() { + bootstrap.start(globalRegistry, eventBus); + + List<Meter> meters = new ArrayList<>(); + new Expectations() { + { + globalRegistry.iterator(); + result = meters.iterator(); + } + }; + + PolledEvent result = new PolledEvent(null); + eventBus.register(new Object() { + @Subscribe + public void onEvent(PolledEvent event) { + result.setMeters(event.getMeters()); + } + }); + + bootstrap.pollMeters(); + + Assert.assertEquals(meters, result.getMeters()); + } +} -- To stop receiving notification emails like this one, please contact liu...@apache.org.