This is an automated email from the ASF dual-hosted git repository. ningjiang pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/incubator-servicecomb-java-chassis.git
commit 530082824036be9893fab58cc6522d39bc246c0c Author: zhengyangyong <[email protected]> AuthorDate: Sat Jan 27 09:20:41 2018 +0800 SCB-147 Delete 0.5.0 metrics in foundation-metrics Signed-off-by: zhengyangyong <[email protected]> --- .../common/rest/AbstractRestInvocation.java | 61 +-- .../common/rest/TestAbstractRestInvocation.java | 29 +- .../org/apache/servicecomb/core/Invocation.java | 11 - .../demo/springmvc/client/SpringmvcClient.java | 29 -- .../demo/springmvc/server/CodeFirstSpringmvc.java | 38 +- .../foundation/metrics/MetricsServoRegistry.java | 576 --------------------- .../foundation/metrics/TpsAndLatencyData.java | 51 -- .../metrics/output/MetricsFileOutput.java | 70 --- .../output/servo/FileOutputMetricObserver.java | 56 -- .../output/servo/MetricsContentConvertor.java | 28 - .../output/servo/MetricsContentFormatter.java | 24 - .../output/servo/MetricsObserverInitializer.java | 85 --- .../output/servo/RollingMetricsFileOutput.java | 43 -- .../servo/SimpleMetricsContentConvertor.java | 70 --- .../servo/SimpleMetricsContentFormatter.java | 97 ---- .../metrics/performance/MetricsDataMonitor.java | 240 --------- .../performance/MetricsDataMonitorUtil.java | 57 -- .../metrics/performance/QueueMetrics.java | 98 ---- .../metrics/performance/QueueMetricsData.java | 215 -------- ...ileOutputMetricObserverAndContentConvertor.java | 131 ----- .../metrics/TestMetricsServoRegistry.java | 220 -------- .../metrics/TestSimpleMetricsContentFormatter.java | 41 -- .../performance/TestMetricsDataMonitor.java | 132 ----- .../performance/TestMetricsDataMonitorUtil.java | 61 --- .../servicecomb/bizkeeper/BizkeeperHandler.java | 12 +- .../transport/highway/HighwayServerInvoke.java | 62 +-- 26 files changed, 25 insertions(+), 2512 deletions(-) diff --git a/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/AbstractRestInvocation.java b/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/AbstractRestInvocation.java index c8ce3ca..5e87436 100644 --- a/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/AbstractRestInvocation.java +++ b/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/AbstractRestInvocation.java @@ -41,9 +41,6 @@ import org.apache.servicecomb.core.definition.OperationMeta; import org.apache.servicecomb.core.metrics.InvocationStartedEvent; import org.apache.servicecomb.foundation.common.utils.EventUtils; import org.apache.servicecomb.foundation.common.utils.JsonUtils; -import org.apache.servicecomb.foundation.metrics.MetricsServoRegistry; -import org.apache.servicecomb.foundation.metrics.performance.QueueMetrics; -import org.apache.servicecomb.foundation.metrics.performance.QueueMetricsData; import org.apache.servicecomb.foundation.vertx.http.HttpServletRequestEx; import org.apache.servicecomb.foundation.vertx.http.HttpServletResponseEx; import org.apache.servicecomb.foundation.vertx.stream.BufferOutputStream; @@ -121,8 +118,6 @@ public abstract class AbstractRestInvocation { InvocationType.PRODUCER, System.nanoTime()); EventUtils.triggerEvent(startedEvent); - QueueMetrics metricsData = initMetrics(operationMeta); - operationMeta.getExecutor().execute(() -> { synchronized (this.requestEx) { try { @@ -135,7 +130,7 @@ public abstract class AbstractRestInvocation { return; } - runOnExecutor(metricsData, startedEvent); + runOnExecutor(startedEvent); } catch (Throwable e) { LOGGER.error("rest server onRequest error", e); sendFailResponse(e); @@ -144,13 +139,10 @@ public abstract class AbstractRestInvocation { }); } - protected void runOnExecutor(QueueMetrics metricsData, InvocationStartedEvent startedEvent) { + protected void runOnExecutor(InvocationStartedEvent startedEvent) { Object[] args = RestCodec.restToArgs(requestEx, restOperationMeta); createInvocation(args); - this.invocation.setMetricsData(metricsData); - updateMetrics(); - //立刻设置开始时间,否则Finished时无法计算TotalTime invocation.setStartTime(startedEvent.getStartedTime()); invocation.triggerStartProcessingEvent(); @@ -198,7 +190,6 @@ public abstract class AbstractRestInvocation { sendResponseQuietly(resp); invocation.triggerFinishedEvent(resp.getStatusCode(), resp.isSuccessed()); - endMetrics(); }); } @@ -253,52 +244,4 @@ public abstract class AbstractRestInvocation { responseEx.flushBuffer(); } } - - /** - * Init the metrics. Note down the queue count and start time. - * @param operationMeta Operation data - * @return QueueMetrics - */ - private QueueMetrics initMetrics(OperationMeta operationMeta) { - QueueMetrics metricsData = new QueueMetrics(); - metricsData.setQueueStartTime(System.currentTimeMillis()); - metricsData.setOperQualifiedName(operationMeta.getMicroserviceQualifiedName()); - QueueMetricsData reqQueue = MetricsServoRegistry.getOrCreateLocalMetrics() - .getOrCreateQueueMetrics(operationMeta.getMicroserviceQualifiedName()); - reqQueue.incrementCountInQueue(); - return metricsData; - } - - /** - * Update the queue metrics. - */ - private void updateMetrics() { - QueueMetrics metricsData = (QueueMetrics) this.invocation.getMetricsData(); - if (null != metricsData) { - metricsData.setQueueEndTime(System.currentTimeMillis()); - QueueMetricsData reqQueue = MetricsServoRegistry.getOrCreateLocalMetrics() - .getOrCreateQueueMetrics(restOperationMeta.getOperationMeta().getMicroserviceQualifiedName()); - reqQueue.incrementTotalCount(); - Long timeInQueue = metricsData.getQueueEndTime() - metricsData.getQueueStartTime(); - reqQueue.setTotalTime(reqQueue.getTotalTime() + timeInQueue); - reqQueue.setMinLifeTimeInQueue(timeInQueue); - reqQueue.setMaxLifeTimeInQueue(timeInQueue); - reqQueue.decrementCountInQueue(); - } - } - - /** - * Prepare the end time of queue metrics. - */ - private void endMetrics() { - QueueMetrics metricsData = (QueueMetrics) this.invocation.getMetricsData(); - if (null != metricsData) { - metricsData.setEndOperTime(System.currentTimeMillis()); - QueueMetricsData reqQueue = MetricsServoRegistry.getOrCreateLocalMetrics() - .getOrCreateQueueMetrics(restOperationMeta.getOperationMeta().getMicroserviceQualifiedName()); - reqQueue.incrementTotalServExecutionCount(); - reqQueue.setTotalServExecutionTime( - reqQueue.getTotalServExecutionTime() + (metricsData.getEndOperTime() - metricsData.getQueueEndTime())); - } - } } diff --git a/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/TestAbstractRestInvocation.java b/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/TestAbstractRestInvocation.java index 58d6c2e..16d81fb 100644 --- a/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/TestAbstractRestInvocation.java +++ b/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/TestAbstractRestInvocation.java @@ -44,7 +44,6 @@ import org.apache.servicecomb.core.executor.ReactiveExecutor; import org.apache.servicecomb.core.metrics.InvocationStartedEvent; import org.apache.servicecomb.core.provider.consumer.ReferenceConfig; import org.apache.servicecomb.foundation.common.utils.JsonUtils; -import org.apache.servicecomb.foundation.metrics.performance.QueueMetrics; import org.apache.servicecomb.foundation.vertx.http.AbstractHttpServletRequest; import org.apache.servicecomb.foundation.vertx.http.HttpServletRequestEx; import org.apache.servicecomb.foundation.vertx.http.HttpServletResponseEx; @@ -240,7 +239,7 @@ public class TestAbstractRestInvocation { Holder<Response> result = new Holder<>(); restInvocation = new AbstractRestInvocationForTest() { @Override - protected void doInvoke() throws Throwable { + protected void doInvoke() { result.value = Response.ok("not run to here"); } @@ -269,7 +268,7 @@ public class TestAbstractRestInvocation { Holder<Boolean> result = new Holder<>(); restInvocation = new AbstractRestInvocationForTest() { @Override - protected void doInvoke() throws Throwable { + protected void doInvoke() { result.value = true; } }; @@ -299,7 +298,7 @@ public class TestAbstractRestInvocation { } @Override - protected void doInvoke() throws Throwable { + protected void doInvoke() { } }; @@ -322,7 +321,7 @@ public class TestAbstractRestInvocation { restInvocation = new AbstractRestInvocationForTest() { @Override - protected void doInvoke() throws Throwable { + protected void doInvoke() { } @Override @@ -349,7 +348,7 @@ public class TestAbstractRestInvocation { Holder<Response> result = new Holder<>(); restInvocation = new AbstractRestInvocationForTest() { @Override - protected void doInvoke() throws Throwable { + protected void doInvoke() { } @Override @@ -371,11 +370,11 @@ public class TestAbstractRestInvocation { Holder<Response> result = new Holder<>(); restInvocation = new AbstractRestInvocationForTest() { @Override - protected void doInvoke() throws Throwable { + protected void doInvoke() { } @Override - protected void sendResponse(Response response) throws Exception { + protected void sendResponse(Response response) { result.value = response; } }; @@ -390,11 +389,11 @@ public class TestAbstractRestInvocation { public void sendResponseQuietlyException(@Mocked Response response) { restInvocation = new AbstractRestInvocationForTest() { @Override - protected void doInvoke() throws Throwable { + protected void doInvoke() { } @Override - protected void sendResponse(Response response) throws Exception { + protected void sendResponse(Response response) { throw new Error(""); } }; @@ -634,7 +633,7 @@ public class TestAbstractRestInvocation { Error error = new Error("run on executor"); restInvocation = new AbstractRestInvocationForTest() { @Override - protected void runOnExecutor(QueueMetrics metricsData, InvocationStartedEvent startedEvent) { + protected void runOnExecutor(InvocationStartedEvent startedEvent) { throw error; } @@ -671,7 +670,7 @@ public class TestAbstractRestInvocation { restInvocation = new AbstractRestInvocationForTest() { @Override - protected void runOnExecutor(QueueMetrics metricsData, InvocationStartedEvent startedEvent) { + protected void runOnExecutor(InvocationStartedEvent startedEvent) { throw new Error("run on executor"); } @@ -707,7 +706,7 @@ public class TestAbstractRestInvocation { Holder<Boolean> result = new Holder<>(); restInvocation = new AbstractRestInvocationForTest() { @Override - protected void runOnExecutor(QueueMetrics metricsData, InvocationStartedEvent startedEvent) { + protected void runOnExecutor(InvocationStartedEvent startedEvent) { result.value = true; } }; @@ -738,7 +737,7 @@ public class TestAbstractRestInvocation { restInvocation.requestEx = requestEx; restInvocation.restOperationMeta = restOperation; - restInvocation.runOnExecutor(null, new InvocationStartedEvent("", InvocationType.PRODUCER, System.nanoTime())); + restInvocation.runOnExecutor(new InvocationStartedEvent("", InvocationType.PRODUCER, System.nanoTime())); Assert.assertTrue(result.value); Assert.assertSame(invocation, restInvocation.invocation); } @@ -749,7 +748,7 @@ public class TestAbstractRestInvocation { Response response = Response.ok("ok"); Handler handler = new Handler() { @Override - public void handle(Invocation invocation, AsyncResponse asyncResp) throws Exception { + public void handle(Invocation invocation, AsyncResponse asyncResp) { asyncResp.complete(response); } }; diff --git a/core/src/main/java/org/apache/servicecomb/core/Invocation.java b/core/src/main/java/org/apache/servicecomb/core/Invocation.java index 81f25f8..96a84b9 100644 --- a/core/src/main/java/org/apache/servicecomb/core/Invocation.java +++ b/core/src/main/java/org/apache/servicecomb/core/Invocation.java @@ -53,17 +53,6 @@ public class Invocation extends SwaggerInvocation { private int handlerIndex; - //start,end of queue and operation time after queue for operation level metrics. - private Object metricsData; - - public Object getMetricsData() { - return metricsData; - } - - public void setMetricsData(Object metricsData) { - this.metricsData = metricsData; - } - // 应答的处理器 // 同步模式:避免应答在网络线程中处理解码等等业务级逻辑 diff --git a/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/client/SpringmvcClient.java b/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/client/SpringmvcClient.java index 08eec9b..71f885f 100644 --- a/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/client/SpringmvcClient.java +++ b/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/client/SpringmvcClient.java @@ -89,35 +89,6 @@ public class SpringmvcClient { testController(); } - //0.5.0 version metrics integration test - try { - // this test class is intended for retry hanging issue JAV-127 - String content = restTemplate.getForObject("cse://springmvc/codeFirstSpringmvc/metricsForTest", String.class); - @SuppressWarnings("unchecked") - Map<String, String> resultMap = JsonUtils.OBJ_MAPPER.readValue(content, HashMap.class); - - TestMgr.check(true, resultMap.get("CPU and Memory").contains("heapUsed=")); - - String[] requestProviders = resultMap.get("totalRequestProvider OPERATIONAL_LEVEL") - .replace("{", "") - .replace("}", "") - .split(","); - Map<String, Integer> requests = new HashMap<>(); - for (String requestProvider : requestProviders) { - String[] requestKeyAndValues = requestProvider.split("="); - requests.put(requestKeyAndValues[0], Integer.parseInt(requestKeyAndValues[1])); - } - - for (Entry<String, Integer> request : requests.entrySet()) { - TestMgr.check(true, request.getValue() > 0); - } - - TestMgr.check(true, resultMap.get("RequestQueueRelated").contains("springmvc.codeFirst.saySomething")); - TestMgr.check(true, resultMap.get("RequestQueueRelated").contains("springmvc.controller.sayHi")); - } catch (Exception e) { - TestMgr.check("true", "false"); - } - //0.5.0 later version metrics integration test try { RegistryMetric metric = metricsPublisher.metrics(); diff --git a/demo/demo-springmvc/springmvc-server/src/main/java/org/apache/servicecomb/demo/springmvc/server/CodeFirstSpringmvc.java b/demo/demo-springmvc/springmvc-server/src/main/java/org/apache/servicecomb/demo/springmvc/server/CodeFirstSpringmvc.java index 1251f61..103e37e 100644 --- a/demo/demo-springmvc/springmvc-server/src/main/java/org/apache/servicecomb/demo/springmvc/server/CodeFirstSpringmvc.java +++ b/demo/demo-springmvc/springmvc-server/src/main/java/org/apache/servicecomb/demo/springmvc/server/CodeFirstSpringmvc.java @@ -20,7 +20,6 @@ package org.apache.servicecomb.demo.springmvc.server; import java.io.IOException; import java.io.InputStream; import java.util.Date; -import java.util.HashMap; import java.util.List; import java.util.Map; @@ -39,8 +38,6 @@ import org.apache.servicecomb.demo.compute.Person; import org.apache.servicecomb.demo.ignore.InputModelForTestIgnore; import org.apache.servicecomb.demo.ignore.OutputModelForTestIgnore; import org.apache.servicecomb.demo.server.User; -import org.apache.servicecomb.foundation.common.utils.JsonUtils; -import org.apache.servicecomb.foundation.metrics.MetricsServoRegistry; import org.apache.servicecomb.provider.rest.common.RestSchema; import org.apache.servicecomb.swagger.extend.annotations.RawJsonRequestBody; import org.apache.servicecomb.swagger.extend.annotations.ResponseHeaders; @@ -49,7 +46,6 @@ import org.apache.servicecomb.swagger.invocation.context.ContextUtils; import org.apache.servicecomb.swagger.invocation.context.InvocationContext; import org.apache.servicecomb.swagger.invocation.exception.InvocationException; import org.apache.servicecomb.swagger.invocation.response.Headers; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; @@ -72,9 +68,6 @@ import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.client.RestTemplate; import org.springframework.web.multipart.MultipartFile; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.netflix.servo.monitor.Monitor; - import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; @@ -87,20 +80,12 @@ import io.vertx.core.json.JsonObject; @RequestMapping(path = "/codeFirstSpringmvc", produces = MediaType.APPLICATION_JSON_VALUE) public class CodeFirstSpringmvc { - private MetricsServoRegistry registry; - - @Autowired - public CodeFirstSpringmvc(MetricsServoRegistry registry) { - this.registry = registry; - } - - private String _fileUpload(MultipartFile file1, Part file2) { try (InputStream is1 = file1.getInputStream(); InputStream is2 = file2.getInputStream()) { String content1 = IOUtils.toString(is1); String content2 = IOUtils.toString(is2); return String.format("%s:%s:%s\n" - + "%s:%s:%s", + + "%s:%s:%s", file1.getOriginalFilename(), file1.getContentType(), content1, @@ -135,7 +120,7 @@ public class CodeFirstSpringmvc { InvocationContext c2 = ContextUtils.getInvocationContext(); headers.add("h2", "h2v " + c2.getContext().get(Const.SRC_MICROSERVICE).toString()); - return new ResponseEntity<Date>(date, headers, HttpStatus.ACCEPTED); + return new ResponseEntity<>(date, headers, HttpStatus.ACCEPTED); } @ResponseHeaders({@ResponseHeader(name = "h1", response = String.class), @@ -148,7 +133,7 @@ public class CodeFirstSpringmvc { InvocationContext c2 = ContextUtils.getInvocationContext(); headers.add("h2", "h2v " + c2.getContext().get(Const.SRC_MICROSERVICE).toString()); - return new ResponseEntity<Date>(date, headers, HttpStatus.ACCEPTED); + return new ResponseEntity<>(date, headers, HttpStatus.ACCEPTED); } @ApiResponse(code = 200, response = User.class, message = "") @@ -313,7 +298,7 @@ public class CodeFirstSpringmvc { return new OutputModelForTestIgnore("output_id", input.getInputId(), input.getContent(), input.getInputObject(), input.getInputJsonObject(), input.getInputIgnoreInterface(), new Person("outputSomeone"), new JsonObject("{\"OutputJsonKey\" : \"OutputJsonValue\"}"), () -> { - }); + }); } @SuppressWarnings("unchecked") @@ -343,21 +328,6 @@ public class CodeFirstSpringmvc { return form1 + form2; } - //Only for 0.5.0 Integration Test - @RequestMapping(path = "/metricsForTest", method = RequestMethod.GET) - public String metricsForTest() { - List<Monitor<?>> monitors = registry.getMetricsMonitors(); - Map<String, String> values = new HashMap<>(); - for (Monitor<?> monitor : monitors) { - values.put(monitor.getConfig().getName(), monitor.getValue().toString()); - } - try { - return JsonUtils.writeValueAsString(values); - } catch (JsonProcessingException e) { - throw new InvocationException(500, "500", "JsonProcessingException", e); - } - } - //Only for Prometheus integration test @RequestMapping(path = "/prometheusForTest", method = RequestMethod.GET) public String prometheusForTest() { diff --git a/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/MetricsServoRegistry.java b/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/MetricsServoRegistry.java deleted file mode 100644 index 49b40c5..0000000 --- a/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/MetricsServoRegistry.java +++ /dev/null @@ -1,576 +0,0 @@ -/* - * 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.lang.management.ManagementFactory; -import java.lang.management.MemoryMXBean; -import java.lang.management.MemoryUsage; -import java.lang.management.OperatingSystemMXBean; -import java.lang.management.ThreadMXBean; -import java.math.BigDecimal; -import java.math.RoundingMode; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Vector; -import java.util.concurrent.ConcurrentHashMap; -import java.util.stream.Collectors; - -import org.apache.servicecomb.foundation.metrics.performance.MetricsDataMonitor; -import org.apache.servicecomb.foundation.metrics.performance.QueueMetricsData; -import org.springframework.beans.factory.InitializingBean; - -import com.netflix.config.DynamicPropertyFactory; -import com.netflix.hystrix.HystrixCommandMetrics; -import com.netflix.hystrix.HystrixEventType; -import com.netflix.servo.DefaultMonitorRegistry; -import com.netflix.servo.annotations.DataSourceType; -import com.netflix.servo.monitor.AbstractMonitor; -import com.netflix.servo.monitor.BasicCompositeMonitor; -import com.netflix.servo.monitor.Gauge; -import com.netflix.servo.monitor.Informational; -import com.netflix.servo.monitor.Monitor; -import com.netflix.servo.monitor.MonitorConfig; - -import rx.functions.Func0; - -/** - * Implementation of metrics preparation and servo registry. - */ -public class MetricsServoRegistry implements InitializingBean { - - public static final String METRICS_ROUND_PLACES = "servicecomb.metrics.round_places"; - - protected static ThreadLocal<MetricsDataMonitor> LOCAL_METRICS_MAP = new ThreadLocal<>(); - - private MetricsDataMonitor localMetrics = new MetricsDataMonitor(); - - protected static Vector<MetricsDataMonitor> metricsList = new Vector<>(); - - private final int doubleRoundPlaces; - - private final String doubleStringFormatter; - - public MetricsServoRegistry() { - doubleRoundPlaces = DynamicPropertyFactory.getInstance().getIntProperty(METRICS_ROUND_PLACES, 1).get(); - doubleStringFormatter = "%." + String.valueOf(doubleRoundPlaces) + "f"; - } - - /* - * Added getter for unit test of local metrics. - * - * @return Local metric reference - */ - public MetricsDataMonitor getLocalMetrics() { - return localMetrics; - } - - - /** - * Get or create local metrics. - * @return MetricsDataMonitor - */ - public static MetricsDataMonitor getOrCreateLocalMetrics() { - MetricsDataMonitor metricsDataMonitor = LOCAL_METRICS_MAP.get(); - if (metricsDataMonitor == null) { - metricsDataMonitor = new MetricsDataMonitor(); - LOCAL_METRICS_MAP.set(metricsDataMonitor); - metricsList.add(metricsDataMonitor); - } - return metricsDataMonitor; - } - - /** - * Get the initial metrics and register with servo. - */ - public void initMetricsPublishing() { - /* list of monitors */ - List<Monitor<?>> monitors = getMetricsMonitors(); - MonitorConfig commandMetricsConfig = MonitorConfig.builder("metrics").build(); - BasicCompositeMonitor commandMetricsMonitor = new BasicCompositeMonitor(commandMetricsConfig, monitors); - DefaultMonitorRegistry.getInstance().register(commandMetricsMonitor); - } - - @Override - public void afterPropertiesSet() throws Exception { - initMetricsPublishing(); - } - - /** - * Get instance level total requests by comparing the last saved data. - */ - protected final Func0<Number> getTotalReqProvider = new Func0<Number>() { - @Override - public Number call() { - Long totalReqProvider = 0L; - for (MetricsDataMonitor metricsDataMonitor : metricsList) { - totalReqProvider += metricsDataMonitor.getTotalReqProvider(); - } - Long metricValue = totalReqProvider - localMetrics.getTotalReqProvider(); - localMetrics.setTotalReqProvider(totalReqProvider); - return metricValue; - } - }; - - /** - * Get instance level total failed requests by comparing the last saved data. - */ - protected final Func0<Number> getTotalFailedReqProvider = new Func0<Number>() { - @Override - public Number call() { - Long totalFailedReqProvider = 0L; - for (MetricsDataMonitor metricsDataMonitor : metricsList) { - totalFailedReqProvider += metricsDataMonitor.getTotalFailReqProvider(); - } - Long metricValue = totalFailedReqProvider - localMetrics.getTotalFailReqProvider(); - localMetrics.setTotalFailReqProvider(totalFailedReqProvider); - return metricValue; - } - }; - - /** - * Get instance level total failed requests by comparing the last saved data. - */ - protected final Func0<Number> getTotalReqConsumer = new Func0<Number>() { - @Override - public Number call() { - Long totalReqConsumer = 0L; - for (MetricsDataMonitor metricsDataMonitor : metricsList) { - totalReqConsumer += metricsDataMonitor.getTotalReqConsumer(); - } - Long metricValue = totalReqConsumer - localMetrics.getTotalReqConsumer(); - localMetrics.setTotalReqConsumer(totalReqConsumer); - return metricValue; - } - }; - - /** - * Get instance level total failed requests by comparing the last saved data. - */ - protected final Func0<Number> getFailedTotalReqConsumer = new Func0<Number>() { - @Override - public Number call() { - Long totalFailedReqConsumer = 0L; - for (MetricsDataMonitor metricsDataMonitor : metricsList) { - totalFailedReqConsumer += metricsDataMonitor.getTotalFailReqConsumer(); - } - Long metricValue = totalFailedReqConsumer - localMetrics.getTotalFailReqConsumer(); - localMetrics.setTotalFailReqConsumer(totalFailedReqConsumer); - return metricValue; - } - }; - - /** - * Get operational level total request and total failed requests by comparing the - * last saved data. - */ - protected final Func0<String> getTotalReqProdOperLevel = new Func0<String>() { - @Override - public String call() { - Map<String, Long> totalMap = new HashMap<>(); - Map<String, Long> oldMap = localMetrics.operMetricsTotalReq; - Map<String, Long> metricMap = new HashMap<>(); - for (MetricsDataMonitor metricsDataMonitor : metricsList) { - Collection<String> keySet = metricsDataMonitor.operMetricsTotalReq.keySet(); - for (String key : keySet) { - totalMap.merge(key, metricsDataMonitor.getOperMetTotalReq(key), (a, b) -> b + a); - } - } - Collection<String> keySet = totalMap.keySet(); - for (String key : keySet) { - if (oldMap.containsKey(key)) { - metricMap.put(key, totalMap.get(key) - oldMap.get(key)); - } else { - metricMap.put(key, totalMap.get(key)); - } - } - localMetrics.operMetricsTotalReq.putAll(totalMap); - return metricMap.toString(); - } - }; - - /** - * Get operational level total request and total failed requets by comparing the - * last saved data. - */ - protected final Func0<String> getTotalReqFailProdOperLevel = new Func0<String>() { - @Override - public String call() { - Map<String, Long> totalMap = new HashMap<>(); - Map<String, Long> oldMap = localMetrics.operMetricsTotalFailReq; - Map<String, Long> metricMap = new HashMap<>(); - for (MetricsDataMonitor metricsDataMonitor : metricsList) { - Collection<String> keySet = metricsDataMonitor.operMetricsTotalFailReq.keySet(); - for (String key : keySet) { - totalMap.merge(key, metricsDataMonitor.getOperMetTotalFailReq(key), (a, b) -> b + a); - } - } - Collection<String> keySet = totalMap.keySet(); - for (String key : keySet) { - if (oldMap.containsKey(key)) { - metricMap.put(key, totalMap.get(key) - oldMap.get(key)); - } else { - metricMap.put(key, totalMap.get(key)); - } - } - localMetrics.operMetricsTotalFailReq.putAll(totalMap); - return metricMap.toString(); - } - }; - - /** - * Get operational level/instance level queue related metrics by comparing the - * last saved data. - */ - protected final Func0<String> getQueueMetrics = new Func0<String>() { - @Override - public String call() { - Map<String, QueueMetricsData> totalMap = new HashMap<>(); - - for (MetricsDataMonitor metricsDataMonitor : metricsList) { - Collection<String> keySet = metricsDataMonitor.getQueueMetrics().keySet(); - for (String key : keySet) { - QueueMetricsData value = totalMap.get(key); - if (null == value) { - totalMap.put(key, metricsDataMonitor.getQueueMetrics().get(key)); - } else { - QueueMetricsData newValue = metricsDataMonitor.getQueueMetrics().get(key); - QueueMetricsData totalValue = new QueueMetricsData(); - totalValue.setCountInQueue(newValue.getCountInQueue() + value.getCountInQueue()); - totalValue.setTotalTime(newValue.getTotalTime() + value.getTotalTime()); - totalValue.setTotalCount(newValue.getTotalCount() + value.getTotalCount()); - totalValue - .setTotalServExecutionTime(newValue.getTotalServExecutionTime() + value.getTotalServExecutionTime()); - totalValue - .setTotalServExecutionCount(newValue.getTotalServExecutionCount() + value.getTotalServExecutionCount()); - if ((value.getMinLifeTimeInQueue() <= 0) - || (newValue.getMinLifeTimeInQueue() < value.getMinLifeTimeInQueue())) { - totalValue.setMinLifeTimeInQueue(newValue.getMinLifeTimeInQueue()); - } - newValue.resetMinLifeTimeInQueue(); - if ((value.getMaxLifeTimeInQueue() <= 0) - || (newValue.getMaxLifeTimeInQueue() > value.getMaxLifeTimeInQueue())) { - totalValue.setMaxLifeTimeInQueue(newValue.getMaxLifeTimeInQueue()); - } - newValue.resetMaxLifeTimeInQueue(); - totalMap.put(key, totalValue); - } - } - } - - Map<String, QueueMetricsData> oldMap = localMetrics.getQueueMetrics(); - Map<String, QueueMetricsData> metricMap = new HashMap<>(); - Map<String, String> result = new HashMap<>(); - Map<String, String> resultInstancePublishMap = new HashMap<>(); - - QueueMetricsData totalValueInstance = new QueueMetricsData(); - - Collection<String> keySet = totalMap.keySet(); - Map<String, String> resultMap; - - for (String key : keySet) { - resultMap = new HashMap<>(); - if (oldMap.containsKey(key)) { - QueueMetricsData newValue = new QueueMetricsData(); - QueueMetricsData totalValue = totalMap.get(key); - QueueMetricsData oldValue = oldMap.get(key); - newValue.setCountInQueue(totalValue.getCountInQueue()); - newValue.setTotalTime(totalValue.getTotalTime() - oldValue.getTotalTime()); - newValue.setTotalCount(totalValue.getTotalCount() - oldValue.getTotalCount()); - newValue - .setTotalServExecutionTime(totalValue.getTotalServExecutionTime() - oldValue.getTotalServExecutionTime()); - newValue.setTotalServExecutionCount( - totalValue.getTotalServExecutionCount() - oldValue.getTotalServExecutionCount()); - newValue.setMinLifeTimeInQueue(totalValue.getMinLifeTimeInQueue()); - newValue.setMaxLifeTimeInQueue(totalValue.getMaxLifeTimeInQueue()); - metricMap.put(key, newValue); - } else { - metricMap.put(key, totalMap.get(key)); - } - - resultMap.put("countInQueue", metricMap.get(key).getCountInQueue().toString()); - - long count = metricMap.get(key).getTotalCount(); - double avgTimeInQueue = 0; - if (count > 0) { - avgTimeInQueue = (double) metricMap.get(key).getTotalTime() / (double) count; - } - resultMap.put("AverageTimeInQueue", String.valueOf(avgTimeInQueue)); - long countService = metricMap.get(key).getTotalServExecutionCount(); - double avgServiceTimeInQueue = 0; - if (countService > 0) { - avgServiceTimeInQueue = (double) metricMap.get(key).getTotalServExecutionTime() / (double) countService; - } - resultMap.put("AverageServiceExecutionTime", String.valueOf(avgServiceTimeInQueue)); - resultMap.put("MinLifeTimeInQueue", metricMap.get(key).getMinLifeTimeInQueue().toString()); - resultMap.put("MaxLifeTimeInQueue", metricMap.get(key).getMaxLifeTimeInQueue().toString()); - - result.put(key, resultMap.toString()); - - //get the all values for instance level. - totalValueInstance.setCountInQueue(metricMap.get(key).getCountInQueue()); - totalValueInstance.setTotalTime(totalValueInstance.getTotalTime() + metricMap.get(key).getTotalTime()); - totalValueInstance.setTotalCount(totalValueInstance.getTotalCount() + metricMap.get(key).getTotalCount()); - totalValueInstance - .setTotalServExecutionTime( - totalValueInstance.getTotalServExecutionTime() + metricMap.get(key).getTotalServExecutionTime()); - totalValueInstance - .setTotalServExecutionCount( - totalValueInstance.getTotalServExecutionCount() + metricMap.get(key).getTotalServExecutionCount()); - - if (totalValueInstance.getMinLifeTimeInQueue() <= 0 - || metricMap.get(key).getMinLifeTimeInQueue() < totalValueInstance.getMinLifeTimeInQueue()) { - totalValueInstance.setMinLifeTimeInQueue(metricMap.get(key).getMinLifeTimeInQueue()); - } - if (totalValueInstance.getMaxLifeTimeInQueue() <= 0 - || totalMap.get(key).getMaxLifeTimeInQueue() > totalValueInstance.getMaxLifeTimeInQueue()) { - totalValueInstance.setMaxLifeTimeInQueue(metricMap.get(key).getMaxLifeTimeInQueue()); - } - - localMetrics.setQueueMetrics(new ConcurrentHashMap<>(totalMap)); - } - - //prepare the result map for instance level. - resultInstancePublishMap.put("countInQueue", totalValueInstance.getCountInQueue().toString()); - long countInst = totalValueInstance.getTotalCount(); - double avgTimeInQueueIns = 0; - if (countInst > 0) { - avgTimeInQueueIns = (double) totalValueInstance.getTotalTime() / (double) countInst; - } - resultInstancePublishMap.put("averageTimeInQueue", - String.format( - doubleStringFormatter, - round(avgTimeInQueueIns, doubleRoundPlaces))); - long countServiceInst = totalValueInstance.getTotalServExecutionCount(); - double avgServiceTimeInQueueInst = 0; - if (countServiceInst > 0) { - avgServiceTimeInQueueInst = (double) totalValueInstance.getTotalServExecutionTime() / (double) countServiceInst; - } - resultInstancePublishMap.put("averageServiceExecutionTime", - String.format( - doubleStringFormatter, - round(avgServiceTimeInQueueInst, doubleRoundPlaces))); - resultInstancePublishMap.put("minLifeTimeInQueue", totalValueInstance.getMinLifeTimeInQueue().toString()); - resultInstancePublishMap.put("maxLifeTimeInQueue", totalValueInstance.getMaxLifeTimeInQueue().toString()); - result.put("InstanceLevel", resultInstancePublishMap.toString()); - - return result.toString(); - } - }; - - /** - * Get CPU and memory information metrics. - */ - protected final Func0<String> getCpuAndMemory = new Func0<String>() { - @Override - public String call() { - Map<String, String> memoryMap = new HashMap<>(); - OperatingSystemMXBean osMxBean = ManagementFactory.getOperatingSystemMXBean(); - double cpu = osMxBean.getSystemLoadAverage(); - memoryMap.put("cpuLoad", String.format(doubleStringFormatter, round(cpu, doubleRoundPlaces))); - - ThreadMXBean threadmxBean = ManagementFactory.getThreadMXBean(); - int threadCount = threadmxBean.getThreadCount(); - memoryMap.put("cpuRunningThreads", String.valueOf(threadCount)); - - MemoryMXBean memBean = ManagementFactory.getMemoryMXBean(); - MemoryUsage memHeapUsage = memBean.getHeapMemoryUsage(); - MemoryUsage nonHeapUsage = memBean.getNonHeapMemoryUsage(); - memoryMap.put("heapInit", String.valueOf(memHeapUsage.getInit())); - memoryMap.put("heapMax", String.valueOf(memHeapUsage.getMax())); - memoryMap.put("heapCommit", String.valueOf(memHeapUsage.getCommitted())); - memoryMap.put("heapUsed", String.valueOf(memHeapUsage.getUsed())); - memoryMap.put("nonHeapInit", String.valueOf(nonHeapUsage.getInit())); - memoryMap.put("nonHeapMax", String.valueOf(nonHeapUsage.getMax())); - memoryMap.put("nonHeapCommit", String.valueOf(nonHeapUsage.getCommitted())); - memoryMap.put("nonHeapUsed", String.valueOf(nonHeapUsage.getUsed())); - return memoryMap.toString(); - } - }; - - /** - * Get TPS and latency for operational and instance level from hystrix. - */ - protected final Func0<String> getTpsAndLatency = new Func0<String>() { - @Override - public String call() { - List<TpsAndLatencyData> tpsAndLatencyData = HystrixCommandMetrics.getInstances() - .stream() - .map(instance -> new TpsAndLatencyData(instance.getRollingCount(HystrixEventType.SUCCESS), - instance.getRollingCount(HystrixEventType.FAILURE), instance.getExecutionTimeMean(), - instance.getProperties().metricsRollingStatisticalWindowInMilliseconds().get())) - .collect(Collectors.toList()); - return calculateTpsAndLatency(tpsAndLatencyData); - } - }; - - protected String calculateTpsAndLatency(List<TpsAndLatencyData> tpsAndLatencyData) { - Map<String, String> tpsAndLatencyMap = new HashMap<>(); - double insTotalTps = 0; - double insTotalLatency = 0; - long cumulativeTotalCount = 0; - for (TpsAndLatencyData data : tpsAndLatencyData) { - long totalCallCount = data.getSuccessCount() + data.getFailureCount(); - cumulativeTotalCount += totalCallCount; - double windowTime = - (double) data.getWindowInMilliseconds() / (double) 1000; - double qpsVal = (double) (totalCallCount) / windowTime; - insTotalTps += qpsVal; - insTotalLatency += data.getOperationLatency() * totalCallCount; - } - - double instanceLatency = insTotalLatency / (double) cumulativeTotalCount; - tpsAndLatencyMap.put("tps", String.format(doubleStringFormatter, round(insTotalTps, doubleRoundPlaces))); - tpsAndLatencyMap - .put("latency", String.format(doubleStringFormatter, round(instanceLatency, doubleRoundPlaces))); - return tpsAndLatencyMap.toString(); - } - - /** - * Implementation of request metrics with using servo gauge metric type. - */ - protected abstract class GaugeMetric extends AbstractMonitor<Number> implements Gauge<Number> { - - public GaugeMetric(MonitorConfig config) { - super(config.withAdditionalTag(DataSourceType.GAUGE)); - } - - @Override - public Number getValue(int n) { - return getValue(); - } - - @Override - public abstract Number getValue(); - } - - /** - * Implementation of queue average metrics with using servo information metric - * type. - */ - protected abstract class InformationalMetric extends AbstractMonitor<String> implements Informational { - public InformationalMetric(MonitorConfig config) { - super(config.withAdditionalTag(DataSourceType.INFORMATIONAL)); - } - - @Override - public String getValue(int n) { - return getValue(); - } - - @Override - public abstract String getValue(); - } - - /** - * Get the total requests and failed requests for instance level. - * - * @param metricsName Name of the metrics - * @param metricToEvaluate observable method to be called for preparation of metrics. - * @return Guage metrics - */ - protected Monitor<Number> getRequestValuesGaugeMonitor(final String metricsName, - final Func0<Number> metricToEvaluate) { - return new GaugeMetric(MonitorConfig.builder(metricsName).build()) { - - @Override - public Number getValue() { - return metricToEvaluate.call(); - } - }; - } - - /** - * Get the total requests and failed requests for each producer. - * - * @param metricsName Name of the metrics - * @param metricToEvaluate observable method to be called for preparation of metrics. - * @return Guage metrics - */ - protected Monitor<String> getInfoMetricsOperationLevel(final String metricsName, - final Func0<String> metricToEvaluate) { - return new InformationalMetric(MonitorConfig.builder(metricsName).build()) { - @Override - public String getValue() { - return metricToEvaluate.call(); - } - }; - } - - /** - * Get the total requests and failed requests for each producer. - * - * @param name Name of the metrics - * @param metricToEvaluate observable method to be called for preparation of metrics. - * @return Guage metrics - */ - protected Monitor<String> getInfoMetricsOperationalAndInstance(final String name, - final Func0<String> metricToEvaluate) { - return new InformationalMetric(MonitorConfig.builder(name).build()) { - @Override - public String getValue() { - return metricToEvaluate.call(); - } - }; - } - - /** - * Prepare the initial metrics. - * - * @return List of monitors - */ - public List<Monitor<?>> getMetricsMonitors() { - - List<Monitor<?>> monitors = new ArrayList<>(); - monitors.add(getRequestValuesGaugeMonitor("totalRequestsPerProvider INSTANCE_LEVEL", - getTotalReqProvider)); - - monitors.add(getRequestValuesGaugeMonitor("totalFailedRequestsPerProvider INSTANCE_LEVEL", - getTotalFailedReqProvider)); - - monitors.add(getRequestValuesGaugeMonitor("totalRequestsPerConsumer INSTANCE_LEVEL", - getTotalReqConsumer)); - - monitors.add(getRequestValuesGaugeMonitor("totalFailRequestsPerConsumer INSTANCE_LEVEL", - getFailedTotalReqConsumer)); - - monitors.add(getInfoMetricsOperationLevel("totalRequestProvider OPERATIONAL_LEVEL", - getTotalReqProdOperLevel)); - - monitors.add(getInfoMetricsOperationLevel("totalFailedRequestProvider OPERATIONAL_LEVEL", - getTotalReqFailProdOperLevel)); - - monitors.add(getInfoMetricsOperationalAndInstance("RequestQueueRelated", getQueueMetrics)); - - monitors.add(getInfoMetricsOperationalAndInstance("TPS and Latency", getTpsAndLatency)); - - monitors.add(getInfoMetricsOperationalAndInstance("CPU and Memory", getCpuAndMemory)); - - return monitors; - } - - private double round(double value, int places) { - if (!Double.isNaN(value)) { - BigDecimal decimal = new BigDecimal(value); - return decimal.setScale(places, RoundingMode.HALF_UP).doubleValue(); - } - return 0; - } -} diff --git a/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/TpsAndLatencyData.java b/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/TpsAndLatencyData.java deleted file mode 100644 index 84c2a80..0000000 --- a/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/TpsAndLatencyData.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * 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; - -public class TpsAndLatencyData { - private final long successCount; - - private final long failureCount; - - private final int operationLatency; - - private final long windowInMilliseconds; - - public long getSuccessCount() { - return successCount; - } - - public long getFailureCount() { - return failureCount; - } - - public int getOperationLatency() { - return operationLatency; - } - - public long getWindowInMilliseconds() { - return windowInMilliseconds; - } - - public TpsAndLatencyData(long successCount, long failureCount, int operationLatency, long windowInMilliseconds) { - this.successCount = successCount; - this.failureCount = failureCount; - this.operationLatency = operationLatency; - this.windowInMilliseconds = windowInMilliseconds; - } -} diff --git a/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/output/MetricsFileOutput.java b/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/output/MetricsFileOutput.java deleted file mode 100644 index 68c35bd..0000000 --- a/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/output/MetricsFileOutput.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * 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.output; - -import java.util.Map; - -import com.netflix.config.DynamicPropertyFactory; - -public abstract class MetricsFileOutput { - public static final String METRICS_FILE_ROOT_PATH = "servicecomb.metrics.file.root_path"; - - public static final String METRICS_FILE_NAME_PREFIX = "servicecomb.metrics.file.name_prefix"; - - public static final String METRICS_FILE_MAX_ROLLING_SIZE = "servicecomb.metrics.file.max_rolling_size"; - - public static final String METRICS_FILE_MAX_ROLLING_COUNT = "servicecomb.metrics.file.max_rolling_count"; - - - private final String rollingRootFilePath; - - private final String maxRollingFileSize; - - private final int maxRollingFileCount; - - private final String namePrefix; - - public String getRollingRootFilePath() { - return rollingRootFilePath; - } - - public String getMaxRollingFileSize() { - return maxRollingFileSize; - } - - public int getMaxRollingFileCount() { - return maxRollingFileCount; - } - - public String getNamePrefix() { - return namePrefix; - } - - public MetricsFileOutput() { - rollingRootFilePath = DynamicPropertyFactory.getInstance() - .getStringProperty(METRICS_FILE_ROOT_PATH, "target") - .get(); - namePrefix = DynamicPropertyFactory.getInstance().getStringProperty(METRICS_FILE_NAME_PREFIX, "metrics").get(); - maxRollingFileSize = DynamicPropertyFactory.getInstance() - .getStringProperty(METRICS_FILE_MAX_ROLLING_SIZE, "10MB") - .get(); - maxRollingFileCount = DynamicPropertyFactory.getInstance().getIntProperty(METRICS_FILE_MAX_ROLLING_COUNT, 10).get(); - } - - public abstract void output(Map<String, String> metrics); -} diff --git a/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/output/servo/FileOutputMetricObserver.java b/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/output/servo/FileOutputMetricObserver.java deleted file mode 100644 index bad984e..0000000 --- a/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/output/servo/FileOutputMetricObserver.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * 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.output.servo; - -import java.util.List; -import java.util.Map; - -import org.apache.servicecomb.foundation.metrics.output.MetricsFileOutput; - -import com.netflix.servo.Metric; -import com.netflix.servo.publish.BaseMetricObserver; -import com.netflix.servo.util.Preconditions; - -public class FileOutputMetricObserver extends BaseMetricObserver { - private final MetricsFileOutput metricsOutput; - - private final MetricsContentConvertor convertor; - - private final MetricsContentFormatter formatter; - - public FileOutputMetricObserver(MetricsFileOutput metricsOutput, - MetricsContentConvertor convertor, MetricsContentFormatter formatter) { - super("fileOutputObserver"); - this.metricsOutput = metricsOutput; - this.convertor = convertor; - this.formatter = formatter; - } - - @Override - public void updateImpl(List<Metric> metrics) { - Preconditions.checkNotNull(metrics, "metrics"); - //first convert metrics to Map<String,String> - Map<String, String> convertedMetrics = convertor.convert(metrics); - //second format output content style - Map<String, String> formattedMetrics = formatter.format(convertedMetrics); - //finally output to file - metricsOutput.output(formattedMetrics); - } -} - - diff --git a/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/output/servo/MetricsContentConvertor.java b/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/output/servo/MetricsContentConvertor.java deleted file mode 100644 index 0975271..0000000 --- a/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/output/servo/MetricsContentConvertor.java +++ /dev/null @@ -1,28 +0,0 @@ -/* - * 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.output.servo; - -import java.util.List; -import java.util.Map; - -import com.netflix.servo.Metric; - -//convert metrics to output content -public interface MetricsContentConvertor { - Map<String, String> convert(List<Metric> metrics); -} diff --git a/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/output/servo/MetricsContentFormatter.java b/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/output/servo/MetricsContentFormatter.java deleted file mode 100644 index bfb307f..0000000 --- a/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/output/servo/MetricsContentFormatter.java +++ /dev/null @@ -1,24 +0,0 @@ -/* - * 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.output.servo; - -import java.util.Map; - -public interface MetricsContentFormatter { - Map<String, String> format(Map<String, String> input); -} diff --git a/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/output/servo/MetricsObserverInitializer.java b/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/output/servo/MetricsObserverInitializer.java deleted file mode 100644 index 7162943..0000000 --- a/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/output/servo/MetricsObserverInitializer.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - * 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.output.servo; - -import java.util.concurrent.TimeUnit; - -import org.apache.servicecomb.foundation.metrics.output.MetricsFileOutput; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import com.netflix.config.DynamicPropertyFactory; -import com.netflix.servo.publish.BasicMetricFilter; -import com.netflix.servo.publish.CounterToRateMetricTransform; -import com.netflix.servo.publish.MetricObserver; -import com.netflix.servo.publish.MonitorRegistryMetricPoller; -import com.netflix.servo.publish.PollRunnable; -import com.netflix.servo.publish.PollScheduler; - -//manage and init ServoObservers -@Component -public class MetricsObserverInitializer { - - public static final String METRICS_POLL_TIME = "servicecomb.metrics.polltime"; - - public static final String METRICS_FILE_ENABLED = "servicecomb.metrics.file.enabled"; - - private final int metricPoll; - - private final MetricsFileOutput fileOutput; - - private final MetricsContentConvertor convertor; - - private final MetricsContentFormatter formatter; - - @Autowired - public MetricsObserverInitializer(MetricsFileOutput fileOutput, MetricsContentConvertor convertor, - MetricsContentFormatter formatter) { - this(fileOutput, convertor, formatter, true); - } - - public MetricsObserverInitializer(MetricsFileOutput fileOutput, MetricsContentConvertor convertor, - MetricsContentFormatter formatter, boolean autoInit) { - metricPoll = DynamicPropertyFactory.getInstance().getIntProperty(METRICS_POLL_TIME, 30).get(); - this.fileOutput = fileOutput; - this.convertor = convertor; - this.formatter = formatter; - if (autoInit) { - this.init(); - } - } - - public void init() { - PollScheduler scheduler = PollScheduler.getInstance(); - if (!scheduler.isStarted()) { - scheduler.start(); - } - - if (isRollingFileEnabled()) { - MetricObserver fileObserver = new FileOutputMetricObserver(fileOutput, convertor, formatter); - MetricObserver fileTransform = new CounterToRateMetricTransform(fileObserver, metricPoll, TimeUnit.SECONDS); - PollRunnable fileTask = new PollRunnable(new MonitorRegistryMetricPoller(), BasicMetricFilter.MATCH_ALL, - fileTransform); - scheduler.addPoller(fileTask, metricPoll, TimeUnit.SECONDS); - } - } - - public boolean isRollingFileEnabled() { - return DynamicPropertyFactory.getInstance().getBooleanProperty(METRICS_FILE_ENABLED, false).get(); - } -} diff --git a/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/output/servo/RollingMetricsFileOutput.java b/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/output/servo/RollingMetricsFileOutput.java deleted file mode 100644 index e930701..0000000 --- a/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/output/servo/RollingMetricsFileOutput.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * 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.output.servo; - -import java.util.Map; - -import org.apache.servicecomb.foundation.common.concurrent.ConcurrentHashMapEx; -import org.apache.servicecomb.foundation.metrics.output.MetricsFileOutput; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Component; - -@Component -public class RollingMetricsFileOutput extends MetricsFileOutput { - - private final Map<String, Logger> allLoggers = new ConcurrentHashMapEx<>(); - - public RollingMetricsFileOutput() { - } - - @Override - public void output(Map<String, String> metrics) { - for (String metricName : metrics.keySet()) { - Logger logger = allLoggers.computeIfAbsent(metricName, l -> LoggerFactory.getLogger(metricName)); - logger.trace(metrics.get(metricName)); - } - } -} diff --git a/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/output/servo/SimpleMetricsContentConvertor.java b/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/output/servo/SimpleMetricsContentConvertor.java deleted file mode 100644 index 550d19c..0000000 --- a/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/output/servo/SimpleMetricsContentConvertor.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * 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.output.servo; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.springframework.stereotype.Component; - -import com.netflix.servo.Metric; - -@Component -public class SimpleMetricsContentConvertor implements MetricsContentConvertor { - @Override - public Map<String, String> convert(List<Metric> metrics) { - Map<String, String> pickedMetrics = new HashMap<>(); - for (Metric metric : metrics) { - if (isTotalRequestInstanceLevelMetric(metric.getConfig().getName())) { - pickedMetrics.put(metric.getConfig().getName().replace(" INSTANCE_LEVEL", ""), metric.getValue().toString()); - } else if ("RequestQueueRelated".equals(metric.getConfig().getName())) { - String instanceContent = metric.getValue() - .toString() - .substring(metric.getValue().toString().indexOf("InstanceLevel={") + "InstanceLevel={".length()); - instanceContent = instanceContent.substring(0, instanceContent.indexOf('}')); - String[] keyAndValueStrings = instanceContent.split(","); - for (String keyAndValueString : keyAndValueStrings) { - String[] keyAndValue = keyAndValueString.split("="); - pickedMetrics.put(keyAndValue[0].trim(), keyAndValue[1].trim()); - } - } else if (isSystemOrTPSAndLatencyMetric(metric.getConfig().getName())) { - String instanceContent = metric.getValue().toString().substring(1, metric.getValue().toString().length() - 1); - String[] keyAndValueStrings = instanceContent.split(","); - for (String keyAndValueString : keyAndValueStrings) { - String[] keyAndValue = keyAndValueString.split("="); - pickedMetrics.put(keyAndValue[0].trim(), keyAndValue[1].trim()); - } - } - } - - return pickedMetrics; - } - - private boolean isTotalRequestInstanceLevelMetric(String metricName) { - return "totalRequestsPerProvider INSTANCE_LEVEL".equals(metricName) || - "totalFailedRequestsPerProvider INSTANCE_LEVEL".equals(metricName) || - "totalRequestsPerConsumer INSTANCE_LEVEL".equals(metricName) || - "totalFailRequestsPerConsumer INSTANCE_LEVEL".equals(metricName); - } - - private boolean isSystemOrTPSAndLatencyMetric(String metricName) { - return "CPU and Memory".equals(metricName) || - "TPS and Latency".equals(metricName); - } -} diff --git a/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/output/servo/SimpleMetricsContentFormatter.java b/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/output/servo/SimpleMetricsContentFormatter.java deleted file mode 100644 index ab58702..0000000 --- a/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/output/servo/SimpleMetricsContentFormatter.java +++ /dev/null @@ -1,97 +0,0 @@ -/* - * 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.output.servo; - -import java.util.HashMap; -import java.util.Map; -import java.util.Map.Entry; -import java.util.stream.Collectors; - -import org.apache.servicecomb.foundation.common.net.NetUtils; -import org.apache.servicecomb.foundation.common.utils.JsonUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Component; -import org.springframework.util.StringUtils; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.netflix.config.DynamicPropertyFactory; - -@Component -public class SimpleMetricsContentFormatter implements MetricsContentFormatter { - - public static final String METRICS_FILE_NAME_PREFIX = "servicecomb.metrics.file.name_prefix"; - - private static final Logger logger = LoggerFactory.getLogger(SimpleMetricsContentFormatter.class); - - private final String applicationName; - - private String hostName; - - public SimpleMetricsContentFormatter() { - hostName = NetUtils.getHostName(); - if (StringUtils.isEmpty(hostName)) { - hostName = NetUtils.getHostAddress(); - } - - applicationName = DynamicPropertyFactory.getInstance().getStringProperty(METRICS_FILE_NAME_PREFIX, "metrics").get(); - } - - @Override - public Map<String, String> format(Map<String, String> input) { - return input.entrySet() - .stream() - .collect(Collectors.toMap(Entry::getKey, entry -> { - try { - return JsonUtils - .writeValueAsString(new OutputJsonObject(applicationName, hostName, entry.getKey(), entry.getValue())); - } catch (JsonProcessingException e) { - logger.error("error convert metrics data to json convert", e); - return ""; - } - })); - } - - class OutputJsonObject { - private String plugin_id; - - private Map<String, Object> metric; - - public String getPlugin_id() { - return plugin_id; - } - - public Map<String, Object> getMetric() { - return metric; - } - - public OutputJsonObject() { - } - - public OutputJsonObject(String plugin_id, String hostName, String metricName, String metricValue) { - this(); - this.plugin_id = plugin_id; - this.metric = new HashMap<>(); - this.metric.put("node", hostName); - this.metric.put("scope_name", ""); - this.metric.put("timestamp", System.currentTimeMillis()); - this.metric.put("inface_name", ""); - this.metric.put(metricName, metricValue); - } - } -} diff --git a/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/performance/MetricsDataMonitor.java b/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/performance/MetricsDataMonitor.java deleted file mode 100644 index 8deb581..0000000 --- a/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/performance/MetricsDataMonitor.java +++ /dev/null @@ -1,240 +0,0 @@ -/* - * 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.performance; - -import java.util.Map; - -import org.apache.servicecomb.foundation.common.concurrent.ConcurrentHashMapEx; - -/** - * Implements the collection of metrics such as total request, total fail - * request and average times for requests. - */ -public class MetricsDataMonitor { - - // inc - // invocation start - // succ + fail - public Long totalReqProvider = 0L; - - // inc - // after invocation finished - public Long totalFailReqProvider = 0L; - - // inc - // after invocation start - public Long totalReqConsumer = 0L; - - // inc - // after invocation finished - public Long totalFailReqConsumer = 0L; - - // key is operQualifiedName - // inc - // after invocation finished - public Map<String, Long> operMetricsTotalReq = new ConcurrentHashMapEx<>(); - - // key is operQualifiedName - // inc - // after invocation finished - public Map<String, Long> operMetricsTotalFailReq = new ConcurrentHashMapEx<>(); - - // key is operQualifiedName - public Map<String, QueueMetricsData> queueMetrics = new ConcurrentHashMapEx<>(); - - /** - * default constructor. - */ - public MetricsDataMonitor() { - - } - - /** - * Returns the map of average values for both instance and operational level. - * - * @param pathId Operation path id - * @return QueueMetrics object based on key - */ - public QueueMetricsData getOrCreateQueueMetrics(String pathId) { - return queueMetrics.computeIfAbsent(pathId, p -> new QueueMetricsData()); - } - - /** - * Returns the map of average values for both instance and operational level. - * - * @return queue metrics map - */ - public Map<String, QueueMetricsData> getQueueMetrics() { - return queueMetrics; - } - - /** - * Returns the map of average values for both instance and operational level. - * - * @param newMap the new map which passed to queue metrics - */ - public void setQueueMetrics(Map<String, QueueMetricsData> newMap) { - queueMetrics = newMap; - } - - /** - * Sets the map of average values for both instance and operational levels. - * - * @param pathId Operation path id - * @param reqQueue RequestQueue - */ - public void setQueueMetrics(String pathId, QueueMetricsData reqQueue) { - this.queueMetrics.put(pathId, reqQueue); - } - - /** - * Returns the total requests per provider. - * - * @return long total requests for provider - */ - public long getTotalReqProvider() { - return totalReqProvider; - } - - /** - * Increments the total requests per provider. - */ - public void incrementTotalReqProvider() { - this.totalReqProvider++; - } - - /** - * Sets the total requests per provider. - * @param totalReqProvider the total requests per provider - */ - public void setTotalReqProvider(Long totalReqProvider) { - this.totalReqProvider = totalReqProvider; - } - - /** - * Returns the total fail requests per provider. - * - * @return long total failed requests for provider - */ - public long getTotalFailReqProvider() { - return totalFailReqProvider; - } - - /** - * Sets the total fail requests per provider. - */ - public void incrementTotalFailReqProvider() { - this.totalFailReqProvider++; - } - - /** - * Sets the total failed requests per provider. - * @param totalFailedReqProvider the total failed requests per provider - */ - public void setTotalFailReqProvider(Long totalFailedReqProvider) { - this.totalFailReqProvider = totalFailedReqProvider; - } - - /** - * Returns the total requests per consumer. - * - * @return long total requests for consumer - */ - public long getTotalReqConsumer() { - return totalReqConsumer; - } - - /** - * Sets the total requests per consumer. - */ - public void incrementTotalReqConsumer() { - this.totalReqConsumer++; - } - - /** - * Sets the total failed requests per consumer. - * @param totalReqConsumer the total requests per consumer - */ - public void setTotalReqConsumer(Long totalReqConsumer) { - this.totalReqConsumer = totalReqConsumer; - } - - /** - * Returns the total fail requests per consumer. - * - * @return long total failed request for consumer - */ - public long getTotalFailReqConsumer() { - return totalFailReqConsumer; - } - - /** - * Sets the total fail requests per consumer. - */ - public void incrementTotalFailReqConsumer() { - this.totalFailReqConsumer++; - } - - /** - * Sets the total failed requests per consumer. - * @param totalFailedReqConsumer the total failed requests per consumer - */ - public void setTotalFailReqConsumer(Long totalFailedReqConsumer) { - this.totalFailReqConsumer = totalFailedReqConsumer; - } - - /** - * Returns total requests per provider for operational level. - * - * @param key Operation path id - * @return long total requests per provider - */ - public Long getOperMetTotalReq(String key) { - return operMetricsTotalReq.get(key); - } - - /** - * Sets total requests per provider for operational level. - * - * @param key pathId - * @param val total requests per provider - */ - public void setOperMetTotalReq(String key, Long val) { - this.operMetricsTotalReq.put(key, val); - } - - /** - * Returns total fail requests per provider for operational level. - * - * @param key Operation path id - * @return long total fail requests per provider - */ - public Long getOperMetTotalFailReq(String key) { - return operMetricsTotalFailReq.get(key); - } - - /** - * Sets total fail requests per provider for operational level. - * - * @param key Operation path id - * @param val total fail requests per provider - */ - public void setOperMetTotalFailReq(String key, Long val) { - this.operMetricsTotalFailReq.put(key, val); - } -} diff --git a/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/performance/MetricsDataMonitorUtil.java b/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/performance/MetricsDataMonitorUtil.java deleted file mode 100644 index a7a18bd..0000000 --- a/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/performance/MetricsDataMonitorUtil.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * 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.performance; - -import org.apache.servicecomb.foundation.metrics.MetricsServoRegistry; - -/** - * Implementation of metric util functions such as preparing average queue times - * and total requests/fail for producer and instance level. - */ -public final class MetricsDataMonitorUtil { - - /* - * Sets the total requests per provider and consumer. - */ - public void setAllReqProviderAndConsumer(String operationPath, String invocationType) { - MetricsDataMonitor metricsRef = MetricsServoRegistry.getOrCreateLocalMetrics(); - if ("CONSUMER".equals(invocationType)) { - metricsRef.incrementTotalReqConsumer(); - } else { - metricsRef.incrementTotalReqProvider(); - // note down metrics for operational level. - metricsRef.setOperMetTotalReq(operationPath, - metricsRef.getOperMetTotalReq(operationPath) == null ? 1L : metricsRef.getOperMetTotalReq(operationPath) + 1); - } - } - - /* - * Sets the total failed requests per provider and consumer. - */ - public void setAllFailReqProviderAndConsumer(String operationPath, String invocationType) { - MetricsDataMonitor metricsRef = MetricsServoRegistry.getOrCreateLocalMetrics(); - if ("CONSUMER".equals(invocationType)) { - metricsRef.incrementTotalFailReqConsumer(); - } else { - metricsRef.incrementTotalFailReqProvider(); - // note down metrics for operational level. - metricsRef.setOperMetTotalReq(operationPath, - metricsRef.getOperMetTotalReq(operationPath) == null ? 1L : metricsRef.getOperMetTotalReq(operationPath) + 1); - } - } -} diff --git a/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/performance/QueueMetrics.java b/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/performance/QueueMetrics.java deleted file mode 100644 index e1c9501..0000000 --- a/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/performance/QueueMetrics.java +++ /dev/null @@ -1,98 +0,0 @@ -/* - * 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.performance; - -import java.util.concurrent.atomic.AtomicLong; - -/** - * Used to store invocation specific metrics for queue. - */ -public class QueueMetrics { - - private AtomicLong queueStartTime = new AtomicLong(); - - private AtomicLong endOperTime = new AtomicLong(); - - private AtomicLong queueEndTime = new AtomicLong(); - - private String operQualifiedName; - - /** - * Returns the time when it enters the queue. - * @return long - */ - public long getQueueStartTime() { - return queueStartTime.get(); - } - - /** - * Sets the time when it enters the queue. - * @param startTime Entering time in queue - */ - public void setQueueStartTime(long startTime) { - this.queueStartTime.set(startTime); - } - - /** - * Returns the time when the operation ends. - * @return long - */ - public long getEndOperTime() { - return endOperTime.get(); - } - - /** - * Sets the time when the operation ends. - * @param stopOperTime Start time of operation - */ - public void setEndOperTime(long stopOperTime) { - this.endOperTime.set(stopOperTime); - } - - /** - * Returns the time when it leaves the queue. - * @return long - */ - public long getQueueEndTime() { - return queueEndTime.get(); - } - - /** - * Sets the time when it leaves the queue. - * @param endTime Leaving time from queue - */ - public void setQueueEndTime(long endTime) { - this.queueEndTime.set(endTime); - } - - /** - * Get the microservice qualified name. - * @return microservice qualified name - */ - public String getOperQualifiedName() { - return operQualifiedName; - } - - /** - * Set the microservice qualified name. - * @param operQualifiedName microservice qualified name - */ - public void setOperQualifiedName(String operQualifiedName) { - this.operQualifiedName = operQualifiedName; - } -} diff --git a/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/performance/QueueMetricsData.java b/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/performance/QueueMetricsData.java deleted file mode 100644 index 20c4ad6..0000000 --- a/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/performance/QueueMetricsData.java +++ /dev/null @@ -1,215 +0,0 @@ -/* - * 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.performance; - -/** - * Used for holding the request queue related timings like start time, operation time and end time. - */ -public class QueueMetricsData { - - // after invocation polled from queue - private Long totalTime = 0L; - - // succ and fail - // after invocation polled from queue - private Long totalCount = 0L; - - // after invocation finished - private Long totalServExecutionTime = 0L; - - // after invocation finished - private Long totalServExecutionCount = 0L; - - // inc and dec - // addToQueue inc - // pollFromQueue inc - // pollFromQueue - addToQueue = countInQueue - // after invocation polled from queue - private Long countInQueue = 0L; - - // after invocation polled from queue - private Long minLifeTimeInQueue = 0L; - - // after invocation polled from queue - private Long maxLifeTimeInQueue = 0L; - - /** - * Sets total count in queue. - */ - public void incrementCountInQueue() { - this.countInQueue++; - } - - /** - * Deletes total count in queue. - */ - public void decrementCountInQueue() { - this.countInQueue--; - } - - /** - * default constructor. - */ - public QueueMetricsData() { - - } - - /** - * Returns the count for calculating average count value in queue. - * @return Long - */ - public Long getTotalTime() { - return totalTime; - } - - /** - * Sets the total time for calculating average time in queue. - * @param totalTime total time value - */ - public void setTotalTime(long totalTime) { - this.totalTime = totalTime; - } - - /** - * Returns the total count for calculating average count value in queue. - * @return Long - */ - public Long getTotalCount() { - return totalCount; - } - - /** - * Sets the total count for calculating average count value in queue. - */ - public void incrementTotalCount() { - this.totalCount++; - } - - /** - * Sets the total count for calculating average count value in queue. - * @param totalCount total count - */ - public void setTotalCount(long totalCount) { - this.totalCount = totalCount; - } - - /** - * Returns the count for calculating average value of working time after queue. - * @return Long - */ - public Long getTotalServExecutionTime() { - return totalServExecutionTime; - } - - /** - * Sets the count for calculating average value of working time after queue. - * @param totalCountAfterQueue count value - */ - public void setTotalServExecutionTime(long totalCountAfterQueue) { - this.totalServExecutionTime = totalCountAfterQueue; - } - - /** - * Returns the total count for calculating average value of working time after queue. - * @return Long - */ - public Long getTotalServExecutionCount() { - return totalServExecutionCount; - } - - /** - * Sets the total count for calculating average value of working time after queue. - */ - public void incrementTotalServExecutionCount() { - this.totalServExecutionCount++; - } - - /** - * Sets the total count for calculating average value of working time after queue. - * @param totalServExecutionCount total service execution time count - */ - public void setTotalServExecutionCount(long totalServExecutionCount) { - this.totalServExecutionCount = totalServExecutionCount; - } - - /** - * Returns total count in queue. - * @return Long - */ - public Long getCountInQueue() { - return countInQueue; - } - - /** - * Returns total count in queue. - * @param countInQueue queue count - */ - public void setCountInQueue(long countInQueue) { - this.countInQueue = countInQueue; - } - - /** - * Returns the minimum lifetime in queue. - * @return Long - */ - public Long getMinLifeTimeInQueue() { - return minLifeTimeInQueue; - } - - /** - * Sets the minimum lifetime in queue. - * @param minLifeTimeInQueue minimum lifetime - */ - public void setMinLifeTimeInQueue(long minLifeTimeInQueue) { - if ((this.minLifeTimeInQueue <= 0) || (minLifeTimeInQueue < this.minLifeTimeInQueue)) { - this.minLifeTimeInQueue = minLifeTimeInQueue; - } - } - - /** - * Returns maximum lifetime in queue. - * @return Long - */ - public Long getMaxLifeTimeInQueue() { - return maxLifeTimeInQueue; - } - - /** - * Sets maximum lifetime in queue. - * @param maxLifeTimeInQueue maximum lifetime - */ - public void setMaxLifeTimeInQueue(long maxLifeTimeInQueue) { - if ((this.maxLifeTimeInQueue <= 0) || (maxLifeTimeInQueue > this.maxLifeTimeInQueue)) { - this.maxLifeTimeInQueue = maxLifeTimeInQueue; - } - } - - /** - * Resets minimum lifetime in queue. - */ - public void resetMinLifeTimeInQueue() { - this.minLifeTimeInQueue = 0L; - } - - /** - * Resets maximum lifetime in queue. - */ - public void resetMaxLifeTimeInQueue() { - this.maxLifeTimeInQueue = 0L; - } -} diff --git a/foundations/foundation-metrics/src/test/java/org/apache/servicecomb/foundation/metrics/TestFileOutputMetricObserverAndContentConvertor.java b/foundations/foundation-metrics/src/test/java/org/apache/servicecomb/foundation/metrics/TestFileOutputMetricObserverAndContentConvertor.java deleted file mode 100644 index e11ad3f..0000000 --- a/foundations/foundation-metrics/src/test/java/org/apache/servicecomb/foundation/metrics/TestFileOutputMetricObserverAndContentConvertor.java +++ /dev/null @@ -1,131 +0,0 @@ -/* - * 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 static org.mockito.Mockito.mock; -import static org.mockito.Mockito.verify; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.apache.servicecomb.foundation.metrics.output.MetricsFileOutput; -import org.apache.servicecomb.foundation.metrics.output.servo.FileOutputMetricObserver; -import org.apache.servicecomb.foundation.metrics.output.servo.MetricsContentFormatter; -import org.apache.servicecomb.foundation.metrics.output.servo.SimpleMetricsContentConvertor; -import org.junit.Assert; -import org.junit.Test; -import org.mockito.ArgumentCaptor; - -import com.netflix.servo.Metric; -import com.netflix.servo.monitor.MonitorConfig; - -public class TestFileOutputMetricObserverAndContentConvertor { - @SuppressWarnings("unchecked") - @Test - public void testMetricObserverUpdateImpl() { - - MetricsFileOutput output = mock(MetricsFileOutput.class); - SimpleMetricsContentConvertor convertor = new SimpleMetricsContentConvertor(); - MetricsContentFormatter formatter = new MetricsContentFormatter() { - @Override - public Map<String, String> format(Map<String, String> input) { - return input; - } - }; - - List<Metric> metrics = new ArrayList<>(); - metrics.add( - new Metric(MonitorConfig.builder("totalRequestsPerProvider INSTANCE_LEVEL").build(), System.currentTimeMillis(), - "1")); - metrics.add(new Metric(MonitorConfig.builder("totalFailedRequestsPerProvider INSTANCE_LEVEL").build(), - System.currentTimeMillis(), "2")); - metrics.add( - new Metric(MonitorConfig.builder("totalRequestsPerConsumer INSTANCE_LEVEL").build(), System.currentTimeMillis(), - "3")); - metrics.add(new Metric(MonitorConfig.builder("totalFailRequestsPerConsumer INSTANCE_LEVEL").build(), - System.currentTimeMillis(), "4")); - metrics.add( - new Metric(MonitorConfig.builder("totalRequestProvider OPERATIONAL_LEVEL").build(), System.currentTimeMillis(), - "totalRequestProvider")); - metrics.add(new Metric(MonitorConfig.builder("totalFailedRequestProvider OPERATIONAL_LEVEL").build(), - System.currentTimeMillis(), "totalFailedRequestProvider")); - metrics.add(new Metric(MonitorConfig.builder("RequestQueueRelated").build(), System.currentTimeMillis(), - "{InstanceLevel={averageServiceExecutionTime=1.0, countInQueue=2, minLifeTimeInQueue=3, averageTimeInQueue=4.0, maxLifeTimeInQueue=5}}")); - metrics.add(new Metric(MonitorConfig.builder("TPS and Latency").build(), System.currentTimeMillis(), - "{latency=100, tps=200}")); - metrics.add(new Metric(MonitorConfig.builder("CPU and Memory").build(), System.currentTimeMillis(), - "{heapUsed=146120664, nonHeapUsed=55146864, cpuRunningThreads=36, heapMax=3786407936, heapCommit=472907776, nonHeapInit=2555904, nonHeapMax=-1, cpuLoad=-1.0, heapInit=266338304, nonHeapCommit=56623104}")); - - FileOutputMetricObserver observer = new FileOutputMetricObserver(output, convertor, formatter); - observer.updateImpl(metrics); - - @SuppressWarnings("rawtypes") - ArgumentCaptor<Map> outputMetrics = ArgumentCaptor.forClass(Map.class); - verify(output).output(outputMetrics.capture()); - - HashMap<String, String> result = (HashMap<String, String>) outputMetrics.getValue(); - - Assert.assertTrue(result.containsKey("totalRequestsPerProvider")); - Assert.assertTrue(result.get("totalRequestsPerProvider").equals("1")); - Assert.assertTrue(result.containsKey("totalFailedRequestsPerProvider")); - Assert.assertTrue(result.get("totalFailedRequestsPerProvider").equals("2")); - Assert.assertTrue(result.containsKey("totalRequestsPerConsumer")); - Assert.assertTrue(result.get("totalRequestsPerConsumer").equals("3")); - Assert.assertTrue(result.containsKey("totalFailRequestsPerConsumer")); - Assert.assertTrue(result.get("totalFailRequestsPerConsumer").equals("4")); - - Assert.assertTrue(result.containsKey("averageServiceExecutionTime")); - Assert.assertTrue(result.get("averageServiceExecutionTime").equals("1.0")); - Assert.assertTrue(result.containsKey("countInQueue")); - Assert.assertTrue(result.get("countInQueue").equals("2")); - Assert.assertTrue(result.containsKey("minLifeTimeInQueue")); - Assert.assertTrue(result.get("minLifeTimeInQueue").equals("3")); - Assert.assertTrue(result.containsKey("averageTimeInQueue")); - Assert.assertTrue(result.get("averageTimeInQueue").equals("4.0")); - Assert.assertTrue(result.containsKey("maxLifeTimeInQueue")); - Assert.assertTrue(result.get("maxLifeTimeInQueue").equals("5")); - - Assert.assertTrue(result.containsKey("latency")); - Assert.assertTrue(result.get("latency").equals("100")); - Assert.assertTrue(result.containsKey("tps")); - Assert.assertTrue(result.get("tps").equals("200")); - - Assert.assertTrue(result.containsKey("heapUsed")); - Assert.assertTrue(result.get("heapUsed").equals("146120664")); - Assert.assertTrue(result.containsKey("nonHeapUsed")); - Assert.assertTrue(result.get("nonHeapUsed").equals("55146864")); - Assert.assertTrue(result.containsKey("cpuRunningThreads")); - Assert.assertTrue(result.get("cpuRunningThreads").equals("36")); - Assert.assertTrue(result.containsKey("heapMax")); - Assert.assertTrue(result.get("heapMax").equals("3786407936")); - Assert.assertTrue(result.containsKey("heapCommit")); - Assert.assertTrue(result.get("heapCommit").equals("472907776")); - Assert.assertTrue(result.containsKey("nonHeapInit")); - Assert.assertTrue(result.get("nonHeapInit").equals("2555904")); - Assert.assertTrue(result.containsKey("nonHeapMax")); - Assert.assertTrue(result.get("nonHeapMax").equals("-1")); - Assert.assertTrue(result.containsKey("cpuLoad")); - Assert.assertTrue(result.get("cpuLoad").equals("-1.0")); - Assert.assertTrue(result.containsKey("heapInit")); - Assert.assertTrue(result.get("heapInit").equals("266338304")); - Assert.assertTrue(result.containsKey("nonHeapCommit")); - Assert.assertTrue(result.get("nonHeapCommit").equals("56623104")); - } -} diff --git a/foundations/foundation-metrics/src/test/java/org/apache/servicecomb/foundation/metrics/TestMetricsServoRegistry.java b/foundations/foundation-metrics/src/test/java/org/apache/servicecomb/foundation/metrics/TestMetricsServoRegistry.java deleted file mode 100644 index c595ba2..0000000 --- a/foundations/foundation-metrics/src/test/java/org/apache/servicecomb/foundation/metrics/TestMetricsServoRegistry.java +++ /dev/null @@ -1,220 +0,0 @@ -/* - * 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.List; -import java.util.Map; - -import org.apache.commons.configuration.BaseConfiguration; -import org.apache.servicecomb.foundation.metrics.output.MetricsFileOutput; -import org.apache.servicecomb.foundation.metrics.output.servo.MetricsContentConvertor; -import org.apache.servicecomb.foundation.metrics.output.servo.MetricsContentFormatter; -import org.apache.servicecomb.foundation.metrics.output.servo.MetricsObserverInitializer; -import org.apache.servicecomb.foundation.metrics.output.servo.RollingMetricsFileOutput; -import org.apache.servicecomb.foundation.metrics.output.servo.SimpleMetricsContentConvertor; -import org.apache.servicecomb.foundation.metrics.output.servo.SimpleMetricsContentFormatter; -import org.apache.servicecomb.foundation.metrics.performance.MetricsDataMonitor; -import org.apache.servicecomb.foundation.metrics.performance.QueueMetricsData; -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; - -import com.netflix.config.DynamicPropertyFactory; -import com.netflix.servo.publish.PollScheduler; - -public class TestMetricsServoRegistry { - MetricsDataMonitor metricsDataMonitor = null; - - MetricsDataMonitor localData = null; - - MetricsServoRegistry metricsRegistry = null; - - MetricsFileOutput fileOutput = null; - - MetricsContentConvertor convertor = null; - - MetricsContentFormatter formatter = null; - - MetricsObserverInitializer observerManager = null; - - @BeforeClass - public static void staticBeforeClean() { - BaseConfiguration configuration = new BaseConfiguration(); - configuration.setProperty(MetricsObserverInitializer.METRICS_FILE_ENABLED, true); - configuration.setProperty(MetricsObserverInitializer.METRICS_POLL_TIME, 1); - DynamicPropertyFactory.initWithConfigurationSource(configuration); - MetricsServoRegistry.metricsList.clear(); - MetricsServoRegistry.LOCAL_METRICS_MAP = new ThreadLocal<>(); - } - - @Before - public void setUp() throws Exception { - metricsRegistry = new MetricsServoRegistry(); - convertor = new SimpleMetricsContentConvertor(); - formatter = new SimpleMetricsContentFormatter(); - fileOutput = new RollingMetricsFileOutput(); - observerManager = new MetricsObserverInitializer(fileOutput, convertor, formatter, false); - localData = metricsRegistry.getLocalMetrics(); - metricsDataMonitor = MetricsServoRegistry.getOrCreateLocalMetrics(); - } - - @After - public void tearDown() throws Exception { - PollScheduler.getInstance().stop(); - metricsRegistry = null; - convertor = null; - formatter = null; - observerManager = null; - fileOutput = null; - localData = null; - metricsDataMonitor = null; - } - - @Test - public void testAllRegistryMetrics() throws Exception { - - metricsDataMonitor.incrementTotalReqProvider(); - metricsDataMonitor.incrementTotalFailReqProvider(); - metricsDataMonitor.incrementTotalReqConsumer(); - metricsDataMonitor.incrementTotalFailReqConsumer(); - metricsDataMonitor.setOperMetTotalReq("sayHi", 20L); - metricsDataMonitor.setOperMetTotalFailReq("sayHi", 20L); - localData = metricsRegistry.getLocalMetrics(); - localData.setOperMetTotalReq("sayHi", 10L); - localData.setOperMetTotalFailReq("sayHi", 10L); - - metricsRegistry.afterPropertiesSet(); - observerManager.init(); - Thread.sleep(1000); - // get the metrics from local data and compare - localData = metricsRegistry.getLocalMetrics(); - Assert.assertEquals(1, localData.getTotalReqProvider()); - Assert.assertEquals(1, localData.getTotalFailReqProvider()); - Assert.assertEquals(1, localData.getTotalReqConsumer()); - Assert.assertEquals(1, localData.getTotalFailReqConsumer()); - Assert.assertEquals(20L, localData.getOperMetTotalReq("sayHi").longValue()); - Assert.assertEquals(20L, localData.getOperMetTotalFailReq("sayHi").longValue()); - - MetricsDataMonitor localData1 = metricsRegistry.getLocalMetrics(); - Assert.assertEquals(20L, localData1.getOperMetTotalReq("sayHi").longValue()); - Assert.assertEquals(20L, localData1.getOperMetTotalFailReq("sayHi").longValue()); - } - - @Test - public void testOperationalProviderMetrics() throws Exception { - MetricsDataMonitor metricsDataMonitor = MetricsServoRegistry.getOrCreateLocalMetrics(); - metricsDataMonitor.setOperMetTotalReq("sayHi", 20L); - metricsDataMonitor.setOperMetTotalFailReq("sayHi", 20L); - localData = metricsRegistry.getLocalMetrics(); - - metricsRegistry.afterPropertiesSet(); - observerManager.init(); - Thread.sleep(1000); - // get the metrics from local data and compare - localData = metricsRegistry.getLocalMetrics(); - Assert.assertEquals(1, localData.getTotalReqProvider()); - Assert.assertEquals(1, localData.getTotalFailReqProvider()); - Assert.assertEquals(1, localData.getTotalReqConsumer()); - Assert.assertEquals(1, localData.getTotalFailReqConsumer()); - Assert.assertEquals(20L, localData.getOperMetTotalReq("sayHi").longValue()); - Assert.assertEquals(20L, localData.getOperMetTotalFailReq("sayHi").longValue()); - - MetricsDataMonitor localData1 = metricsRegistry.getLocalMetrics(); - Assert.assertEquals(20L, localData1.getOperMetTotalReq("sayHi").longValue()); - Assert.assertEquals(20L, localData1.getOperMetTotalFailReq("sayHi").longValue()); - } - - @Test - public void testQueueMetrics() throws Exception { - QueueMetricsData reqQueue1 = new QueueMetricsData(); - reqQueue1.setCountInQueue(1); - reqQueue1.setMaxLifeTimeInQueue(2); - reqQueue1.setMinLifeTimeInQueue(1); - reqQueue1.setTotalCount(10); - reqQueue1.setTotalTime(100); - reqQueue1.setTotalServExecutionCount(5); - reqQueue1.setTotalServExecutionTime(50); - metricsDataMonitor.setQueueMetrics("/sayBye", reqQueue1); - - metricsRegistry.afterPropertiesSet(); - observerManager.init(); - Thread.sleep(1000); - // get the metrics from local data and compare - Map<String, QueueMetricsData> localMap = localData.getQueueMetrics(); - QueueMetricsData reqQueue2 = localMap.get("/sayBye"); - - Assert.assertEquals(1L, reqQueue2.getCountInQueue().longValue()); - Assert.assertEquals(1L, reqQueue2.getMinLifeTimeInQueue().longValue()); - Assert.assertEquals(2L, reqQueue2.getMaxLifeTimeInQueue().longValue()); - Assert.assertEquals(10L, reqQueue2.getTotalCount().longValue()); - Assert.assertEquals(100L, reqQueue2.getTotalTime().longValue()); - Assert.assertEquals(5, reqQueue2.getTotalServExecutionCount().longValue()); - Assert.assertEquals(50, reqQueue2.getTotalServExecutionTime().longValue()); - } - - @Test - public void testQueueMetrics1() throws Exception { - QueueMetricsData reqQueue1 = new QueueMetricsData(); - reqQueue1.setCountInQueue(10); - reqQueue1.setMaxLifeTimeInQueue(2); - reqQueue1.setMinLifeTimeInQueue(2); - reqQueue1.setTotalCount(1); - reqQueue1.setTotalTime(10); - reqQueue1.setTotalServExecutionCount(1); - reqQueue1.setTotalServExecutionTime(1); - localData.setQueueMetrics("/sayBye", reqQueue1); - - QueueMetricsData reqQueue2 = new QueueMetricsData(); - reqQueue2.setCountInQueue(10); - reqQueue2.setMaxLifeTimeInQueue(2); - reqQueue2.setMinLifeTimeInQueue(2); - reqQueue2.setTotalCount(10); - reqQueue2.setTotalTime(100); - reqQueue2.setTotalServExecutionCount(5); - reqQueue2.setTotalServExecutionTime(50); - metricsDataMonitor.setQueueMetrics("/sayBye", reqQueue2); - - metricsRegistry.afterPropertiesSet(); - observerManager.init(); - Thread.sleep(1000); - // get the metrics from local data and compare - Map<String, QueueMetricsData> localMap = localData.getQueueMetrics(); - QueueMetricsData reqQueue3 = localMap.get("/sayBye"); - - Assert.assertEquals(10L, reqQueue3.getCountInQueue().longValue()); - Assert.assertEquals(2L, reqQueue3.getMinLifeTimeInQueue().longValue()); - Assert.assertEquals(2L, reqQueue3.getMaxLifeTimeInQueue().longValue()); - Assert.assertEquals(10L, reqQueue3.getTotalCount().longValue()); - Assert.assertEquals(100L, reqQueue3.getTotalTime().longValue()); - Assert.assertEquals(5L, reqQueue3.getTotalServExecutionCount().longValue()); - Assert.assertEquals(50L, reqQueue3.getTotalServExecutionTime().longValue()); - } - - @Test - public void testCalculateTps() { - observerManager.init(); - List<TpsAndLatencyData> tpsAndLatencyData = new ArrayList<>(); - tpsAndLatencyData.add(new TpsAndLatencyData(1, 1, 100, 100)); - tpsAndLatencyData.add(new TpsAndLatencyData(2, 2, 200, 200)); - String results = metricsRegistry.calculateTpsAndLatency(tpsAndLatencyData); - Assert.assertTrue("{tps=40.0, latency=166.7}".equals(results)); - } -} diff --git a/foundations/foundation-metrics/src/test/java/org/apache/servicecomb/foundation/metrics/TestSimpleMetricsContentFormatter.java b/foundations/foundation-metrics/src/test/java/org/apache/servicecomb/foundation/metrics/TestSimpleMetricsContentFormatter.java deleted file mode 100644 index 9edbc24..0000000 --- a/foundations/foundation-metrics/src/test/java/org/apache/servicecomb/foundation/metrics/TestSimpleMetricsContentFormatter.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * 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.HashMap; -import java.util.Map; - -import org.apache.servicecomb.foundation.metrics.output.servo.SimpleMetricsContentFormatter; -import org.junit.Assert; -import org.junit.Test; - -public class TestSimpleMetricsContentFormatter { - - @Test - public void testFormatter() { - SimpleMetricsContentFormatter formatter = new SimpleMetricsContentFormatter(); - - Map<String, String> input = new HashMap<>(); - input.put("key", "value"); - - Map<String, String> output = formatter.format(input); - - Assert.assertTrue(output.containsKey("key")); - Assert.assertTrue(output.get("key").contains("\"key\":\"value\"")); - } -} diff --git a/foundations/foundation-metrics/src/test/java/org/apache/servicecomb/foundation/metrics/performance/TestMetricsDataMonitor.java b/foundations/foundation-metrics/src/test/java/org/apache/servicecomb/foundation/metrics/performance/TestMetricsDataMonitor.java deleted file mode 100644 index de4fc5d..0000000 --- a/foundations/foundation-metrics/src/test/java/org/apache/servicecomb/foundation/metrics/performance/TestMetricsDataMonitor.java +++ /dev/null @@ -1,132 +0,0 @@ -/* - * 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.performance; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -public class TestMetricsDataMonitor { - MetricsDataMonitor metricsDataMonitor = null; - - @Before - public void setUp() throws Exception { - metricsDataMonitor = new MetricsDataMonitor(); - } - - @After - public void tearDown() throws Exception { - metricsDataMonitor = null; - } - - @Test - public void testReqMapValues() { - QueueMetricsData reqQueue = new QueueMetricsData(); - reqQueue.setCountInQueue(1L); - reqQueue.setMaxLifeTimeInQueue(5L); - reqQueue.setMinLifeTimeInQueue(1L); - reqQueue.toString(); - - metricsDataMonitor.setQueueMetrics("/sayHi", reqQueue); - QueueMetricsData reqQueueTest = metricsDataMonitor.getOrCreateQueueMetrics("/sayHi"); - QueueMetricsData reqQueueTestAbsent = metricsDataMonitor.getOrCreateQueueMetrics(""); - Assert.assertEquals(1, reqQueueTest.getCountInQueue().longValue()); - Assert.assertEquals(5, reqQueueTest.getMaxLifeTimeInQueue().longValue()); - Assert.assertEquals(1, reqQueueTest.getMinLifeTimeInQueue().longValue()); - Assert.assertEquals(0, reqQueueTestAbsent.getCountInQueue().longValue()); - } - - @Test - public void testOperationMetricsMap() { - QueueMetrics reqQueue = new QueueMetrics(); - QueueMetricsData queueMetrics = new QueueMetricsData(); - queueMetrics.incrementCountInQueue(); - reqQueue.setQueueStartTime(200); - reqQueue.setEndOperTime(250); - reqQueue.setQueueEndTime(300); - reqQueue.setOperQualifiedName("name"); - queueMetrics.setTotalTime(100L); - queueMetrics.setTotalServExecutionTime(200L); - queueMetrics.setTotalCount(100L); - queueMetrics.setTotalServExecutionCount(200L); - - // increment the count to 5. - queueMetrics.incrementTotalCount(); - queueMetrics.incrementTotalCount(); - queueMetrics.incrementTotalCount(); - queueMetrics.incrementTotalCount(); - queueMetrics.incrementTotalCount(); - queueMetrics.incrementTotalServExecutionCount(); - queueMetrics.incrementTotalServExecutionCount(); - queueMetrics.incrementTotalServExecutionCount(); - queueMetrics.incrementTotalServExecutionCount(); - queueMetrics.incrementTotalServExecutionCount(); - - queueMetrics.setMinLifeTimeInQueue(1); - queueMetrics.resetMinLifeTimeInQueue(); - Assert.assertEquals(0, queueMetrics.getMinLifeTimeInQueue().longValue()); - - queueMetrics.setMaxLifeTimeInQueue(1); - queueMetrics.resetMaxLifeTimeInQueue(); - Assert.assertEquals(0, queueMetrics.getMaxLifeTimeInQueue().longValue()); - - metricsDataMonitor.setQueueMetrics("/sayHi", queueMetrics); - - //Assert.assertEquals(1, reqQueueTest.getConuntInQueue()); - Assert.assertEquals(300, reqQueue.getQueueEndTime()); - Assert.assertEquals(250, reqQueue.getEndOperTime()); - Assert.assertEquals(200, reqQueue.getQueueStartTime()); - Assert.assertEquals("name", reqQueue.getOperQualifiedName()); - Assert.assertEquals(100L, queueMetrics.getTotalTime().longValue()); - Assert.assertEquals(105L, queueMetrics.getTotalCount().longValue()); - Assert.assertEquals(200, queueMetrics.getTotalServExecutionTime().longValue()); - Assert.assertEquals(205L, queueMetrics.getTotalServExecutionCount().longValue()); - queueMetrics.decrementCountInQueue(); - Assert.assertEquals(0, queueMetrics.getCountInQueue().longValue()); - } - - @Test - public void testHystrixAvgTimes() { - - // total request for provider - metricsDataMonitor.incrementTotalReqProvider(); - metricsDataMonitor.incrementTotalFailReqProvider(); - Assert.assertEquals(1, metricsDataMonitor.getTotalReqProvider()); - Assert.assertEquals(1, metricsDataMonitor.getTotalFailReqProvider()); - metricsDataMonitor.incrementTotalReqProvider(); - metricsDataMonitor.incrementTotalFailReqProvider(); - Assert.assertEquals(2, metricsDataMonitor.getTotalReqProvider()); - Assert.assertEquals(2, metricsDataMonitor.getTotalFailReqProvider()); - - // total request for consumer - metricsDataMonitor.incrementTotalReqConsumer(); - metricsDataMonitor.incrementTotalFailReqConsumer(); - Assert.assertEquals(1, metricsDataMonitor.getTotalReqConsumer()); - Assert.assertEquals(1, metricsDataMonitor.getTotalFailReqConsumer()); - metricsDataMonitor.incrementTotalReqConsumer(); - metricsDataMonitor.incrementTotalFailReqConsumer(); - Assert.assertEquals(2, metricsDataMonitor.getTotalReqConsumer()); - Assert.assertEquals(2, metricsDataMonitor.getTotalFailReqConsumer()); - - metricsDataMonitor.setOperMetTotalReq("/sayHi", 10L); - metricsDataMonitor.setOperMetTotalFailReq("/sayHi", 20L); - Assert.assertEquals(10L, metricsDataMonitor.getOperMetTotalReq("/sayHi").longValue()); - Assert.assertEquals(20L, metricsDataMonitor.getOperMetTotalFailReq("/sayHi").longValue()); - } -} diff --git a/foundations/foundation-metrics/src/test/java/org/apache/servicecomb/foundation/metrics/performance/TestMetricsDataMonitorUtil.java b/foundations/foundation-metrics/src/test/java/org/apache/servicecomb/foundation/metrics/performance/TestMetricsDataMonitorUtil.java deleted file mode 100644 index 327bfd5..0000000 --- a/foundations/foundation-metrics/src/test/java/org/apache/servicecomb/foundation/metrics/performance/TestMetricsDataMonitorUtil.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * 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.performance; - -import org.apache.servicecomb.foundation.metrics.MetricsServoRegistry; -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -public class TestMetricsDataMonitorUtil { - MetricsDataMonitor metricsDataMonitor = null; - - MetricsDataMonitorUtil metricsDataMonitorUtil = null; - - @Before - public void setUp() throws Exception { - metricsDataMonitor = MetricsServoRegistry.getOrCreateLocalMetrics(); - metricsDataMonitorUtil = new MetricsDataMonitorUtil(); - } - - @After - public void tearDown() throws Exception { - metricsDataMonitor = null; - } - - @Test - public void testAllReqConsumer() { - metricsDataMonitorUtil.setAllReqProviderAndConsumer("/sayHi", "CONSUMER"); - Assert.assertNotEquals(0L, metricsDataMonitor.getTotalReqConsumer()); - metricsDataMonitorUtil.setAllFailReqProviderAndConsumer("/sayHi", "CONSUMER"); - Assert.assertNotEquals(0L, metricsDataMonitor.getTotalFailReqConsumer()); - } - - @Test - public void testAllReqProvider() { - metricsDataMonitorUtil.setAllReqProviderAndConsumer("/sayBye", "PRODUCER"); - Assert.assertNotEquals(0L, metricsDataMonitor.getTotalReqProvider()); - metricsDataMonitorUtil.setAllReqProviderAndConsumer("/sayBye", "PRODUCER"); - Assert.assertNotEquals(0L, metricsDataMonitor.getTotalReqProvider()); - metricsDataMonitorUtil.setAllFailReqProviderAndConsumer("/sayBye", "PRODUCER"); - Assert.assertNotEquals(0L, metricsDataMonitor.getTotalFailReqProvider()); - metricsDataMonitorUtil.setAllFailReqProviderAndConsumer("/sayBye", "PRODUCER"); - Assert.assertNotEquals(0L, metricsDataMonitor.getTotalFailReqProvider()); - } -} diff --git a/handlers/handler-bizkeeper/src/main/java/org/apache/servicecomb/bizkeeper/BizkeeperHandler.java b/handlers/handler-bizkeeper/src/main/java/org/apache/servicecomb/bizkeeper/BizkeeperHandler.java index 961f7f9..bf6f911 100644 --- a/handlers/handler-bizkeeper/src/main/java/org/apache/servicecomb/bizkeeper/BizkeeperHandler.java +++ b/handlers/handler-bizkeeper/src/main/java/org/apache/servicecomb/bizkeeper/BizkeeperHandler.java @@ -19,7 +19,6 @@ package org.apache.servicecomb.bizkeeper; import org.apache.servicecomb.core.Handler; import org.apache.servicecomb.core.Invocation; -import org.apache.servicecomb.foundation.metrics.performance.MetricsDataMonitorUtil; import org.apache.servicecomb.swagger.invocation.AsyncResponse; import org.apache.servicecomb.swagger.invocation.Response; import org.slf4j.Logger; @@ -71,22 +70,13 @@ public abstract class BizkeeperHandler implements Handler { protected abstract BizkeeperCommand createBizkeeperCommand(Invocation invocation); @Override - public void handle(Invocation invocation, AsyncResponse asyncResp) throws Exception { + public void handle(Invocation invocation, AsyncResponse asyncResp) { HystrixObservable<Response> command = delegate.createBizkeeperCommand(invocation); - new MetricsDataMonitorUtil() - .setAllReqProviderAndConsumer(invocation.getOperationMeta().getMicroserviceQualifiedName(), - String.valueOf(invocation.getInvocationType())); - Observable<Response> observable = command.toObservable(); observable.subscribe(asyncResp::complete, error -> { LOG.warn("catch error in bizkeeper:" + error.getMessage()); asyncResp.fail(invocation.getInvocationType(), error); - - new MetricsDataMonitorUtil() - .setAllFailReqProviderAndConsumer(invocation.getOperationMeta().getMicroserviceQualifiedName(), - String.valueOf(invocation.getInvocationType())); - }, () -> { }); diff --git a/transports/transport-highway/src/main/java/org/apache/servicecomb/transport/highway/HighwayServerInvoke.java b/transports/transport-highway/src/main/java/org/apache/servicecomb/transport/highway/HighwayServerInvoke.java index 020c926..843c0fe 100644 --- a/transports/transport-highway/src/main/java/org/apache/servicecomb/transport/highway/HighwayServerInvoke.java +++ b/transports/transport-highway/src/main/java/org/apache/servicecomb/transport/highway/HighwayServerInvoke.java @@ -31,9 +31,6 @@ import org.apache.servicecomb.core.definition.OperationMeta; import org.apache.servicecomb.core.definition.SchemaMeta; import org.apache.servicecomb.core.metrics.InvocationStartedEvent; import org.apache.servicecomb.foundation.common.utils.EventUtils; -import org.apache.servicecomb.foundation.metrics.MetricsServoRegistry; -import org.apache.servicecomb.foundation.metrics.performance.QueueMetrics; -import org.apache.servicecomb.foundation.metrics.performance.QueueMetricsData; import org.apache.servicecomb.foundation.vertx.tcp.TcpConnection; import org.apache.servicecomb.swagger.invocation.InvocationType; import org.apache.servicecomb.swagger.invocation.Response; @@ -110,9 +107,9 @@ public class HighwayServerInvoke { this.bodyBuffer = bodyBuffer; } - private void runInExecutor(QueueMetrics metricsData, InvocationStartedEvent startedEvent) { + private void runInExecutor(InvocationStartedEvent startedEvent) { try { - doRunInExecutor(metricsData, startedEvent); + doRunInExecutor(startedEvent); } catch (Throwable e) { String msg = String.format("handle request error, %s, msgId=%d", operationMeta.getMicroserviceQualifiedName(), @@ -123,17 +120,15 @@ public class HighwayServerInvoke { } } - private void doRunInExecutor(QueueMetrics metricsData, InvocationStartedEvent startedEvent) throws Exception { + private void doRunInExecutor(InvocationStartedEvent startedEvent) throws Exception { Invocation invocation = HighwayCodec.decodeRequest(header, operationProtobuf, bodyBuffer, protobufFeature); invocation.getHandlerContext().put(Const.REMOTE_ADDRESS, this.connection.getNetSocket().remoteAddress()); - updateMetrics(invocation); //立刻设置开始时间,否则Finished时无法计算TotalTime invocation.setStartTime(startedEvent.getStartedTime()); invocation.triggerStartProcessingEvent(); invocation.next(response -> { sendResponse(invocation.getContext(), response); - endMetrics(invocation); invocation.triggerFinishedEvent(response.getStatusCode(), response.isSuccessed()); }); } @@ -170,55 +165,6 @@ public class HighwayServerInvoke { InvocationStartedEvent startedEvent = new InvocationStartedEvent(operationMeta.getMicroserviceQualifiedName(), InvocationType.PRODUCER, System.nanoTime()); EventUtils.triggerEvent(startedEvent); - QueueMetrics metricsData = initMetrics(operationMeta); - operationMeta.getExecutor().execute(() -> runInExecutor(metricsData, startedEvent)); - } - - /** - * Init the metrics. Note down the queue count and start time. - * @param operationMeta Operation data - * @return QueueMetrics - */ - private QueueMetrics initMetrics(OperationMeta operationMeta) { - QueueMetrics metricsData = new QueueMetrics(); - metricsData.setQueueStartTime(System.currentTimeMillis()); - metricsData.setOperQualifiedName(operationMeta.getMicroserviceQualifiedName()); - QueueMetricsData reqQueue = MetricsServoRegistry.getOrCreateLocalMetrics() - .getOrCreateQueueMetrics(operationMeta.getMicroserviceQualifiedName()); - reqQueue.incrementCountInQueue(); - return metricsData; - } - - /** - * Update the queue metrics. - */ - private void updateMetrics(Invocation invocation) { - QueueMetrics metricsData = (QueueMetrics) invocation.getMetricsData(); - if (null != metricsData) { - metricsData.setQueueEndTime(System.currentTimeMillis()); - QueueMetricsData reqQueue = MetricsServoRegistry.getOrCreateLocalMetrics() - .getOrCreateQueueMetrics(operationMeta.getMicroserviceQualifiedName()); - reqQueue.incrementTotalCount(); - Long timeInQueue = metricsData.getQueueEndTime() - metricsData.getQueueStartTime(); - reqQueue.setTotalTime(reqQueue.getTotalTime() + timeInQueue); - reqQueue.setMinLifeTimeInQueue(timeInQueue); - reqQueue.setMaxLifeTimeInQueue(timeInQueue); - reqQueue.decrementCountInQueue(); - } - } - - /** - * Prepare the end time of queue metrics. - */ - private void endMetrics(Invocation invocation) { - QueueMetrics metricsData = (QueueMetrics) invocation.getMetricsData(); - if (null != metricsData) { - metricsData.setEndOperTime(System.currentTimeMillis()); - QueueMetricsData reqQueue = MetricsServoRegistry.getOrCreateLocalMetrics() - .getOrCreateQueueMetrics(operationMeta.getMicroserviceQualifiedName()); - reqQueue.incrementTotalServExecutionCount(); - reqQueue.setTotalServExecutionTime( - reqQueue.getTotalServExecutionTime() + (metricsData.getEndOperTime() - metricsData.getQueueEndTime())); - } + operationMeta.getExecutor().execute(() -> runInExecutor(startedEvent)); } } -- To stop receiving notification emails like this one, please contact [email protected].
