From 1a151ac33bd235622cf3d15a2bebbd739c43b936 Mon Sep 17 00:00:00 2001 From: zhengyangyong Date: Thu, 11 Jan 2018 14:14:09 +0800 Subject: [PATCH 01/10] SCB-150 add success/failed dimension for call count and tps Signed-off-by: zhengyangyong --- metrics/metrics-common/pom.xml | 4 +- .../metrics/common/DoubleMetricValue.java | 60 +++++++++++++++++ .../metrics/common/LongMetricValue.java | 60 +++++++++++++++++ .../metrics/common/MetricValue.java | 65 +++++++++++++++++++ .../metrics/common/CallMetric.java | 37 +++++++---- .../metrics/core/MetricsDimension.java | 39 +++++++++++ .../metrics/core/monitor/CallMonitor.java | 65 ++++++++++++++++--- 7 files changed, 304 insertions(+), 26 deletions(-) create mode 100644 metrics/metrics-common/src/main/java/io/servicecomb/metrics/common/DoubleMetricValue.java create mode 100644 metrics/metrics-common/src/main/java/io/servicecomb/metrics/common/LongMetricValue.java create mode 100644 metrics/metrics-common/src/main/java/io/servicecomb/metrics/common/MetricValue.java create mode 100644 metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/MetricsDimension.java diff --git a/metrics/metrics-common/pom.xml b/metrics/metrics-common/pom.xml index 21dddbd9949..5987595fc7c 100644 --- a/metrics/metrics-common/pom.xml +++ b/metrics/metrics-common/pom.xml @@ -31,8 +31,8 @@ - com.fasterxml.jackson.core - jackson-databind + io.servicecomb + foundation-common diff --git a/metrics/metrics-common/src/main/java/io/servicecomb/metrics/common/DoubleMetricValue.java b/metrics/metrics-common/src/main/java/io/servicecomb/metrics/common/DoubleMetricValue.java new file mode 100644 index 00000000000..c1165625b5d --- /dev/null +++ b/metrics/metrics-common/src/main/java/io/servicecomb/metrics/common/DoubleMetricValue.java @@ -0,0 +1,60 @@ +/* + * 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 io.servicecomb.metrics.common; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import io.servicecomb.foundation.common.exceptions.ServiceCombException; + +public class DoubleMetricValue extends MetricValue { + public DoubleMetricValue(Double value, Map dimensions) { + super(value, dimensions); + } + + public DoubleMetricValue(@JsonProperty("key") String key, + @JsonProperty("value") Double value, + @JsonProperty("dimensions") Map dimensions) { + super(key, value, dimensions); + } + + public DoubleMetricValue merge(DoubleMetricValue value) { + if (this.getKey().equals(value.getKey())) { + return new DoubleMetricValue(this.getKey(), this.getValue() + value.getValue(), this.getDimensions()); + } + throw new ServiceCombException("unable merge different key values,source key :" + value.getKey() + + " target key :" + this.getKey()); + } + + public static List merge(List source, List target) { + Map finalValues = new HashMap<>(); + for (DoubleMetricValue t : target) { + finalValues.put(t.getKey(), t); + } + for (DoubleMetricValue s : source) { + if (finalValues.containsKey(s.getKey())) { + finalValues.put(s.getKey(), finalValues.get(s.getKey()).merge(s)); + } + } + return new ArrayList<>(finalValues.values()); + } +} diff --git a/metrics/metrics-common/src/main/java/io/servicecomb/metrics/common/LongMetricValue.java b/metrics/metrics-common/src/main/java/io/servicecomb/metrics/common/LongMetricValue.java new file mode 100644 index 00000000000..eb0ac8d5d80 --- /dev/null +++ b/metrics/metrics-common/src/main/java/io/servicecomb/metrics/common/LongMetricValue.java @@ -0,0 +1,60 @@ +/* + * 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 io.servicecomb.metrics.common; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import io.servicecomb.foundation.common.exceptions.ServiceCombException; + +public class LongMetricValue extends MetricValue { + public LongMetricValue(Long value, Map dimensions) { + super(value, dimensions); + } + + public LongMetricValue(@JsonProperty("key") String key, + @JsonProperty("value") Long value, + @JsonProperty("dimensions") Map dimensions) { + super(key, value, dimensions); + } + + public LongMetricValue merge(LongMetricValue value) { + if (this.getKey().equals(value.getKey())) { + return new LongMetricValue(this.getKey(), this.getValue() + value.getValue(), this.getDimensions()); + } + throw new ServiceCombException("unable merge different key values,source key :" + value.getKey() + + " target key :" + this.getKey()); + } + + public static List merge(List source, List target) { + Map finalValues = new HashMap<>(); + for (LongMetricValue t : target) { + finalValues.put(t.getKey(), t); + } + for (LongMetricValue s : source) { + if (finalValues.containsKey(s.getKey())) { + finalValues.put(s.getKey(), finalValues.get(s.getKey()).merge(s)); + } + } + return new ArrayList<>(finalValues.values()); + } +} diff --git a/metrics/metrics-common/src/main/java/io/servicecomb/metrics/common/MetricValue.java b/metrics/metrics-common/src/main/java/io/servicecomb/metrics/common/MetricValue.java new file mode 100644 index 00000000000..c368aba0a16 --- /dev/null +++ b/metrics/metrics-common/src/main/java/io/servicecomb/metrics/common/MetricValue.java @@ -0,0 +1,65 @@ +/* + * 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 io.servicecomb.metrics.common; + +import java.util.Arrays; +import java.util.Map; + +public class MetricValue { + private final String key; + + private final T value; + + private final Map dimensions; + + public String getKey() { + return key; + } + + public T getValue() { + return value; + } + + public Map getDimensions() { + return dimensions; + } + + public MetricValue(T value, Map dimensions) { + String finalKey = "{}"; + if (dimensions != null && dimensions.size() != 0) { + String[] keys = dimensions.keySet().toArray(new String[0]); + Arrays.sort(keys); + StringBuilder builder = new StringBuilder("{"); + for (String key : keys) { + builder.append(String.format("%s=%s,", key, dimensions.get(key))); + } + builder.deleteCharAt(dimensions.size() - 1); + builder.append("}"); + finalKey = builder.toString(); + } + this.key = finalKey; + this.value = value; + this.dimensions = dimensions; + } + + public MetricValue(String key, T value, Map dimensions) { + this.key = key; + this.value = value; + this.dimensions = dimensions; + } +} diff --git a/metrics/metrics-common/src/main/java/org/apache/servicecomb/metrics/common/CallMetric.java b/metrics/metrics-common/src/main/java/org/apache/servicecomb/metrics/common/CallMetric.java index 5e0d63b5820..a65ee92c4ba 100644 --- a/metrics/metrics-common/src/main/java/org/apache/servicecomb/metrics/common/CallMetric.java +++ b/metrics/metrics-common/src/main/java/org/apache/servicecomb/metrics/common/CallMetric.java @@ -17,7 +17,9 @@ package org.apache.servicecomb.metrics.common; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; import com.fasterxml.jackson.annotation.JsonProperty; @@ -25,37 +27,44 @@ public class CallMetric { private final String prefix; - private final long total; + private final List totalValues; - private final double tps; + private final List tpsValues; - public long getTotal() { - return total; + public List getTotalValues() { + return totalValues; } - public double getTps() { - return tps; + public List getTpsValues() { + return tpsValues; } public CallMetric(String prefix) { - this(prefix, 0, 0); + this(prefix, new ArrayList<>(), new ArrayList<>()); } - public CallMetric(@JsonProperty("prefix") String prefix, @JsonProperty("total") long total, - @JsonProperty("tps") double tps) { + public CallMetric(@JsonProperty("prefix") String prefix, + @JsonProperty("totalValues") List totalValues, + @JsonProperty("tpsValues") List tpsValues) { this.prefix = prefix; - this.total = total; - this.tps = tps; + this.totalValues = totalValues; + this.tpsValues = tpsValues; } public CallMetric merge(CallMetric metric) { - return new CallMetric(this.prefix, this.total + metric.total, this.tps + metric.tps); + return new CallMetric(this.prefix, + LongMetricValue.merge(metric.getTotalValues(), this.getTotalValues()), + DoubleMetricValue.merge(metric.getTpsValues(), this.getTpsValues())); } public Map toMap() { Map metrics = new HashMap<>(); - metrics.put(prefix + ".total", total); - metrics.put(prefix + ".tps", tps); + for (MetricValue totalValue : totalValues) { + metrics.put(prefix + ".total." + totalValue.getKey(), totalValue.getValue()); + } + for (MetricValue tpsValue : tpsValues) { + metrics.put(prefix + ".tps." + tpsValue.getKey(), tpsValue.getValue()); + } return metrics; } } diff --git a/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/MetricsDimension.java b/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/MetricsDimension.java new file mode 100644 index 00000000000..bf9170f375b --- /dev/null +++ b/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/MetricsDimension.java @@ -0,0 +1,39 @@ +/* + * 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 io.servicecomb.metrics.core; + +import io.servicecomb.foundation.common.exceptions.ServiceCombException; + +public class MetricsDimension { + public static final String DIMENSION_STATUS = "Status"; + + public static final String DIMENSION_STATUS_ALL = "all"; + + public static final String DIMENSION_STATUS_SUCCESS = "success"; + + public static final String DIMENSION_STATUS_FAILED = "failed"; + + public static String[] getDimensionOptions(String dimension) { + if (DIMENSION_STATUS.equals(dimension)) { + return new String[] {MetricsDimension.DIMENSION_STATUS_ALL, + MetricsDimension.DIMENSION_STATUS_SUCCESS, + MetricsDimension.DIMENSION_STATUS_FAILED}; + } + throw new ServiceCombException("illegal dimension key : " + dimension); + } +} diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/CallMonitor.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/CallMonitor.java index 1e682013f8a..7174e3344fe 100644 --- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/CallMonitor.java +++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/CallMonitor.java @@ -19,37 +19,82 @@ import org.apache.servicecomb.metrics.common.CallMetric; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + import com.netflix.servo.monitor.BasicCounter; import com.netflix.servo.monitor.MonitorConfig; import com.netflix.servo.monitor.StepCounter; +import com.netflix.servo.tag.Tag; +import com.netflix.servo.tag.TagList; + +import io.servicecomb.metrics.common.CallMetric; +import io.servicecomb.metrics.common.DoubleMetricValue; +import io.servicecomb.metrics.common.LongMetricValue; +import io.servicecomb.metrics.core.MetricsDimension; public class CallMonitor { private final String prefix; - private final BasicCounter total; + private final List totalCounters; - private final StepCounter tps; + private final List tpsCounters; - public CallMonitor(String prefix) { + public CallMonitor(String prefix, String... dimensions) { this.prefix = prefix; - this.total = new BasicCounter(MonitorConfig.builder(prefix + ".total").build()); - this.tps = new StepCounter(MonitorConfig.builder(prefix + ".tps").build()); + this.totalCounters = new ArrayList<>(); + this.tpsCounters = new ArrayList<>(); + if (dimensions.length == 0) { + this.totalCounters.add(new BasicCounter(MonitorConfig.builder(prefix + ".total").build())); + this.tpsCounters.add(new StepCounter(MonitorConfig.builder(prefix + ".tps").build())); + } else { + for (String dimension : dimensions) { + for (String option : MetricsDimension.getDimensionOptions(dimension)) { + this.totalCounters + .add(new BasicCounter(MonitorConfig.builder(prefix + ".total").withTag(dimension, option).build())); + this.tpsCounters + .add(new StepCounter(MonitorConfig.builder(prefix + ".tps").withTag(dimension, option).build())); + } + } + } } public void increment() { - total.increment(); - tps.increment(); + for (int i = 0; i < totalCounters.size(); i++) { + totalCounters.get(i).increment(); + tpsCounters.get(i).increment(); + } } public CallMetric toMetric(int windowTimeIndex) { - return new CallMetric(this.prefix, total.getValue(windowTimeIndex).longValue(), - this.adjustValue(tps.getValue(windowTimeIndex).doubleValue())); + List totalValues = new ArrayList<>(); + List tpsValues = new ArrayList<>(); + for (int i = 0; i < totalCounters.size(); i++) { + totalValues.add(new LongMetricValue(totalCounters.get(i).getValue(windowTimeIndex).longValue(), + convertTags(totalCounters.get(i).getConfig().getTags()))); + tpsValues.add(new DoubleMetricValue(adjustValue(tpsCounters.get(i).getValue(windowTimeIndex).doubleValue()), + convertTags(tpsCounters.get(i).getConfig().getTags()))); + } + return new CallMetric(this.prefix, totalValues, tpsValues); } //for time-related monitor type, if stop poll value over one window time, //the value may return -1 because servo can't known precise value of previous step //so must change to return 0 - public double adjustValue(double value) { + private double adjustValue(double value) { return value < 0 ? 0 : value; } + + private Map convertTags(TagList tags) { + if (tags.size() != 0) { + Map tagMap = new HashMap<>(); + for (Tag tag : tags) { + tagMap.put(tag.getKey(), tag.getValue()); + } + return tagMap; + } + return null; + } } From 5c74581cead3915641e2aeb2ba5ad8bf75c3d3b9 Mon Sep 17 00:00:00 2001 From: zhengyangyong Date: Fri, 12 Jan 2018 10:15:43 +0800 Subject: [PATCH 02/10] SCB-150 impl success /failed in invocation and event Signed-off-by: zhengyangyong --- .../common/rest/AbstractRestInvocation.java | 2 +- .../apache/servicecomb/core/Invocation.java | 4 +- .../core/metrics/InvocationFinishedEvent.java | 10 ++- .../core/provider/consumer/InvokerUtils.java | 12 ++-- .../metrics/core/utils/MonitorUtils.java | 66 +++++++++++++++++++ .../InvocationFinishedEventListener.java | 21 +++--- .../event/InvocationStartedEventListener.java | 21 +++--- .../metrics/core/monitor/CallMonitor.java | 47 ++++++------- .../core/monitor/DefaultSystemMonitor.java | 6 +- .../metrics/core/monitor/TimerMonitor.java | 30 +++------ .../highway/HighwayServerInvoke.java | 2 +- 11 files changed, 144 insertions(+), 77 deletions(-) create mode 100644 metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/utils/MonitorUtils.java 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 2efcdd1f87b..0ee799989fd 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 @@ -189,7 +189,7 @@ protected void doInvoke() throws Throwable { invocation.next(resp -> { sendResponseQuietly(resp); - invocation.triggerFinishedEvent(); + invocation.triggerFinishedEvent(resp.isSuccessed()); endMetrics(); }); } 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 ea5e8116778..19241b85041 100644 --- a/core/src/main/java/org/apache/servicecomb/core/Invocation.java +++ b/core/src/main/java/org/apache/servicecomb/core/Invocation.java @@ -202,12 +202,12 @@ public void triggerStartProcessingEvent() { operationMeta.getMicroserviceQualifiedName(), this.invocationType, startProcessingTime - startTime)); } - public void triggerFinishedEvent() { + public void triggerFinishedEvent(boolean success) { long finishedTime = System.nanoTime(); EventUtils .triggerEvent(new InvocationFinishedEvent(operationMeta.getMicroserviceQualifiedName(), this.invocationType, finishedTime - startProcessingTime, - finishedTime - startTime)); + finishedTime - startTime, success)); } public boolean isSync() { diff --git a/core/src/main/java/org/apache/servicecomb/core/metrics/InvocationFinishedEvent.java b/core/src/main/java/org/apache/servicecomb/core/metrics/InvocationFinishedEvent.java index 4ecf2adfcc2..ea54d672e73 100644 --- a/core/src/main/java/org/apache/servicecomb/core/metrics/InvocationFinishedEvent.java +++ b/core/src/main/java/org/apache/servicecomb/core/metrics/InvocationFinishedEvent.java @@ -29,6 +29,8 @@ public class InvocationFinishedEvent implements Event { private final long totalElapsedNanoTime; + private final boolean success; + public String getOperationName() { return operationName; } @@ -45,12 +47,18 @@ public long getTotalElapsedNanoTime() { return totalElapsedNanoTime; } + public boolean isSuccess() { + return success; + } + public InvocationFinishedEvent(String operationName, InvocationType invocationType, long processElapsedNanoTime, - long totalElapsedNanoTime) { + long totalElapsedNanoTime, + boolean success) { this.operationName = operationName; this.invocationType = invocationType; this.processElapsedNanoTime = processElapsedNanoTime; this.totalElapsedNanoTime = totalElapsedNanoTime; + this.success = success; } } diff --git a/core/src/main/java/org/apache/servicecomb/core/provider/consumer/InvokerUtils.java b/core/src/main/java/org/apache/servicecomb/core/provider/consumer/InvokerUtils.java index cabc7fb2e6d..e8b824739f6 100644 --- a/core/src/main/java/org/apache/servicecomb/core/provider/consumer/InvokerUtils.java +++ b/core/src/main/java/org/apache/servicecomb/core/provider/consumer/InvokerUtils.java @@ -62,6 +62,7 @@ public static Object syncInvoke(Invocation invocation) throws InvocationExceptio } public static Response innerSyncInvoke(Invocation invocation) { + boolean success = false; try { triggerStartedEvent(invocation); SyncResponseExecutor respExecutor = new SyncResponseExecutor(); @@ -69,14 +70,16 @@ public static Response innerSyncInvoke(Invocation invocation) { invocation.next(respExecutor::setResponse); - return respExecutor.waitResponse(); + Response response = respExecutor.waitResponse(); + success = response.isSuccessed(); + return response; } catch (Throwable e) { String msg = String.format("invoke failed, %s", invocation.getOperationMeta().getMicroserviceQualifiedName()); LOGGER.debug(msg, e); return Response.createConsumerFail(e); } finally { - invocation.triggerFinishedEvent(); + invocation.triggerFinishedEvent(success); } } @@ -89,12 +92,11 @@ public static void reactiveInvoke(Invocation invocation, AsyncResponse asyncResp invocation.setResponseExecutor(respExecutor); invocation.next(ar -> { - invocation.triggerFinishedEvent(); + invocation.triggerFinishedEvent(ar.isSuccessed()); asyncResp.handle(ar); }); - } catch (Throwable e) { - invocation.triggerFinishedEvent(); + invocation.triggerFinishedEvent(false); LOGGER.error("invoke failed, {}", invocation.getOperationMeta().getMicroserviceQualifiedName()); asyncResp.consumerFail(e); } diff --git a/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/utils/MonitorUtils.java b/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/utils/MonitorUtils.java new file mode 100644 index 00000000000..7091724943d --- /dev/null +++ b/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/utils/MonitorUtils.java @@ -0,0 +1,66 @@ +/* + * 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 io.servicecomb.metrics.core.utils; + +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +import com.netflix.servo.monitor.Monitor; +import com.netflix.servo.tag.Tag; +import com.netflix.servo.tag.TagList; + +public class MonitorUtils { + + //for time-related monitor type, if stop poll value over one window time, + //the value may return -1 or NaN because servo can't known precise value of previous step + //so must change to return 0 + public static double adjustValue(double value) { + return Double.isNaN(value) || value < 0 ? 0 : value; + } + + //for time-related monitor type, if stop poll value over one window time, + //the value may return -1 because servo can't known precise value of previous step + //so must change to return 0 + public static long adjustValue(long value) { + return value < 0 ? 0 : value; + } + + public static boolean containsTagValue(Monitor monitor, String tagKey, String tagValue) { + TagList tags = monitor.getConfig().getTags(); + return tags.containsKey(tagKey) && tagValue.equals(tags.getTag(tagKey).getValue()); + } + + public static Map convertTags(Monitor monitor) { + TagList tags = monitor.getConfig().getTags(); + if (tags.size() != 0) { + Map tagMap = new HashMap<>(); + for (Tag tag : tags) { + tagMap.put(tag.getKey(), tag.getValue()); + } + return tagMap; + } + return null; + } + + //Counting use System.nano get more precise time + //so we need change unit to millisecond when ouput + public static long convertNanosecondToMillisecond(long nanoValue) { + return TimeUnit.NANOSECONDS.toMillis(nanoValue); + } +} diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/InvocationFinishedEventListener.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/InvocationFinishedEventListener.java index ff356f998dd..9e2d6876cf9 100644 --- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/InvocationFinishedEventListener.java +++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/InvocationFinishedEventListener.java @@ -15,15 +15,16 @@ * limitations under the License. */ -package org.apache.servicecomb.metrics.core.event; +package io.servicecomb.metrics.core.event; -import org.apache.servicecomb.core.metrics.InvocationFinishedEvent; -import org.apache.servicecomb.foundation.common.event.Event; -import org.apache.servicecomb.foundation.common.event.EventListener; -import org.apache.servicecomb.metrics.core.monitor.ConsumerInvocationMonitor; -import org.apache.servicecomb.metrics.core.monitor.ProducerInvocationMonitor; -import org.apache.servicecomb.metrics.core.monitor.RegistryMonitor; -import org.apache.servicecomb.swagger.invocation.InvocationType; +import io.servicecomb.core.metrics.InvocationFinishedEvent; +import io.servicecomb.foundation.common.event.Event; +import io.servicecomb.foundation.common.event.EventListener; +import io.servicecomb.metrics.core.MetricsDimension; +import io.servicecomb.metrics.core.monitor.ConsumerInvocationMonitor; +import io.servicecomb.metrics.core.monitor.ProducerInvocationMonitor; +import io.servicecomb.metrics.core.monitor.RegistryMonitor; +import io.servicecomb.swagger.invocation.InvocationType; public class InvocationFinishedEventListener implements EventListener { @@ -45,9 +46,13 @@ public void process(Event data) { ProducerInvocationMonitor monitor = registryMonitor.getProducerInvocationMonitor(event.getOperationName()); monitor.getExecutionTime().update(event.getProcessElapsedNanoTime()); monitor.getProducerLatency().update(event.getTotalElapsedNanoTime()); + monitor.getProducerCall().increment(MetricsDimension.DIMENSION_STATUS, + event.isSuccess() ? MetricsDimension.DIMENSION_STATUS_SUCCESS : MetricsDimension.DIMENSION_STATUS_FAILED); } else { ConsumerInvocationMonitor monitor = registryMonitor.getConsumerInvocationMonitor(event.getOperationName()); monitor.getConsumerLatency().update(event.getTotalElapsedNanoTime()); + monitor.getConsumerCall().increment(MetricsDimension.DIMENSION_STATUS, + event.isSuccess() ? MetricsDimension.DIMENSION_STATUS_SUCCESS : MetricsDimension.DIMENSION_STATUS_FAILED); } } } diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/InvocationStartedEventListener.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/InvocationStartedEventListener.java index 166f5ce3b4c..f7516bb8596 100644 --- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/InvocationStartedEventListener.java +++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/InvocationStartedEventListener.java @@ -15,15 +15,16 @@ * limitations under the License. */ -package org.apache.servicecomb.metrics.core.event; +package io.servicecomb.metrics.core.event; -import org.apache.servicecomb.core.metrics.InvocationStartedEvent; -import org.apache.servicecomb.foundation.common.event.Event; -import org.apache.servicecomb.foundation.common.event.EventListener; -import org.apache.servicecomb.metrics.core.monitor.ConsumerInvocationMonitor; -import org.apache.servicecomb.metrics.core.monitor.ProducerInvocationMonitor; -import org.apache.servicecomb.metrics.core.monitor.RegistryMonitor; -import org.apache.servicecomb.swagger.invocation.InvocationType; +import io.servicecomb.core.metrics.InvocationStartedEvent; +import io.servicecomb.foundation.common.event.Event; +import io.servicecomb.foundation.common.event.EventListener; +import io.servicecomb.metrics.core.MetricsDimension; +import io.servicecomb.metrics.core.monitor.ConsumerInvocationMonitor; +import io.servicecomb.metrics.core.monitor.ProducerInvocationMonitor; +import io.servicecomb.metrics.core.monitor.RegistryMonitor; +import io.servicecomb.swagger.invocation.InvocationType; public class InvocationStartedEventListener implements EventListener { @@ -44,10 +45,10 @@ public void process(Event data) { if (InvocationType.PRODUCER.equals(event.getInvocationType())) { ProducerInvocationMonitor monitor = registryMonitor.getProducerInvocationMonitor(event.getOperationName()); monitor.getWaitInQueue().increment(); - monitor.getProducerCall().increment(); + monitor.getProducerCall().increment(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_ALL); } else { ConsumerInvocationMonitor monitor = registryMonitor.getConsumerInvocationMonitor(event.getOperationName()); - monitor.getConsumerCall().increment(); + monitor.getConsumerCall().increment(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_ALL); } } } diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/CallMonitor.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/CallMonitor.java index 7174e3344fe..fb47b9b98aa 100644 --- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/CallMonitor.java +++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/CallMonitor.java @@ -20,20 +20,17 @@ import org.apache.servicecomb.metrics.common.CallMetric; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; -import java.util.Map; import com.netflix.servo.monitor.BasicCounter; import com.netflix.servo.monitor.MonitorConfig; import com.netflix.servo.monitor.StepCounter; -import com.netflix.servo.tag.Tag; -import com.netflix.servo.tag.TagList; import io.servicecomb.metrics.common.CallMetric; import io.servicecomb.metrics.common.DoubleMetricValue; import io.servicecomb.metrics.common.LongMetricValue; import io.servicecomb.metrics.core.MetricsDimension; +import io.servicecomb.metrics.core.utils.MonitorUtils; public class CallMonitor { private final String prefix; @@ -68,33 +65,31 @@ public void increment() { } } + public void increment(String dimensionKey, String dimensionValue) { + for (int i = 0; i < totalCounters.size(); i++) { + BasicCounter totalCounter = totalCounters.get(i); + if (MonitorUtils.containsTagValue(totalCounter, dimensionKey, dimensionValue)) { + totalCounter.increment(); + } + StepCounter tpsCounter = tpsCounters.get(i); + if (MonitorUtils.containsTagValue(tpsCounter, dimensionKey, dimensionValue)) { + tpsCounter.increment(); + } + } + } + public CallMetric toMetric(int windowTimeIndex) { List totalValues = new ArrayList<>(); List tpsValues = new ArrayList<>(); for (int i = 0; i < totalCounters.size(); i++) { - totalValues.add(new LongMetricValue(totalCounters.get(i).getValue(windowTimeIndex).longValue(), - convertTags(totalCounters.get(i).getConfig().getTags()))); - tpsValues.add(new DoubleMetricValue(adjustValue(tpsCounters.get(i).getValue(windowTimeIndex).doubleValue()), - convertTags(tpsCounters.get(i).getConfig().getTags()))); + BasicCounter totalCounter = totalCounters.get(i); + totalValues.add(new LongMetricValue(totalCounter.getValue(windowTimeIndex).longValue(), + MonitorUtils.convertTags(totalCounter))); + StepCounter tpsCounter = tpsCounters.get(i); + tpsValues.add( + new DoubleMetricValue(MonitorUtils.adjustValue(tpsCounter.getValue(windowTimeIndex).doubleValue()), + MonitorUtils.convertTags(tpsCounter))); } return new CallMetric(this.prefix, totalValues, tpsValues); } - - //for time-related monitor type, if stop poll value over one window time, - //the value may return -1 because servo can't known precise value of previous step - //so must change to return 0 - private double adjustValue(double value) { - return value < 0 ? 0 : value; - } - - private Map convertTags(TagList tags) { - if (tags.size() != 0) { - Map tagMap = new HashMap<>(); - for (Tag tag : tags) { - tagMap.put(tag.getKey(), tag.getValue()); - } - return tagMap; - } - return null; - } } diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/DefaultSystemMonitor.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/DefaultSystemMonitor.java index 12caaaa461c..3541d82f8f9 100644 --- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/DefaultSystemMonitor.java +++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/DefaultSystemMonitor.java @@ -98,8 +98,12 @@ public long getNonHeapUsed() { @Override public SystemMetric toMetric() { - return new SystemMetric(getCpuLoad(), + return new SystemMetric(adjustValue(getCpuLoad()), getCpuRunningThreads(), getHeapInit(), getHeapMax(), getHeapCommit(), getHeapUsed(), getNonHeapInit(), getNonHeapMax(), getNonHeapCommit(), getNonHeapUsed()); } + + private double adjustValue(double value) { + return value < 0 ? Double.NaN : value; + } } diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/TimerMonitor.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/TimerMonitor.java index 7d4fffe4687..33ba8ab8563 100644 --- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/TimerMonitor.java +++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/TimerMonitor.java @@ -15,17 +15,16 @@ * limitations under the License. */ -package org.apache.servicecomb.metrics.core.monitor; - -import java.util.concurrent.TimeUnit; - -import org.apache.servicecomb.metrics.common.TimerMetric; +package io.servicecomb.metrics.core.monitor; import com.netflix.servo.monitor.MaxGauge; import com.netflix.servo.monitor.MinGauge; import com.netflix.servo.monitor.MonitorConfig; import com.netflix.servo.monitor.StepCounter; +import io.servicecomb.metrics.common.TimerMetric; +import io.servicecomb.metrics.core.utils.MonitorUtils; + public class TimerMonitor { private final String prefix; @@ -59,22 +58,9 @@ public TimerMonitor(String prefix) { public TimerMetric toMetric(int windowTimeIndex) { return new TimerMetric(this.prefix, - this.convertNanosecondToMillisecond(this.adjustValue(total.getCount(windowTimeIndex))), - this.adjustValue(count.getCount(windowTimeIndex)), - this.convertNanosecondToMillisecond(this.adjustValue(min.getValue(windowTimeIndex))), - this.convertNanosecondToMillisecond(this.adjustValue(max.getValue(windowTimeIndex)))); - } - - //for time-related monitor type, if stop poll value over one window time, - //the value may return -1 because servo can't known precise value of previous step - //so must change to return 0 - public long adjustValue(long value) { - return value < 0 ? 0 : value; - } - - //Counting use System.nano get more precise time - //so we need change unit to millisecond when ouput - public long convertNanosecondToMillisecond(long nanoValue) { - return TimeUnit.NANOSECONDS.toMillis(nanoValue); + MonitorUtils.convertNanosecondToMillisecond(MonitorUtils.adjustValue(total.getCount(windowTimeIndex))), + MonitorUtils.adjustValue(count.getCount(windowTimeIndex)), + MonitorUtils.convertNanosecondToMillisecond(MonitorUtils.adjustValue(min.getValue(windowTimeIndex))), + MonitorUtils.convertNanosecondToMillisecond(MonitorUtils.adjustValue(max.getValue(windowTimeIndex)))); } } 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 4cebd3249f4..ba8c126d0de 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 @@ -134,7 +134,7 @@ private void doRunInExecutor(QueueMetrics metricsData, InvocationStartedEvent st invocation.next(response -> { sendResponse(invocation.getContext(), response); endMetrics(invocation); - invocation.triggerFinishedEvent(); + invocation.triggerFinishedEvent(response.isSuccessed()); }); } From 8a78cb8312c71e2ab9fd60e1302e6aeb3e0d88e6 Mon Sep 17 00:00:00 2001 From: zhengyangyong Date: Fri, 12 Jan 2018 11:34:41 +0800 Subject: [PATCH 03/10] SCB-150 minor refactor and fix test case Signed-off-by: zhengyangyong --- .../metrics/common/DoubleMetricValue.java | 2 + .../metrics/common/LongMetricValue.java | 2 + .../metrics/common/MetricValue.java | 7 +- .../metrics/common/CallMetric.java | 18 + .../metrics/core/utils/MonitorUtils.java | 5 +- .../metrics/core/monitor/CallMonitor.java | 12 +- .../monitor/ConsumerInvocationMonitor.java | 9 +- .../monitor/ProducerInvocationMonitor.java | 11 +- .../metrics/core/TestEventAndRunner.java | 346 +++++++++--------- .../metrics/core/TestPublisher.java | 7 +- 10 files changed, 221 insertions(+), 198 deletions(-) diff --git a/metrics/metrics-common/src/main/java/io/servicecomb/metrics/common/DoubleMetricValue.java b/metrics/metrics-common/src/main/java/io/servicecomb/metrics/common/DoubleMetricValue.java index c1165625b5d..8b831913dd2 100644 --- a/metrics/metrics-common/src/main/java/io/servicecomb/metrics/common/DoubleMetricValue.java +++ b/metrics/metrics-common/src/main/java/io/servicecomb/metrics/common/DoubleMetricValue.java @@ -53,6 +53,8 @@ public static List merge(List source, List for (DoubleMetricValue s : source) { if (finalValues.containsKey(s.getKey())) { finalValues.put(s.getKey(), finalValues.get(s.getKey()).merge(s)); + } else { + finalValues.put(s.getKey(), s); } } return new ArrayList<>(finalValues.values()); diff --git a/metrics/metrics-common/src/main/java/io/servicecomb/metrics/common/LongMetricValue.java b/metrics/metrics-common/src/main/java/io/servicecomb/metrics/common/LongMetricValue.java index eb0ac8d5d80..6f7429c5aca 100644 --- a/metrics/metrics-common/src/main/java/io/servicecomb/metrics/common/LongMetricValue.java +++ b/metrics/metrics-common/src/main/java/io/servicecomb/metrics/common/LongMetricValue.java @@ -53,6 +53,8 @@ public static List merge(List source, List(finalValues.values()); diff --git a/metrics/metrics-common/src/main/java/io/servicecomb/metrics/common/MetricValue.java b/metrics/metrics-common/src/main/java/io/servicecomb/metrics/common/MetricValue.java index c368aba0a16..f1f95e366e2 100644 --- a/metrics/metrics-common/src/main/java/io/servicecomb/metrics/common/MetricValue.java +++ b/metrics/metrics-common/src/main/java/io/servicecomb/metrics/common/MetricValue.java @@ -48,7 +48,7 @@ public MetricValue(T value, Map dimensions) { for (String key : keys) { builder.append(String.format("%s=%s,", key, dimensions.get(key))); } - builder.deleteCharAt(dimensions.size() - 1); + builder.deleteCharAt(builder.length() - 1); builder.append("}"); finalKey = builder.toString(); } @@ -62,4 +62,9 @@ public MetricValue(String key, T value, Map dimensions) { this.value = value; this.dimensions = dimensions; } + + public boolean containDimension(String dimensionKey, String dimensionValue) { + return this.getDimensions().containsKey(dimensionKey) && + dimensionValue.equals(this.getDimensions().get(dimensionKey)); + } } diff --git a/metrics/metrics-common/src/main/java/org/apache/servicecomb/metrics/common/CallMetric.java b/metrics/metrics-common/src/main/java/org/apache/servicecomb/metrics/common/CallMetric.java index a65ee92c4ba..f3e82d5b1ec 100644 --- a/metrics/metrics-common/src/main/java/org/apache/servicecomb/metrics/common/CallMetric.java +++ b/metrics/metrics-common/src/main/java/org/apache/servicecomb/metrics/common/CallMetric.java @@ -35,10 +35,28 @@ public List getTotalValues() { return totalValues; } + public LongMetricValue getTotalValues(String dimensionKey, String dimensionValue) { + for (LongMetricValue value : totalValues) { + if (value.containDimension(dimensionKey, dimensionValue)) { + return value; + } + } + return null; + } + public List getTpsValues() { return tpsValues; } + public DoubleMetricValue getTpsValue(String dimensionKey, String dimensionValue) { + for (DoubleMetricValue value : tpsValues) { + if (value.containDimension(dimensionKey, dimensionValue)) { + return value; + } + } + return null; + } + public CallMetric(String prefix) { this(prefix, new ArrayList<>(), new ArrayList<>()); } diff --git a/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/utils/MonitorUtils.java b/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/utils/MonitorUtils.java index 7091724943d..741cdd53d09 100644 --- a/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/utils/MonitorUtils.java +++ b/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/utils/MonitorUtils.java @@ -51,7 +51,10 @@ public static Map convertTags(Monitor monitor) { if (tags.size() != 0) { Map tagMap = new HashMap<>(); for (Tag tag : tags) { - tagMap.put(tag.getKey(), tag.getValue()); + //we don't need servo internal type tag for metrics + if (!"type".equals(tag.getKey())) { + tagMap.put(tag.getKey(), tag.getValue()); + } } return tagMap; } diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/CallMonitor.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/CallMonitor.java index fb47b9b98aa..bd2829f81a2 100644 --- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/CallMonitor.java +++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/CallMonitor.java @@ -39,20 +39,20 @@ public class CallMonitor { private final List tpsCounters; - public CallMonitor(String prefix, String... dimensions) { + public CallMonitor(String prefix, String... dimensionKeys) { this.prefix = prefix; this.totalCounters = new ArrayList<>(); this.tpsCounters = new ArrayList<>(); - if (dimensions.length == 0) { + if (dimensionKeys.length == 0) { this.totalCounters.add(new BasicCounter(MonitorConfig.builder(prefix + ".total").build())); this.tpsCounters.add(new StepCounter(MonitorConfig.builder(prefix + ".tps").build())); } else { - for (String dimension : dimensions) { - for (String option : MetricsDimension.getDimensionOptions(dimension)) { + for (String dimensionKey : dimensionKeys) { + for (String option : MetricsDimension.getDimensionOptions(dimensionKey)) { this.totalCounters - .add(new BasicCounter(MonitorConfig.builder(prefix + ".total").withTag(dimension, option).build())); + .add(new BasicCounter(MonitorConfig.builder(prefix + ".total").withTag(dimensionKey, option).build())); this.tpsCounters - .add(new StepCounter(MonitorConfig.builder(prefix + ".tps").withTag(dimension, option).build())); + .add(new StepCounter(MonitorConfig.builder(prefix + ".tps").withTag(dimensionKey, option).build())); } } } diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/ConsumerInvocationMonitor.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/ConsumerInvocationMonitor.java index 1f2f2477550..4f8f7dfb9b6 100644 --- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/ConsumerInvocationMonitor.java +++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/ConsumerInvocationMonitor.java @@ -15,11 +15,12 @@ * limitations under the License. */ -package org.apache.servicecomb.metrics.core.monitor; +package io.servicecomb.metrics.core.monitor; -import org.apache.servicecomb.metrics.common.ConsumerInvocationMetric; -import org.apache.servicecomb.metrics.common.MetricsConst; +import io.servicecomb.metrics.common.ConsumerInvocationMetric; +import io.servicecomb.metrics.common.MetricsConst; +import io.servicecomb.metrics.core.MetricsDimension; public class ConsumerInvocationMonitor extends InvocationMonitor { private final TimerMonitor consumerLatency; @@ -37,7 +38,7 @@ public CallMonitor getConsumerCall() { public ConsumerInvocationMonitor(String operationName) { super(operationName, String.format(MetricsConst.CONSUMER_PREFIX_TEMPLATE, operationName)); this.consumerLatency = new TimerMonitor(this.getPrefix() + ".consumerLatency"); - this.consumerCall = new CallMonitor(this.getPrefix() + ".consumerCall"); + this.consumerCall = new CallMonitor(this.getPrefix() + ".consumerCall", MetricsDimension.DIMENSION_STATUS); } public ConsumerInvocationMetric toMetric(int windowTimeIndex) { diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/ProducerInvocationMonitor.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/ProducerInvocationMonitor.java index 9c77ec8ced2..a5cb7c4bb3d 100644 --- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/ProducerInvocationMonitor.java +++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/ProducerInvocationMonitor.java @@ -15,14 +15,15 @@ * limitations under the License. */ -package org.apache.servicecomb.metrics.core.monitor; - -import org.apache.servicecomb.metrics.common.MetricsConst; -import org.apache.servicecomb.metrics.common.ProducerInvocationMetric; +package io.servicecomb.metrics.core.monitor; import com.netflix.servo.monitor.BasicCounter; import com.netflix.servo.monitor.MonitorConfig; +import io.servicecomb.metrics.common.MetricsConst; +import io.servicecomb.metrics.common.ProducerInvocationMetric; +import io.servicecomb.metrics.core.MetricsDimension; + public class ProducerInvocationMonitor extends InvocationMonitor { private final BasicCounter waitInQueue; @@ -60,7 +61,7 @@ public ProducerInvocationMonitor(String operationName) { this.lifeTimeInQueue = new TimerMonitor(this.getPrefix() + ".lifeTimeInQueue"); this.executionTime = new TimerMonitor(this.getPrefix() + ".executionTime"); this.producerLatency = new TimerMonitor(this.getPrefix() + ".producerLatency"); - this.producerCall = new CallMonitor(this.getPrefix() + ".producerCall"); + this.producerCall = new CallMonitor(this.getPrefix() + ".producerCall", MetricsDimension.DIMENSION_STATUS); } public ProducerInvocationMetric toMetric(int windowTimeIndex) { diff --git a/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/TestEventAndRunner.java b/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/TestEventAndRunner.java index 6edff5e07cf..fc797cb4b90 100644 --- a/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/TestEventAndRunner.java +++ b/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/TestEventAndRunner.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.servicecomb.metrics.core; +package io.servicecomb.metrics.core; import static org.hamcrest.Matchers.containsInAnyOrder; import static org.mockito.Mockito.when; @@ -29,20 +29,21 @@ import java.util.Map; import java.util.concurrent.TimeUnit; -import org.apache.servicecomb.core.metrics.InvocationFinishedEvent; -import org.apache.servicecomb.core.metrics.InvocationStartProcessingEvent; -import org.apache.servicecomb.core.metrics.InvocationStartedEvent; -import org.apache.servicecomb.foundation.common.utils.EventUtils; -import org.apache.servicecomb.metrics.common.RegistryMetric; -import org.apache.servicecomb.metrics.core.event.DefaultEventListenerManager; -import org.apache.servicecomb.metrics.core.monitor.DefaultSystemMonitor; -import org.apache.servicecomb.metrics.core.monitor.RegistryMonitor; -import org.apache.servicecomb.metrics.core.publish.DefaultDataSource; -import org.apache.servicecomb.swagger.invocation.InvocationType; import org.junit.Assert; import org.junit.Test; import org.mockito.Mockito; +import io.servicecomb.core.metrics.InvocationFinishedEvent; +import io.servicecomb.core.metrics.InvocationStartProcessingEvent; +import io.servicecomb.core.metrics.InvocationStartedEvent; +import io.servicecomb.foundation.common.utils.EventUtils; +import io.servicecomb.metrics.common.RegistryMetric; +import io.servicecomb.metrics.core.event.DefaultEventListenerManager; +import io.servicecomb.metrics.core.monitor.DefaultSystemMonitor; +import io.servicecomb.metrics.core.monitor.RegistryMonitor; +import io.servicecomb.metrics.core.publish.DefaultDataSource; +import io.servicecomb.swagger.invocation.InvocationType; + public class TestEventAndRunner { @Test @@ -75,14 +76,15 @@ public void test() throws InterruptedException { new DefaultEventListenerManager(monitor); - //fun1 is a PRODUCER invocation call twice and all is completed + //fun1 is a PRODUCER invocation call 2 time and all is completed + //two time success EventUtils.triggerEvent(new InvocationStartedEvent("fun1", InvocationType.PRODUCER, System.nanoTime())); EventUtils.triggerEvent( new InvocationStartProcessingEvent("fun1", InvocationType.PRODUCER, TimeUnit.MILLISECONDS.toNanos(100))); EventUtils .triggerEvent(new InvocationFinishedEvent("fun1", InvocationType.PRODUCER, - TimeUnit.MILLISECONDS.toNanos(200), TimeUnit.MILLISECONDS.toNanos(300))); + TimeUnit.MILLISECONDS.toNanos(200), TimeUnit.MILLISECONDS.toNanos(300), true)); EventUtils.triggerEvent(new InvocationStartedEvent("fun1", InvocationType.PRODUCER, System.nanoTime())); EventUtils.triggerEvent( @@ -90,7 +92,9 @@ public void test() throws InterruptedException { TimeUnit.MILLISECONDS.toNanos(300))); EventUtils .triggerEvent(new InvocationFinishedEvent("fun1", InvocationType.PRODUCER, - TimeUnit.MILLISECONDS.toNanos(400), TimeUnit.MILLISECONDS.toNanos(700))); + TimeUnit.MILLISECONDS.toNanos(400), TimeUnit.MILLISECONDS.toNanos(700), false)); + + //========================================================================== //fun3 is a PRODUCER invocation call uncompleted EventUtils.triggerEvent(new InvocationStartedEvent("fun3", InvocationType.PRODUCER, System.nanoTime())); @@ -98,6 +102,13 @@ public void test() throws InterruptedException { new InvocationStartProcessingEvent("fun3", InvocationType.PRODUCER, TimeUnit.MILLISECONDS.toNanos(500))); + //========================================================================== + + //fun4 is a PRODUCER call only started and no processing start and finished + EventUtils.triggerEvent(new InvocationStartedEvent("fun4", InvocationType.PRODUCER, System.nanoTime())); + + //========================================================================== + //fun2 is a CONSUMER invocation call once and completed EventUtils.triggerEvent(new InvocationStartedEvent("fun2", InvocationType.CONSUMER, System.nanoTime())); EventUtils.triggerEvent( @@ -105,10 +116,9 @@ public void test() throws InterruptedException { TimeUnit.MILLISECONDS.toNanos(100))); EventUtils .triggerEvent(new InvocationFinishedEvent("fun2", InvocationType.CONSUMER, - TimeUnit.MILLISECONDS.toNanos(200), TimeUnit.MILLISECONDS.toNanos(300))); + TimeUnit.MILLISECONDS.toNanos(200), TimeUnit.MILLISECONDS.toNanos(300), true)); - //fun4 is a invocation call only started and no processing start and finished - EventUtils.triggerEvent(new InvocationStartedEvent("fun4", InvocationType.PRODUCER, System.nanoTime())); + //========================================================================== //sim lease one window time Thread.sleep(1000); @@ -116,194 +126,176 @@ public void test() throws InterruptedException { RegistryMetric model = dataSource.getRegistryMetric(1000); //check InstanceMetric - Assert.assertEquals(model.getInstanceMetric().getProducerMetric().getWaitInQueue(), 1); - Assert.assertEquals(model.getInstanceMetric().getProducerMetric().getLifeTimeInQueue().getCount(), 3); - Assert.assertEquals(model.getInstanceMetric().getProducerMetric().getLifeTimeInQueue().getTotal(), - 900, - 0); - Assert.assertEquals(model.getInstanceMetric().getProducerMetric().getLifeTimeInQueue().getAverage(), - 300, + Assert.assertEquals(1, model.getInstanceMetric().getProducerMetric().getWaitInQueue()); + Assert.assertEquals(3, model.getInstanceMetric().getProducerMetric().getLifeTimeInQueue().getCount()); + Assert.assertEquals(900, model.getInstanceMetric().getProducerMetric().getLifeTimeInQueue().getTotal(), 0); + Assert.assertEquals(300, model.getInstanceMetric().getProducerMetric().getLifeTimeInQueue().getAverage(), 0); - Assert.assertEquals(model.getInstanceMetric().getProducerMetric().getLifeTimeInQueue().getMax(), - 500, + Assert.assertEquals(500, model.getInstanceMetric().getProducerMetric().getLifeTimeInQueue().getMax(), 0); - Assert.assertEquals(model.getInstanceMetric().getProducerMetric().getLifeTimeInQueue().getMin(), - 100, + Assert.assertEquals(100, model.getInstanceMetric().getProducerMetric().getLifeTimeInQueue().getMin(), 0); - Assert.assertEquals(model.getInstanceMetric().getProducerMetric().getExecutionTime().getCount(), 2); - Assert.assertEquals(model.getInstanceMetric().getProducerMetric().getExecutionTime().getTotal(), - 600, + Assert.assertEquals(2, model.getInstanceMetric().getProducerMetric().getExecutionTime().getCount()); + Assert.assertEquals(600, model.getInstanceMetric().getProducerMetric().getExecutionTime().getTotal(), 0); - Assert.assertEquals(model.getInstanceMetric().getProducerMetric().getExecutionTime().getAverage(), - 300, + Assert.assertEquals(300, model.getInstanceMetric().getProducerMetric().getExecutionTime().getAverage(), 0); - Assert.assertEquals(model.getInstanceMetric().getProducerMetric().getExecutionTime().getMax(), - 400, + Assert.assertEquals(400, model.getInstanceMetric().getProducerMetric().getExecutionTime().getMax(), 0); - Assert.assertEquals(model.getInstanceMetric().getProducerMetric().getExecutionTime().getMin(), - 200, + Assert.assertEquals(200, model.getInstanceMetric().getProducerMetric().getExecutionTime().getMin(), 0); - Assert.assertEquals(model.getInstanceMetric().getProducerMetric().getProducerLatency().getCount(), 2); - Assert.assertEquals(model.getInstanceMetric().getProducerMetric().getProducerLatency().getTotal(), - 1000, + Assert.assertEquals(2, model.getInstanceMetric().getProducerMetric().getProducerLatency().getCount()); + Assert.assertEquals(1000, model.getInstanceMetric().getProducerMetric().getProducerLatency().getTotal(), 0); - Assert.assertEquals(model.getInstanceMetric().getProducerMetric().getProducerLatency().getAverage(), - 500, + Assert.assertEquals(500, model.getInstanceMetric().getProducerMetric().getProducerLatency().getAverage(), 0); - Assert.assertEquals(model.getInstanceMetric().getProducerMetric().getProducerLatency().getMax(), - 700, + Assert.assertEquals(700, model.getInstanceMetric().getProducerMetric().getProducerLatency().getMax(), 0); - Assert.assertEquals(model.getInstanceMetric().getProducerMetric().getProducerLatency().getMin(), - 300, + Assert.assertEquals(300, model.getInstanceMetric().getProducerMetric().getProducerLatency().getMin(), 0); - Assert.assertEquals(model.getInstanceMetric().getProducerMetric().getProducerCall().getTps(), 4, 0); - Assert.assertEquals(model.getInstanceMetric().getProducerMetric().getProducerCall().getTotal(), 4); - - Assert.assertEquals(model.getInstanceMetric().getConsumerMetric().getConsumerLatency().getCount(), 1); - Assert.assertEquals(model.getInstanceMetric().getConsumerMetric().getConsumerLatency().getTotal(), - 300, - 0); - Assert.assertEquals(model.getInstanceMetric().getConsumerMetric().getConsumerLatency().getAverage(), - 300, - 0); - Assert.assertEquals(model.getInstanceMetric().getConsumerMetric().getConsumerLatency().getMax(), - 300, - 0); - Assert.assertEquals(model.getInstanceMetric().getConsumerMetric().getConsumerLatency().getMin(), - 300, - 0); + Assert.assertEquals(4, model.getInstanceMetric().getProducerMetric().getProducerCall() + .getTpsValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_ALL).getValue(), 0); + Assert.assertEquals(1, model.getInstanceMetric().getProducerMetric().getProducerCall() + .getTpsValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_SUCCESS).getValue(), 0); + Assert.assertEquals(1, model.getInstanceMetric().getProducerMetric().getProducerCall() + .getTpsValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_FAILED).getValue(), 0); - Assert.assertEquals(model.getInstanceMetric().getConsumerMetric().getConsumerCall().getTps(), 1, 0); - Assert.assertEquals(model.getInstanceMetric().getConsumerMetric().getConsumerCall().getTotal(), 1); + Assert.assertEquals(4, model.getInstanceMetric().getProducerMetric().getProducerCall() + .getTotalValues(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_ALL).getValue(), 0); + Assert.assertEquals(1, model.getInstanceMetric().getProducerMetric().getProducerCall() + .getTotalValues(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_SUCCESS).getValue(), 0); + Assert.assertEquals(1, model.getInstanceMetric().getProducerMetric().getProducerCall() + .getTotalValues(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_FAILED).getValue(), 0); - //check ProducerMetrics - Assert.assertEquals(model.getProducerMetrics().get("fun1").getWaitInQueue(), 0); - Assert.assertEquals(model.getProducerMetrics().get("fun1").getLifeTimeInQueue().getCount(), 2); - Assert.assertEquals(model.getProducerMetrics().get("fun1").getLifeTimeInQueue().getTotal(), - 400, + Assert.assertEquals(1, model.getInstanceMetric().getConsumerMetric().getConsumerLatency().getCount()); + Assert.assertEquals(300, model.getInstanceMetric().getConsumerMetric().getConsumerLatency().getTotal(), 0); - Assert.assertEquals(model.getProducerMetrics().get("fun1").getLifeTimeInQueue().getAverage(), - 200, + Assert.assertEquals(300, model.getInstanceMetric().getConsumerMetric().getConsumerLatency().getAverage(), 0); - Assert.assertEquals(model.getProducerMetrics().get("fun1").getLifeTimeInQueue().getMax(), - 300, + Assert.assertEquals(300, model.getInstanceMetric().getConsumerMetric().getConsumerLatency().getMax(), 0); - Assert.assertEquals(model.getProducerMetrics().get("fun1").getLifeTimeInQueue().getMin(), - 100, + Assert.assertEquals(300, model.getInstanceMetric().getConsumerMetric().getConsumerLatency().getMin(), 0); - Assert.assertEquals(model.getProducerMetrics().get("fun1").getExecutionTime().getCount(), 2); - Assert.assertEquals(model.getProducerMetrics().get("fun1").getExecutionTime().getTotal(), - 600, - 0); - Assert.assertEquals(model.getProducerMetrics().get("fun1").getExecutionTime().getAverage(), - 300, - 0); - Assert.assertEquals(model.getProducerMetrics().get("fun1").getExecutionTime().getMax(), - 400, - 0); - Assert.assertEquals(model.getProducerMetrics().get("fun1").getExecutionTime().getMin(), - 200, - 0); + Assert.assertEquals(1, model.getInstanceMetric().getConsumerMetric().getConsumerCall() + .getTpsValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_ALL).getValue(), 0); + Assert.assertEquals(1, model.getInstanceMetric().getConsumerMetric().getConsumerCall() + .getTpsValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_SUCCESS).getValue(), 0); + Assert.assertEquals(0, model.getInstanceMetric().getConsumerMetric().getConsumerCall() + .getTpsValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_FAILED).getValue(), 0); - Assert.assertEquals(model.getProducerMetrics().get("fun1").getProducerLatency().getCount(), 2); - Assert.assertEquals(model.getProducerMetrics().get("fun1").getProducerLatency().getTotal(), - 1000, - 0); - Assert.assertEquals(model.getProducerMetrics().get("fun1").getProducerLatency().getAverage(), - 500, - 0); - Assert.assertEquals(model.getProducerMetrics().get("fun1").getProducerLatency().getMax(), - 700, - 0); - Assert.assertEquals(model.getProducerMetrics().get("fun1").getProducerLatency().getMin(), - 300, - 0); + Assert.assertEquals(1, model.getInstanceMetric().getConsumerMetric().getConsumerCall() + .getTotalValues(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_ALL).getValue(), 0); + Assert.assertEquals(1, model.getInstanceMetric().getConsumerMetric().getConsumerCall() + .getTotalValues(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_SUCCESS).getValue(), 0); + Assert.assertEquals(0, model.getInstanceMetric().getConsumerMetric().getConsumerCall() + .getTotalValues(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_FAILED).getValue(), 0); - Assert.assertEquals(model.getProducerMetrics().get("fun1").getProducerCall().getTps(), 2, 0); - Assert.assertEquals(model.getProducerMetrics().get("fun1").getProducerCall().getTotal(), 2); + //check ProducerMetrics + Assert.assertEquals(0, model.getProducerMetrics().get("fun1").getWaitInQueue()); + Assert.assertEquals(2, model.getProducerMetrics().get("fun1").getLifeTimeInQueue().getCount()); + Assert.assertEquals(400, model.getProducerMetrics().get("fun1").getLifeTimeInQueue().getTotal(), 0); + Assert.assertEquals(200, model.getProducerMetrics().get("fun1").getLifeTimeInQueue().getAverage(), 0); + Assert.assertEquals(300, model.getProducerMetrics().get("fun1").getLifeTimeInQueue().getMax(), 0); + Assert.assertEquals(100, model.getProducerMetrics().get("fun1").getLifeTimeInQueue().getMin(), 0); + + Assert.assertEquals(2, model.getProducerMetrics().get("fun1").getExecutionTime().getCount()); + Assert.assertEquals(600, model.getProducerMetrics().get("fun1").getExecutionTime().getTotal(), 0); + Assert.assertEquals(300, model.getProducerMetrics().get("fun1").getExecutionTime().getAverage(), 0); + Assert.assertEquals(400, model.getProducerMetrics().get("fun1").getExecutionTime().getMax(), 0); + Assert.assertEquals(200, model.getProducerMetrics().get("fun1").getExecutionTime().getMin(), 0); + + Assert.assertEquals(2, model.getProducerMetrics().get("fun1").getProducerLatency().getCount()); + Assert.assertEquals(1000, model.getProducerMetrics().get("fun1").getProducerLatency().getTotal(), 0); + Assert.assertEquals(500, model.getProducerMetrics().get("fun1").getProducerLatency().getAverage(), 0); + Assert.assertEquals(700, model.getProducerMetrics().get("fun1").getProducerLatency().getMax(), 0); + Assert.assertEquals(300, model.getProducerMetrics().get("fun1").getProducerLatency().getMin(), 0); + + Assert.assertEquals(2, model.getProducerMetrics().get("fun1").getProducerCall() + .getTpsValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_ALL).getValue(), 0); + Assert.assertEquals(1, model.getProducerMetrics().get("fun1").getProducerCall() + .getTpsValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_SUCCESS).getValue(), 0); + Assert.assertEquals(1, model.getProducerMetrics().get("fun1").getProducerCall() + .getTpsValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_FAILED).getValue(), 0); + + Assert.assertEquals(2, model.getProducerMetrics().get("fun1").getProducerCall() + .getTotalValues(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_ALL).getValue(), 0); + Assert.assertEquals(1, model.getProducerMetrics().get("fun1").getProducerCall() + .getTotalValues(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_SUCCESS).getValue(), 0); + Assert.assertEquals(1, model.getProducerMetrics().get("fun1").getProducerCall() + .getTotalValues(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_FAILED).getValue(), 0); //fun3 - Assert.assertEquals(model.getProducerMetrics().get("fun3").getWaitInQueue(), 0); - Assert.assertEquals(model.getProducerMetrics().get("fun3").getLifeTimeInQueue().getCount(), 1); - Assert.assertEquals(model.getProducerMetrics().get("fun3").getLifeTimeInQueue().getTotal(), - 500, - 0); - Assert.assertEquals(model.getProducerMetrics().get("fun3").getLifeTimeInQueue().getAverage(), - 500, - 0); - Assert.assertEquals(model.getProducerMetrics().get("fun3").getLifeTimeInQueue().getMax(), - 500, - 0); - Assert.assertEquals(model.getProducerMetrics().get("fun3").getLifeTimeInQueue().getMin(), - 500, - 0); - - Assert.assertEquals(model.getProducerMetrics().get("fun3").getExecutionTime().getCount(), 0); - Assert.assertEquals(model.getProducerMetrics().get("fun3").getExecutionTime().getTotal(), - 0, - 0); - Assert.assertEquals(model.getProducerMetrics().get("fun3").getExecutionTime().getAverage(), - 0, - 0); - Assert.assertEquals(model.getProducerMetrics().get("fun3").getExecutionTime().getMax(), - 0, - 0); - Assert.assertEquals(model.getProducerMetrics().get("fun3").getExecutionTime().getMin(), - 0, - 0); - - Assert.assertEquals(model.getProducerMetrics().get("fun3").getProducerLatency().getCount(), 0); - Assert.assertEquals(model.getProducerMetrics().get("fun3").getProducerLatency().getTotal(), - 0, - 0); - Assert.assertEquals(model.getProducerMetrics().get("fun3").getProducerLatency().getAverage(), - 0, - 0); - Assert.assertEquals(model.getProducerMetrics().get("fun3").getProducerLatency().getMax(), - 0, - 0); - Assert.assertEquals(model.getProducerMetrics().get("fun3").getProducerLatency().getMin(), - 0, - 0); - - Assert.assertEquals(model.getProducerMetrics().get("fun3").getProducerCall().getTps(), 1, 0); - Assert.assertEquals(model.getProducerMetrics().get("fun3").getProducerCall().getTotal(), 1); + Assert.assertEquals(0, model.getProducerMetrics().get("fun3").getWaitInQueue()); + Assert.assertEquals(1, model.getProducerMetrics().get("fun3").getLifeTimeInQueue().getCount()); + Assert.assertEquals(500, model.getProducerMetrics().get("fun3").getLifeTimeInQueue().getTotal(), 0); + Assert.assertEquals(500, model.getProducerMetrics().get("fun3").getLifeTimeInQueue().getAverage(), 0); + Assert.assertEquals(500, model.getProducerMetrics().get("fun3").getLifeTimeInQueue().getMax(), 0); + Assert.assertEquals(500, model.getProducerMetrics().get("fun3").getLifeTimeInQueue().getMin(), 0); + + Assert.assertEquals(0, model.getProducerMetrics().get("fun3").getExecutionTime().getCount()); + Assert.assertEquals(0, model.getProducerMetrics().get("fun3").getExecutionTime().getTotal(), 0); + Assert.assertEquals(0, model.getProducerMetrics().get("fun3").getExecutionTime().getAverage(), 0); + Assert.assertEquals(0, model.getProducerMetrics().get("fun3").getExecutionTime().getMax(), 0); + Assert.assertEquals(0, model.getProducerMetrics().get("fun3").getExecutionTime().getMin(), 0); + + Assert.assertEquals(0, model.getProducerMetrics().get("fun3").getProducerLatency().getCount()); + Assert.assertEquals(0, model.getProducerMetrics().get("fun3").getProducerLatency().getTotal(), 0); + Assert.assertEquals(0, model.getProducerMetrics().get("fun3").getProducerLatency().getAverage(), 0); + Assert.assertEquals(0, model.getProducerMetrics().get("fun3").getProducerLatency().getMax(), 0); + Assert.assertEquals(0, model.getProducerMetrics().get("fun3").getProducerLatency().getMin(), 0); + + Assert.assertEquals(1, model.getProducerMetrics().get("fun3").getProducerCall() + .getTpsValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_ALL).getValue(), 0); + Assert.assertEquals(0, model.getProducerMetrics().get("fun3").getProducerCall() + .getTpsValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_SUCCESS).getValue(), 0); + Assert.assertEquals(0, model.getProducerMetrics().get("fun3").getProducerCall() + .getTpsValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_FAILED).getValue(), 0); + + Assert.assertEquals(1, model.getProducerMetrics().get("fun3").getProducerCall() + .getTotalValues(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_ALL).getValue(), 0); + Assert.assertEquals(0, model.getProducerMetrics().get("fun3").getProducerCall() + .getTotalValues(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_SUCCESS).getValue(), 0); + Assert.assertEquals(0, model.getProducerMetrics().get("fun3").getProducerCall() + .getTotalValues(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_FAILED).getValue(), 0); //check ConsumerMetrics //no need - Assert.assertEquals(model.getConsumerMetrics().get("fun2").getConsumerLatency().getCount(), 1); - Assert.assertEquals(model.getConsumerMetrics().get("fun2").getConsumerLatency().getTotal(), - 300, - 0); - Assert.assertEquals(model.getConsumerMetrics().get("fun2").getConsumerLatency().getAverage(), - 300, - 0); - Assert.assertEquals(model.getConsumerMetrics().get("fun2").getConsumerLatency().getMax(), - 300, - 0); - Assert.assertEquals(model.getConsumerMetrics().get("fun2").getConsumerLatency().getMin(), - 300, - 0); - - Assert.assertEquals(model.getConsumerMetrics().get("fun2").getConsumerCall().getTps(), 1, 0); - Assert.assertEquals(model.getConsumerMetrics().get("fun2").getConsumerCall().getTotal(), 1); + Assert.assertEquals(1, model.getConsumerMetrics().get("fun2").getConsumerLatency().getCount()); + Assert.assertEquals(300, model.getConsumerMetrics().get("fun2").getConsumerLatency().getTotal(), 0); + Assert.assertEquals(300, model.getConsumerMetrics().get("fun2").getConsumerLatency().getAverage(), 0); + Assert.assertEquals(300, model.getConsumerMetrics().get("fun2").getConsumerLatency().getMax(), 0); + Assert.assertEquals(300, model.getConsumerMetrics().get("fun2").getConsumerLatency().getMin(), 0); + + Assert.assertEquals(1, model.getConsumerMetrics().get("fun2").getConsumerCall() + .getTpsValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_ALL).getValue(), 0); + Assert.assertEquals(1, model.getConsumerMetrics().get("fun2").getConsumerCall() + .getTpsValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_SUCCESS).getValue(), 0); + Assert.assertEquals(0, model.getConsumerMetrics().get("fun2").getConsumerCall() + .getTpsValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_FAILED).getValue(), 0); + + Assert.assertEquals(1, model.getConsumerMetrics().get("fun2").getConsumerCall() + .getTotalValues(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_ALL).getValue(), 0); + Assert.assertEquals(1, model.getConsumerMetrics().get("fun2").getConsumerCall() + .getTotalValues(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_SUCCESS).getValue(), 0); + Assert.assertEquals(0, model.getConsumerMetrics().get("fun2").getConsumerCall() + .getTotalValues(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_FAILED).getValue(), 0); Map metrics = model.toMap(); - Assert.assertEquals(96, metrics.size()); - - Assert.assertEquals(model.getInstanceMetric().getSystemMetric().getCpuLoad(), 1.0, 0); - Assert.assertEquals(model.getInstanceMetric().getSystemMetric().getCpuRunningThreads(), 2, 0); - Assert.assertEquals(model.getInstanceMetric().getSystemMetric().getHeapCommit(), 100, 0); - Assert.assertEquals(model.getInstanceMetric().getSystemMetric().getHeapInit(), 200, 0); - Assert.assertEquals(model.getInstanceMetric().getSystemMetric().getHeapMax(), 300, 0); - Assert.assertEquals(model.getInstanceMetric().getSystemMetric().getHeapUsed(), 400, 0); - Assert.assertEquals(model.getInstanceMetric().getSystemMetric().getNonHeapCommit(), 500, 0); - Assert.assertEquals(model.getInstanceMetric().getSystemMetric().getNonHeapInit(), 600, 0); - Assert.assertEquals(model.getInstanceMetric().getSystemMetric().getNonHeapMax(), 700, 0); - Assert.assertEquals(model.getInstanceMetric().getSystemMetric().getNonHeapUsed(), 800, 0); + Assert.assertEquals(120, metrics.size()); + + Assert.assertEquals(1.0, model.getInstanceMetric().getSystemMetric().getCpuLoad(), 0); + Assert.assertEquals(2, model.getInstanceMetric().getSystemMetric().getCpuRunningThreads(), 0); + Assert.assertEquals(100, model.getInstanceMetric().getSystemMetric().getHeapCommit(), 0); + Assert.assertEquals(200, model.getInstanceMetric().getSystemMetric().getHeapInit(), 0); + Assert.assertEquals(300, model.getInstanceMetric().getSystemMetric().getHeapMax(), 0); + Assert.assertEquals(400, model.getInstanceMetric().getSystemMetric().getHeapUsed(), 0); + Assert.assertEquals(500, model.getInstanceMetric().getSystemMetric().getNonHeapCommit(), 0); + Assert.assertEquals(600, model.getInstanceMetric().getSystemMetric().getNonHeapInit(), 0); + Assert.assertEquals(700, model.getInstanceMetric().getSystemMetric().getNonHeapMax(), 0); + Assert.assertEquals(800, model.getInstanceMetric().getSystemMetric().getNonHeapUsed(), 0); } -} +} \ No newline at end of file diff --git a/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/TestPublisher.java b/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/TestPublisher.java index ef44bc7ea13..55bd7058b19 100644 --- a/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/TestPublisher.java +++ b/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/TestPublisher.java @@ -19,7 +19,6 @@ import static org.hamcrest.Matchers.containsInAnyOrder; -import java.io.IOException; import java.util.Arrays; import java.util.List; import java.util.Map; @@ -36,7 +35,7 @@ public class TestPublisher { @Test - public void test() throws IOException { + public void test() { SystemMonitor systemMonitor = new DefaultSystemMonitor(); RegistryMonitor registryMonitor = new RegistryMonitor(systemMonitor); DefaultDataSource dataSource = new DefaultDataSource(registryMonitor, "1000,2000,3000,3000,2000,1000"); @@ -44,11 +43,11 @@ public void test() throws IOException { RegistryMetric registryMetric = publisher.metrics(); Map metricsMap = registryMetric.toMap(); - Assert.assertEquals(35, metricsMap.size()); + Assert.assertEquals(31, metricsMap.size()); registryMetric = publisher.metricsWithWindowTime(1000); metricsMap = registryMetric.toMap(); - Assert.assertEquals(35, metricsMap.size()); + Assert.assertEquals(31, metricsMap.size()); List appliedWindowTime = publisher.getAppliedWindowTime(); Assert.assertEquals(appliedWindowTime.size(), 3); From 437f8031eac6911d33ea717afcc6f271f4ff80e9 Mon Sep 17 00:00:00 2001 From: zhengyangyong Date: Fri, 12 Jan 2018 14:43:23 +0800 Subject: [PATCH 04/10] SCB-150 minor refactor and fix test case Signed-off-by: zhengyangyong --- .../springmvc/client/SpringmvcClient.java | 3 +- .../demo/perf/PerfMetricsFilePublisher.java | 14 ++- .../metrics/common}/MetricsDimension.java | 2 +- .../metrics/common/CallMetric.java | 10 ++- .../InvocationFinishedEventListener.java | 2 +- .../event/InvocationStartedEventListener.java | 2 +- .../metrics/core/monitor/CallMonitor.java | 2 +- .../monitor/ConsumerInvocationMonitor.java | 2 +- .../monitor/ProducerInvocationMonitor.java | 2 +- .../metrics/core/TestEventAndRunner.java | 31 +++---- .../metrics/prometheus/MetricsCollector.java | 88 ++++++++++++++----- .../samples/mwf/TestWriteFile.java | 55 ++++++------ 12 files changed, 139 insertions(+), 74 deletions(-) rename metrics/{metrics-core/src/main/java/io/servicecomb/metrics/core => metrics-common/src/main/java/io/servicecomb/metrics/common}/MetricsDimension.java (97%) 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 3e931043253..7ee9c143c36 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 @@ -125,7 +125,8 @@ public static void run() throws Exception { .check(true, metric.getInstanceMetric().getSystemMetric().getHeapUsed() != 0); TestMgr.check(true, metric.getProducerMetrics().size() > 0); TestMgr.check(true, - metric.getProducerMetrics().get("springmvc.codeFirst.saySomething").getProducerCall().getTotal() > 0); + metric.getProducerMetrics().get("springmvc.codeFirst.saySomething").getProducerCall() + .getTotalValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_ALL).getValue() > 0); } catch (Exception e) { TestMgr.check("true", "false"); } diff --git a/demo/perf/src/main/java/org/apache/servicecomb/demo/perf/PerfMetricsFilePublisher.java b/demo/perf/src/main/java/org/apache/servicecomb/demo/perf/PerfMetricsFilePublisher.java index e2ac65ac821..8a490a0a4ed 100644 --- a/demo/perf/src/main/java/org/apache/servicecomb/demo/perf/PerfMetricsFilePublisher.java +++ b/demo/perf/src/main/java/org/apache/servicecomb/demo/perf/PerfMetricsFilePublisher.java @@ -54,8 +54,11 @@ public void onCycle() { String opName = entry.getKey(); sb.append(String .format(" %-16d%-16d%-16.3f%s\n", - entry.getValue().getConsumerCall().getTotal(), - (long) entry.getValue().getConsumerCall().getTps(), + entry.getValue().getConsumerCall() + .getTotalValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_ALL).getValue(), + entry.getValue().getConsumerCall() + .getTpsValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_ALL).getValue() + .longValue(), entry.getValue().getConsumerLatency().getAverage(), opName)); } @@ -66,8 +69,11 @@ public void onCycle() { String opName = entry.getKey(); sb.append( String.format(" %-16d%-16d%-16.3f%-16.3f%-16.3f%s\n", - entry.getValue().getProducerCall().getTotal(), - (long) entry.getValue().getProducerCall().getTps(), + entry.getValue().getProducerCall() + .getTotalValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_ALL).getValue(), + entry.getValue().getProducerCall() + .getTpsValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_ALL).getValue() + .longValue(), entry.getValue().getProducerLatency().getAverage(), entry.getValue().getLifeTimeInQueue().getAverage(), entry.getValue().getExecutionTime().getAverage(), diff --git a/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/MetricsDimension.java b/metrics/metrics-common/src/main/java/io/servicecomb/metrics/common/MetricsDimension.java similarity index 97% rename from metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/MetricsDimension.java rename to metrics/metrics-common/src/main/java/io/servicecomb/metrics/common/MetricsDimension.java index bf9170f375b..d8f661fbb46 100644 --- a/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/MetricsDimension.java +++ b/metrics/metrics-common/src/main/java/io/servicecomb/metrics/common/MetricsDimension.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package io.servicecomb.metrics.core; +package io.servicecomb.metrics.common; import io.servicecomb.foundation.common.exceptions.ServiceCombException; diff --git a/metrics/metrics-common/src/main/java/org/apache/servicecomb/metrics/common/CallMetric.java b/metrics/metrics-common/src/main/java/org/apache/servicecomb/metrics/common/CallMetric.java index f3e82d5b1ec..d313acfedc2 100644 --- a/metrics/metrics-common/src/main/java/org/apache/servicecomb/metrics/common/CallMetric.java +++ b/metrics/metrics-common/src/main/java/org/apache/servicecomb/metrics/common/CallMetric.java @@ -31,11 +31,15 @@ public class CallMetric { private final List tpsValues; - public List getTotalValues() { + public String getPrefix() { + return prefix; + } + + public List getTotalValue() { return totalValues; } - public LongMetricValue getTotalValues(String dimensionKey, String dimensionValue) { + public LongMetricValue getTotalValue(String dimensionKey, String dimensionValue) { for (LongMetricValue value : totalValues) { if (value.containDimension(dimensionKey, dimensionValue)) { return value; @@ -71,7 +75,7 @@ public CallMetric(@JsonProperty("prefix") String prefix, public CallMetric merge(CallMetric metric) { return new CallMetric(this.prefix, - LongMetricValue.merge(metric.getTotalValues(), this.getTotalValues()), + LongMetricValue.merge(metric.getTotalValue(), this.getTotalValue()), DoubleMetricValue.merge(metric.getTpsValues(), this.getTpsValues())); } diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/InvocationFinishedEventListener.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/InvocationFinishedEventListener.java index 9e2d6876cf9..a802a49ed41 100644 --- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/InvocationFinishedEventListener.java +++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/InvocationFinishedEventListener.java @@ -20,7 +20,7 @@ import io.servicecomb.core.metrics.InvocationFinishedEvent; import io.servicecomb.foundation.common.event.Event; import io.servicecomb.foundation.common.event.EventListener; -import io.servicecomb.metrics.core.MetricsDimension; +import io.servicecomb.metrics.common.MetricsDimension; import io.servicecomb.metrics.core.monitor.ConsumerInvocationMonitor; import io.servicecomb.metrics.core.monitor.ProducerInvocationMonitor; import io.servicecomb.metrics.core.monitor.RegistryMonitor; diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/InvocationStartedEventListener.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/InvocationStartedEventListener.java index f7516bb8596..2ea0fee02d8 100644 --- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/InvocationStartedEventListener.java +++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/InvocationStartedEventListener.java @@ -20,7 +20,7 @@ import io.servicecomb.core.metrics.InvocationStartedEvent; import io.servicecomb.foundation.common.event.Event; import io.servicecomb.foundation.common.event.EventListener; -import io.servicecomb.metrics.core.MetricsDimension; +import io.servicecomb.metrics.common.MetricsDimension; import io.servicecomb.metrics.core.monitor.ConsumerInvocationMonitor; import io.servicecomb.metrics.core.monitor.ProducerInvocationMonitor; import io.servicecomb.metrics.core.monitor.RegistryMonitor; diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/CallMonitor.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/CallMonitor.java index bd2829f81a2..986592d1450 100644 --- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/CallMonitor.java +++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/CallMonitor.java @@ -29,7 +29,7 @@ import io.servicecomb.metrics.common.CallMetric; import io.servicecomb.metrics.common.DoubleMetricValue; import io.servicecomb.metrics.common.LongMetricValue; -import io.servicecomb.metrics.core.MetricsDimension; +import io.servicecomb.metrics.common.MetricsDimension; import io.servicecomb.metrics.core.utils.MonitorUtils; public class CallMonitor { diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/ConsumerInvocationMonitor.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/ConsumerInvocationMonitor.java index 4f8f7dfb9b6..076ecd1a91c 100644 --- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/ConsumerInvocationMonitor.java +++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/ConsumerInvocationMonitor.java @@ -20,7 +20,7 @@ import io.servicecomb.metrics.common.ConsumerInvocationMetric; import io.servicecomb.metrics.common.MetricsConst; -import io.servicecomb.metrics.core.MetricsDimension; +import io.servicecomb.metrics.common.MetricsDimension; public class ConsumerInvocationMonitor extends InvocationMonitor { private final TimerMonitor consumerLatency; diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/ProducerInvocationMonitor.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/ProducerInvocationMonitor.java index a5cb7c4bb3d..82d426f0e08 100644 --- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/ProducerInvocationMonitor.java +++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/ProducerInvocationMonitor.java @@ -21,8 +21,8 @@ import com.netflix.servo.monitor.MonitorConfig; import io.servicecomb.metrics.common.MetricsConst; +import io.servicecomb.metrics.common.MetricsDimension; import io.servicecomb.metrics.common.ProducerInvocationMetric; -import io.servicecomb.metrics.core.MetricsDimension; public class ProducerInvocationMonitor extends InvocationMonitor { private final BasicCounter waitInQueue; diff --git a/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/TestEventAndRunner.java b/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/TestEventAndRunner.java index fc797cb4b90..c897bf117df 100644 --- a/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/TestEventAndRunner.java +++ b/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/TestEventAndRunner.java @@ -37,6 +37,7 @@ import io.servicecomb.core.metrics.InvocationStartProcessingEvent; import io.servicecomb.core.metrics.InvocationStartedEvent; import io.servicecomb.foundation.common.utils.EventUtils; +import io.servicecomb.metrics.common.MetricsDimension; import io.servicecomb.metrics.common.RegistryMetric; import io.servicecomb.metrics.core.event.DefaultEventListenerManager; import io.servicecomb.metrics.core.monitor.DefaultSystemMonitor; @@ -164,11 +165,11 @@ public void test() throws InterruptedException { .getTpsValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_FAILED).getValue(), 0); Assert.assertEquals(4, model.getInstanceMetric().getProducerMetric().getProducerCall() - .getTotalValues(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_ALL).getValue(), 0); + .getTotalValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_ALL).getValue(), 0); Assert.assertEquals(1, model.getInstanceMetric().getProducerMetric().getProducerCall() - .getTotalValues(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_SUCCESS).getValue(), 0); + .getTotalValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_SUCCESS).getValue(), 0); Assert.assertEquals(1, model.getInstanceMetric().getProducerMetric().getProducerCall() - .getTotalValues(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_FAILED).getValue(), 0); + .getTotalValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_FAILED).getValue(), 0); Assert.assertEquals(1, model.getInstanceMetric().getConsumerMetric().getConsumerLatency().getCount()); Assert.assertEquals(300, model.getInstanceMetric().getConsumerMetric().getConsumerLatency().getTotal(), @@ -188,11 +189,11 @@ public void test() throws InterruptedException { .getTpsValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_FAILED).getValue(), 0); Assert.assertEquals(1, model.getInstanceMetric().getConsumerMetric().getConsumerCall() - .getTotalValues(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_ALL).getValue(), 0); + .getTotalValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_ALL).getValue(), 0); Assert.assertEquals(1, model.getInstanceMetric().getConsumerMetric().getConsumerCall() - .getTotalValues(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_SUCCESS).getValue(), 0); + .getTotalValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_SUCCESS).getValue(), 0); Assert.assertEquals(0, model.getInstanceMetric().getConsumerMetric().getConsumerCall() - .getTotalValues(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_FAILED).getValue(), 0); + .getTotalValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_FAILED).getValue(), 0); //check ProducerMetrics Assert.assertEquals(0, model.getProducerMetrics().get("fun1").getWaitInQueue()); @@ -222,11 +223,11 @@ public void test() throws InterruptedException { .getTpsValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_FAILED).getValue(), 0); Assert.assertEquals(2, model.getProducerMetrics().get("fun1").getProducerCall() - .getTotalValues(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_ALL).getValue(), 0); + .getTotalValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_ALL).getValue(), 0); Assert.assertEquals(1, model.getProducerMetrics().get("fun1").getProducerCall() - .getTotalValues(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_SUCCESS).getValue(), 0); + .getTotalValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_SUCCESS).getValue(), 0); Assert.assertEquals(1, model.getProducerMetrics().get("fun1").getProducerCall() - .getTotalValues(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_FAILED).getValue(), 0); + .getTotalValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_FAILED).getValue(), 0); //fun3 Assert.assertEquals(0, model.getProducerMetrics().get("fun3").getWaitInQueue()); @@ -256,11 +257,11 @@ public void test() throws InterruptedException { .getTpsValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_FAILED).getValue(), 0); Assert.assertEquals(1, model.getProducerMetrics().get("fun3").getProducerCall() - .getTotalValues(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_ALL).getValue(), 0); + .getTotalValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_ALL).getValue(), 0); Assert.assertEquals(0, model.getProducerMetrics().get("fun3").getProducerCall() - .getTotalValues(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_SUCCESS).getValue(), 0); + .getTotalValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_SUCCESS).getValue(), 0); Assert.assertEquals(0, model.getProducerMetrics().get("fun3").getProducerCall() - .getTotalValues(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_FAILED).getValue(), 0); + .getTotalValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_FAILED).getValue(), 0); //check ConsumerMetrics //no need @@ -278,11 +279,11 @@ public void test() throws InterruptedException { .getTpsValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_FAILED).getValue(), 0); Assert.assertEquals(1, model.getConsumerMetrics().get("fun2").getConsumerCall() - .getTotalValues(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_ALL).getValue(), 0); + .getTotalValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_ALL).getValue(), 0); Assert.assertEquals(1, model.getConsumerMetrics().get("fun2").getConsumerCall() - .getTotalValues(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_SUCCESS).getValue(), 0); + .getTotalValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_SUCCESS).getValue(), 0); Assert.assertEquals(0, model.getConsumerMetrics().get("fun2").getConsumerCall() - .getTotalValues(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_FAILED).getValue(), 0); + .getTotalValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_FAILED).getValue(), 0); Map metrics = model.toMap(); Assert.assertEquals(120, metrics.size()); diff --git a/metrics/metrics-integration/metrics-prometheus/src/main/java/org/apache/servicecomb/metrics/prometheus/MetricsCollector.java b/metrics/metrics-integration/metrics-prometheus/src/main/java/org/apache/servicecomb/metrics/prometheus/MetricsCollector.java index a17310b8205..bad097b86a4 100644 --- a/metrics/metrics-integration/metrics-prometheus/src/main/java/org/apache/servicecomb/metrics/prometheus/MetricsCollector.java +++ b/metrics/metrics-integration/metrics-prometheus/src/main/java/org/apache/servicecomb/metrics/prometheus/MetricsCollector.java @@ -15,23 +15,25 @@ * limitations under the License. */ -package org.apache.servicecomb.metrics.prometheus; +package io.servicecomb.metrics.prometheus; import java.util.ArrayList; import java.util.List; import java.util.Map; -import java.util.Map.Entry; import java.util.stream.Collectors; -import org.apache.servicecomb.metrics.common.ConsumerInvocationMetric; -import org.apache.servicecomb.metrics.common.ProducerInvocationMetric; -import org.apache.servicecomb.metrics.common.RegistryMetric; -import org.apache.servicecomb.metrics.core.publish.DataSource; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import io.prometheus.client.Collector; import io.prometheus.client.Collector.MetricFamilySamples.Sample; +import io.servicecomb.metrics.common.CallMetric; +import io.servicecomb.metrics.common.ConsumerInvocationMetric; +import io.servicecomb.metrics.common.DoubleMetricValue; +import io.servicecomb.metrics.common.LongMetricValue; +import io.servicecomb.metrics.common.ProducerInvocationMetric; +import io.servicecomb.metrics.common.RegistryMetric; +import io.servicecomb.metrics.core.publish.DataSource; @Component public class MetricsCollector extends Collector implements Collector.Describable { @@ -56,24 +58,70 @@ public List describe() { private List load() { RegistryMetric registryMetric = dataSource.getRegistryMetric(); List familySamples = new ArrayList<>(); - familySamples.add(getFamilySamples("Instance Level", registryMetric.getInstanceMetric().toMap())); - for (Entry consumerMetric : registryMetric.getConsumerMetrics().entrySet()) { - familySamples - .add(getFamilySamples(consumerMetric.getKey() + " Consumer Side", consumerMetric.getValue().toMap())); + + List samples = new ArrayList<>(); + samples.addAll(convertMetricValues(registryMetric.getInstanceMetric().getSystemMetric().toMap())); + samples.addAll(convertConsumerMetric(registryMetric.getInstanceMetric().getConsumerMetric())); + samples.addAll(convertCallMetric(registryMetric.getInstanceMetric().getConsumerMetric().getConsumerCall())); + samples.addAll(convertProducerMetric(registryMetric.getInstanceMetric().getProducerMetric())); + samples.addAll(convertCallMetric(registryMetric.getInstanceMetric().getProducerMetric().getProducerCall())); + familySamples.add(new MetricFamilySamples("Instance Level", Type.UNTYPED, "Instance Level Metrics", samples)); + + if (registryMetric.getConsumerMetrics().size() != 0) { + samples = new ArrayList<>(); + for (ConsumerInvocationMetric metric : registryMetric.getConsumerMetrics().values()) { + samples.addAll(convertConsumerMetric(metric)); + samples.addAll(convertCallMetric(metric.getConsumerCall())); + } + familySamples.add(new MetricFamilySamples("Consumer Side", Type.UNTYPED, "Consumer Side Metrics", samples)); } - for (Entry producerMetric : registryMetric.getProducerMetrics().entrySet()) { - familySamples - .add(getFamilySamples(producerMetric.getKey() + " Producer Side", producerMetric.getValue().toMap())); + + if (registryMetric.getProducerMetrics().size() != 0) { + samples = new ArrayList<>(); + for (ProducerInvocationMetric metric : registryMetric.getProducerMetrics().values()) { + samples.addAll(convertProducerMetric(metric)); + samples.addAll(convertCallMetric(metric.getProducerCall())); + } + familySamples.add(new MetricFamilySamples("Producer Side", Type.UNTYPED, "Producer Side Metrics", samples)); } + return familySamples; } - private MetricFamilySamples getFamilySamples(String name, Map metrics) { - List samples = metrics.entrySet() - .stream() - .map((entry) -> new Sample(entry.getKey().replace(".", "_"), - new ArrayList<>(), new ArrayList<>(), entry.getValue().doubleValue())) - .collect(Collectors.toList()); - return new MetricFamilySamples(name, Type.UNTYPED, name + " Metrics", samples); + private List convertConsumerMetric(ConsumerInvocationMetric metric) { + return convertMetricValues(metric.getConsumerLatency().toMap()); + } + + private List convertProducerMetric(ProducerInvocationMetric metric) { + List samples = new ArrayList<>(); + samples.addAll(convertMetricValues(metric.getExecutionTime().toMap())); + samples.addAll(convertMetricValues(metric.getLifeTimeInQueue().toMap())); + samples.addAll(convertMetricValues(metric.getProducerLatency().toMap())); + samples.add(new Sample(metric.getPrefix() + ".waitInQueue.count", new ArrayList<>(), new ArrayList<>(), + (double) metric.getWaitInQueue())); + return samples; + } + + private List convertMetricValues(Map metrics) { + return metrics.entrySet().stream().map((entry) -> + new Sample(entry.getKey().replace(".", "_"), + new ArrayList<>(), new ArrayList<>(), entry.getValue().doubleValue())).collect(Collectors.toList()); + } + + private List convertCallMetric(CallMetric metric) { + List samples = new ArrayList<>(); + String totalName = (metric.getPrefix() + ".total").replace(".", "_"); + for (LongMetricValue value : metric.getTotalValue()) { + samples.add(new Sample(totalName, + new ArrayList<>(value.getDimensions().keySet()), new ArrayList<>(value.getDimensions().values()), + (double) value.getValue())); + } + String tpsName = (metric.getPrefix() + ".tps").replace(".", "_"); + for (DoubleMetricValue value : metric.getTpsValues()) { + samples.add(new Sample(tpsName, + new ArrayList<>(value.getDimensions().keySet()), new ArrayList<>(value.getDimensions().values()), + value.getValue())); + } + return samples; } } diff --git a/samples/metrics-write-file-sample/metrics-write-file/src/test/java/org/apache/servicecomb/samples/mwf/TestWriteFile.java b/samples/metrics-write-file-sample/metrics-write-file/src/test/java/org/apache/servicecomb/samples/mwf/TestWriteFile.java index 6cf6ab2bb04..d73d30d44fb 100644 --- a/samples/metrics-write-file-sample/metrics-write-file/src/test/java/org/apache/servicecomb/samples/mwf/TestWriteFile.java +++ b/samples/metrics-write-file-sample/metrics-write-file/src/test/java/org/apache/servicecomb/samples/mwf/TestWriteFile.java @@ -15,32 +15,35 @@ * limitations under the License. */ -package org.apache.servicecomb.samples.mwf; +package io.servicecomb.samples.mwf; +import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; -import org.apache.servicecomb.metrics.common.CallMetric; -import org.apache.servicecomb.metrics.common.ConsumerInvocationMetric; -import org.apache.servicecomb.metrics.common.RegistryMetric; -import org.apache.servicecomb.metrics.common.SystemMetric; -import org.apache.servicecomb.metrics.common.TimerMetric; -import org.apache.servicecomb.metrics.core.publish.DataSource; -import org.apache.servicecomb.serviceregistry.Features; -import org.apache.servicecomb.serviceregistry.RegistryUtils; -import org.apache.servicecomb.serviceregistry.ServiceRegistry; -import org.apache.servicecomb.serviceregistry.api.registry.Microservice; -import org.apache.servicecomb.serviceregistry.api.registry.MicroserviceInstance; -import org.apache.servicecomb.serviceregistry.cache.InstanceCacheManager; -import org.apache.servicecomb.serviceregistry.client.ServiceRegistryClient; -import org.apache.servicecomb.serviceregistry.client.http.MicroserviceInstances; -import org.apache.servicecomb.serviceregistry.consumer.AppManager; import org.junit.Assert; import org.junit.Test; import org.mockito.Mockito; +import io.servicecomb.metrics.common.CallMetric; +import io.servicecomb.metrics.common.ConsumerInvocationMetric; +import io.servicecomb.metrics.common.DoubleMetricValue; +import io.servicecomb.metrics.common.LongMetricValue; +import io.servicecomb.metrics.common.RegistryMetric; +import io.servicecomb.metrics.common.SystemMetric; +import io.servicecomb.metrics.common.TimerMetric; +import io.servicecomb.metrics.core.publish.DataSource; +import io.servicecomb.serviceregistry.Features; +import io.servicecomb.serviceregistry.RegistryUtils; +import io.servicecomb.serviceregistry.ServiceRegistry; +import io.servicecomb.serviceregistry.api.registry.Microservice; +import io.servicecomb.serviceregistry.api.registry.MicroserviceInstance; +import io.servicecomb.serviceregistry.cache.InstanceCacheManager; +import io.servicecomb.serviceregistry.client.ServiceRegistryClient; +import io.servicecomb.serviceregistry.client.http.MicroserviceInstances; +import io.servicecomb.serviceregistry.consumer.AppManager; import mockit.Expectations; public class TestWriteFile { @@ -134,20 +137,22 @@ public Features getFeatures() { StringBuilder builder = new StringBuilder(); - MetricsFileWriter writer = - (loggerName, filePrefix, content) -> builder.append(loggerName).append(filePrefix).append(content); + MetricsFileWriter writer = (loggerName, filePrefix, content) -> + builder.append(loggerName).append(filePrefix).append(content); SystemMetric systemMetric = new SystemMetric(50, 10, 1, 2, 3, 4, 5, 6, 7, 8); Map consumerInvocationMetricMap = new HashMap<>(); - consumerInvocationMetricMap.put("A", - new ConsumerInvocationMetric("A", "A", - new TimerMetric("A1", 1, 2, 3, 4), new CallMetric("A2", 100, 999.44444))); - - consumerInvocationMetricMap.put("B", - new ConsumerInvocationMetric("B", "B", - new TimerMetric("B1", 1, 2, 3, 4), new CallMetric("B2", 100, 888.66666))); + consumerInvocationMetricMap.put("A", new ConsumerInvocationMetric("A", "A", + new TimerMetric("A1", 1, 2, 3, 4), + new CallMetric("A2", Arrays.asList(new LongMetricValue("A2", 100L, new HashMap<>())), + Arrays.asList(new DoubleMetricValue("A2", 999.44444, new HashMap<>()))))); + + consumerInvocationMetricMap.put("B", new ConsumerInvocationMetric("B", "B", + new TimerMetric("B1", 1, 2, 3, 4), + new CallMetric("B2", Arrays.asList(new LongMetricValue("B2", 100L, new HashMap<>())), + Arrays.asList(new DoubleMetricValue("B2", 888.66666, new HashMap<>()))))); RegistryMetric metric = new RegistryMetric(systemMetric, consumerInvocationMetricMap, new HashMap<>()); From 5659a4dbfedfcee4585b40fda745a3c76d2f620f Mon Sep 17 00:00:00 2001 From: zhengyangyong Date: Fri, 12 Jan 2018 15:23:14 +0800 Subject: [PATCH 05/10] SCB-150 minor refactor for prometheus Signed-off-by: zhengyangyong --- .../core/monitor/DefaultSystemMonitor.java | 9 ++------- .../metrics/prometheus/MetricsCollector.java | 18 ++++++++++++------ 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/DefaultSystemMonitor.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/DefaultSystemMonitor.java index 3541d82f8f9..5977521327a 100644 --- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/DefaultSystemMonitor.java +++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/DefaultSystemMonitor.java @@ -98,12 +98,7 @@ public long getNonHeapUsed() { @Override public SystemMetric toMetric() { - return new SystemMetric(adjustValue(getCpuLoad()), - getCpuRunningThreads(), getHeapInit(), getHeapMax(), getHeapCommit(), getHeapUsed(), - getNonHeapInit(), getNonHeapMax(), getNonHeapCommit(), getNonHeapUsed()); - } - - private double adjustValue(double value) { - return value < 0 ? Double.NaN : value; + return new SystemMetric(getCpuLoad(), getCpuRunningThreads(), getHeapInit(), getHeapMax(), getHeapCommit(), + getHeapUsed(), getNonHeapInit(), getNonHeapMax(), getNonHeapCommit(), getNonHeapUsed()); } } diff --git a/metrics/metrics-integration/metrics-prometheus/src/main/java/org/apache/servicecomb/metrics/prometheus/MetricsCollector.java b/metrics/metrics-integration/metrics-prometheus/src/main/java/org/apache/servicecomb/metrics/prometheus/MetricsCollector.java index bad097b86a4..b22d8ea2b3e 100644 --- a/metrics/metrics-integration/metrics-prometheus/src/main/java/org/apache/servicecomb/metrics/prometheus/MetricsCollector.java +++ b/metrics/metrics-integration/metrics-prometheus/src/main/java/org/apache/servicecomb/metrics/prometheus/MetricsCollector.java @@ -97,26 +97,27 @@ private List convertProducerMetric(ProducerInvocationMetric metric) { samples.addAll(convertMetricValues(metric.getExecutionTime().toMap())); samples.addAll(convertMetricValues(metric.getLifeTimeInQueue().toMap())); samples.addAll(convertMetricValues(metric.getProducerLatency().toMap())); - samples.add(new Sample(metric.getPrefix() + ".waitInQueue.count", new ArrayList<>(), new ArrayList<>(), - (double) metric.getWaitInQueue())); + samples.add( + new Sample(formatMetricName(metric.getPrefix() + ".waitInQueue.count"), new ArrayList<>(), new ArrayList<>(), + (double) metric.getWaitInQueue())); return samples; } private List convertMetricValues(Map metrics) { return metrics.entrySet().stream().map((entry) -> - new Sample(entry.getKey().replace(".", "_"), - new ArrayList<>(), new ArrayList<>(), entry.getValue().doubleValue())).collect(Collectors.toList()); + new Sample(formatMetricName(entry.getKey()), new ArrayList<>(), new ArrayList<>(), + entry.getValue().doubleValue())).collect(Collectors.toList()); } private List convertCallMetric(CallMetric metric) { List samples = new ArrayList<>(); - String totalName = (metric.getPrefix() + ".total").replace(".", "_"); + String totalName = formatMetricName(metric.getPrefix() + ".total"); for (LongMetricValue value : metric.getTotalValue()) { samples.add(new Sample(totalName, new ArrayList<>(value.getDimensions().keySet()), new ArrayList<>(value.getDimensions().values()), (double) value.getValue())); } - String tpsName = (metric.getPrefix() + ".tps").replace(".", "_"); + String tpsName = formatMetricName(metric.getPrefix() + ".tps"); for (DoubleMetricValue value : metric.getTpsValues()) { samples.add(new Sample(tpsName, new ArrayList<>(value.getDimensions().keySet()), new ArrayList<>(value.getDimensions().values()), @@ -124,4 +125,9 @@ private List convertCallMetric(CallMetric metric) { } return samples; } + + //convert name for match prometheus + private String formatMetricName(String name) { + return name.replace(".", "_"); + } } From bf0e84d26de812063c3bcd6986745d4744aa8faa Mon Sep 17 00:00:00 2001 From: zhengyangyong Date: Fri, 12 Jan 2018 15:45:09 +0800 Subject: [PATCH 06/10] SCB-150 add module name Signed-off-by: zhengyangyong --- metrics/metrics-extension/pom.xml | 1 + metrics/metrics-integration/metrics-prometheus/pom.xml | 1 + 2 files changed, 2 insertions(+) diff --git a/metrics/metrics-extension/pom.xml b/metrics/metrics-extension/pom.xml index 1d642308d4e..ecd2f6e3a48 100644 --- a/metrics/metrics-extension/pom.xml +++ b/metrics/metrics-extension/pom.xml @@ -27,6 +27,7 @@ 4.0.0 metrics-extension + Java Chassis::Metrics::Extension pom \ No newline at end of file diff --git a/metrics/metrics-integration/metrics-prometheus/pom.xml b/metrics/metrics-integration/metrics-prometheus/pom.xml index 684749a718c..0ff0beaaa94 100644 --- a/metrics/metrics-integration/metrics-prometheus/pom.xml +++ b/metrics/metrics-integration/metrics-prometheus/pom.xml @@ -27,6 +27,7 @@ 4.0.0 metrics-prometheus + Java Chassis::Metrics::Prometheus Integration From 17f62f37324030dd70e516cb4efa4aa96c0a3895 Mon Sep 17 00:00:00 2001 From: zhengyangyong Date: Fri, 12 Jan 2018 16:07:38 +0800 Subject: [PATCH 07/10] SCB-150 fix RegistryMetric serialization Signed-off-by: zhengyangyong --- .../org/apache/servicecomb/metrics/common/CallMetric.java | 4 ++-- .../servicecomb/metrics/prometheus/MetricsCollector.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/metrics/metrics-common/src/main/java/org/apache/servicecomb/metrics/common/CallMetric.java b/metrics/metrics-common/src/main/java/org/apache/servicecomb/metrics/common/CallMetric.java index d313acfedc2..56d0f99e5a4 100644 --- a/metrics/metrics-common/src/main/java/org/apache/servicecomb/metrics/common/CallMetric.java +++ b/metrics/metrics-common/src/main/java/org/apache/servicecomb/metrics/common/CallMetric.java @@ -35,7 +35,7 @@ public String getPrefix() { return prefix; } - public List getTotalValue() { + public List getTotalValues() { return totalValues; } @@ -75,7 +75,7 @@ public CallMetric(@JsonProperty("prefix") String prefix, public CallMetric merge(CallMetric metric) { return new CallMetric(this.prefix, - LongMetricValue.merge(metric.getTotalValue(), this.getTotalValue()), + LongMetricValue.merge(metric.getTotalValues(), this.getTotalValues()), DoubleMetricValue.merge(metric.getTpsValues(), this.getTpsValues())); } diff --git a/metrics/metrics-integration/metrics-prometheus/src/main/java/org/apache/servicecomb/metrics/prometheus/MetricsCollector.java b/metrics/metrics-integration/metrics-prometheus/src/main/java/org/apache/servicecomb/metrics/prometheus/MetricsCollector.java index b22d8ea2b3e..f7847222dc5 100644 --- a/metrics/metrics-integration/metrics-prometheus/src/main/java/org/apache/servicecomb/metrics/prometheus/MetricsCollector.java +++ b/metrics/metrics-integration/metrics-prometheus/src/main/java/org/apache/servicecomb/metrics/prometheus/MetricsCollector.java @@ -112,7 +112,7 @@ private List convertMetricValues(Map metrics) { private List convertCallMetric(CallMetric metric) { List samples = new ArrayList<>(); String totalName = formatMetricName(metric.getPrefix() + ".total"); - for (LongMetricValue value : metric.getTotalValue()) { + for (LongMetricValue value : metric.getTotalValues()) { samples.add(new Sample(totalName, new ArrayList<>(value.getDimensions().keySet()), new ArrayList<>(value.getDimensions().values()), (double) value.getValue())); From 3c612f49b4837b22d74db5bf4e3bc806fc4db7ac Mon Sep 17 00:00:00 2001 From: zhengyangyong Date: Mon, 15 Jan 2018 09:22:02 +0800 Subject: [PATCH 08/10] SCB-150 update package name and resolve conflicts Signed-off-by: zhengyangyong --- .../springmvc/client/SpringmvcClient.java | 3 +- .../demo/perf/PerfMetricsFilePublisher.java | 1 + metrics/metrics-common/pom.xml | 2 +- .../metrics/common/DoubleMetricValue.java | 8 ++-- .../metrics/common/LongMetricValue.java | 8 ++-- .../metrics/common/MetricValue.java | 2 +- .../metrics/common/MetricsDimension.java | 4 +- .../InvocationFinishedEventListener.java | 18 ++++---- .../event/InvocationStartedEventListener.java | 18 ++++---- .../metrics/core/monitor/CallMonitor.java | 14 +++--- .../monitor/ConsumerInvocationMonitor.java | 8 ++-- .../monitor/ProducerInvocationMonitor.java | 10 ++--- .../metrics/core/monitor/TimerMonitor.java | 8 ++-- .../metrics/core/utils/MonitorUtils.java | 2 +- .../metrics/core/TestEventAndRunner.java | 25 +++++------ .../metrics/prometheus/MetricsCollector.java | 16 +++---- .../samples/mwf/TestWriteFile.java | 45 ++++++++++--------- 17 files changed, 96 insertions(+), 96 deletions(-) rename metrics/metrics-common/src/main/java/{io => org/apache}/servicecomb/metrics/common/DoubleMetricValue.java (92%) rename metrics/metrics-common/src/main/java/{io => org/apache}/servicecomb/metrics/common/LongMetricValue.java (92%) rename metrics/metrics-common/src/main/java/{io => org/apache}/servicecomb/metrics/common/MetricValue.java (97%) rename metrics/metrics-common/src/main/java/{io => org/apache}/servicecomb/metrics/common/MetricsDimension.java (91%) rename metrics/metrics-core/src/main/java/{io => org/apache}/servicecomb/metrics/core/utils/MonitorUtils.java (98%) 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 7ee9c143c36..08eec9bebd1 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 @@ -29,6 +29,7 @@ import org.apache.servicecomb.foundation.common.utils.BeanUtils; import org.apache.servicecomb.foundation.common.utils.JsonUtils; import org.apache.servicecomb.foundation.common.utils.Log4jUtils; +import org.apache.servicecomb.metrics.common.MetricsDimension; import org.apache.servicecomb.metrics.common.MetricsPublisher; import org.apache.servicecomb.metrics.common.RegistryMetric; import org.apache.servicecomb.provider.springmvc.reference.CseRestTemplate; @@ -58,7 +59,7 @@ public static void main(String[] args) throws Exception { TestMgr.summary(); } - public static void run() throws Exception { + public static void run() { templateUrlWithServiceName.setRequestFactory(new UrlWithServiceNameClientHttpRequestFactory()); restTemplate = RestTemplateBuilder.create(); controller = BeanUtils.getBean("controller"); diff --git a/demo/perf/src/main/java/org/apache/servicecomb/demo/perf/PerfMetricsFilePublisher.java b/demo/perf/src/main/java/org/apache/servicecomb/demo/perf/PerfMetricsFilePublisher.java index 8a490a0a4ed..f04fdcdbd95 100644 --- a/demo/perf/src/main/java/org/apache/servicecomb/demo/perf/PerfMetricsFilePublisher.java +++ b/demo/perf/src/main/java/org/apache/servicecomb/demo/perf/PerfMetricsFilePublisher.java @@ -19,6 +19,7 @@ import java.util.Map.Entry; import org.apache.servicecomb.metrics.common.ConsumerInvocationMetric; +import org.apache.servicecomb.metrics.common.MetricsDimension; import org.apache.servicecomb.metrics.common.ProducerInvocationMetric; import org.apache.servicecomb.metrics.common.RegistryMetric; import org.apache.servicecomb.metrics.core.publish.DataSource; diff --git a/metrics/metrics-common/pom.xml b/metrics/metrics-common/pom.xml index 5987595fc7c..3ac7fae605a 100644 --- a/metrics/metrics-common/pom.xml +++ b/metrics/metrics-common/pom.xml @@ -31,7 +31,7 @@ - io.servicecomb + org.apache.servicecomb foundation-common diff --git a/metrics/metrics-common/src/main/java/io/servicecomb/metrics/common/DoubleMetricValue.java b/metrics/metrics-common/src/main/java/org/apache/servicecomb/metrics/common/DoubleMetricValue.java similarity index 92% rename from metrics/metrics-common/src/main/java/io/servicecomb/metrics/common/DoubleMetricValue.java rename to metrics/metrics-common/src/main/java/org/apache/servicecomb/metrics/common/DoubleMetricValue.java index 8b831913dd2..30a7790373f 100644 --- a/metrics/metrics-common/src/main/java/io/servicecomb/metrics/common/DoubleMetricValue.java +++ b/metrics/metrics-common/src/main/java/org/apache/servicecomb/metrics/common/DoubleMetricValue.java @@ -15,16 +15,16 @@ * limitations under the License. */ -package io.servicecomb.metrics.common; +package org.apache.servicecomb.metrics.common; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; -import com.fasterxml.jackson.annotation.JsonProperty; +import org.apache.servicecomb.foundation.common.exceptions.ServiceCombException; -import io.servicecomb.foundation.common.exceptions.ServiceCombException; +import com.fasterxml.jackson.annotation.JsonProperty; public class DoubleMetricValue extends MetricValue { public DoubleMetricValue(Double value, Map dimensions) { @@ -37,7 +37,7 @@ public DoubleMetricValue(@JsonProperty("key") String key, super(key, value, dimensions); } - public DoubleMetricValue merge(DoubleMetricValue value) { + private DoubleMetricValue merge(DoubleMetricValue value) { if (this.getKey().equals(value.getKey())) { return new DoubleMetricValue(this.getKey(), this.getValue() + value.getValue(), this.getDimensions()); } diff --git a/metrics/metrics-common/src/main/java/io/servicecomb/metrics/common/LongMetricValue.java b/metrics/metrics-common/src/main/java/org/apache/servicecomb/metrics/common/LongMetricValue.java similarity index 92% rename from metrics/metrics-common/src/main/java/io/servicecomb/metrics/common/LongMetricValue.java rename to metrics/metrics-common/src/main/java/org/apache/servicecomb/metrics/common/LongMetricValue.java index 6f7429c5aca..84babff5279 100644 --- a/metrics/metrics-common/src/main/java/io/servicecomb/metrics/common/LongMetricValue.java +++ b/metrics/metrics-common/src/main/java/org/apache/servicecomb/metrics/common/LongMetricValue.java @@ -15,16 +15,16 @@ * limitations under the License. */ -package io.servicecomb.metrics.common; +package org.apache.servicecomb.metrics.common; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; -import com.fasterxml.jackson.annotation.JsonProperty; +import org.apache.servicecomb.foundation.common.exceptions.ServiceCombException; -import io.servicecomb.foundation.common.exceptions.ServiceCombException; +import com.fasterxml.jackson.annotation.JsonProperty; public class LongMetricValue extends MetricValue { public LongMetricValue(Long value, Map dimensions) { @@ -37,7 +37,7 @@ public LongMetricValue(@JsonProperty("key") String key, super(key, value, dimensions); } - public LongMetricValue merge(LongMetricValue value) { + private LongMetricValue merge(LongMetricValue value) { if (this.getKey().equals(value.getKey())) { return new LongMetricValue(this.getKey(), this.getValue() + value.getValue(), this.getDimensions()); } diff --git a/metrics/metrics-common/src/main/java/io/servicecomb/metrics/common/MetricValue.java b/metrics/metrics-common/src/main/java/org/apache/servicecomb/metrics/common/MetricValue.java similarity index 97% rename from metrics/metrics-common/src/main/java/io/servicecomb/metrics/common/MetricValue.java rename to metrics/metrics-common/src/main/java/org/apache/servicecomb/metrics/common/MetricValue.java index f1f95e366e2..0a8d3642927 100644 --- a/metrics/metrics-common/src/main/java/io/servicecomb/metrics/common/MetricValue.java +++ b/metrics/metrics-common/src/main/java/org/apache/servicecomb/metrics/common/MetricValue.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package io.servicecomb.metrics.common; +package org.apache.servicecomb.metrics.common; import java.util.Arrays; import java.util.Map; diff --git a/metrics/metrics-common/src/main/java/io/servicecomb/metrics/common/MetricsDimension.java b/metrics/metrics-common/src/main/java/org/apache/servicecomb/metrics/common/MetricsDimension.java similarity index 91% rename from metrics/metrics-common/src/main/java/io/servicecomb/metrics/common/MetricsDimension.java rename to metrics/metrics-common/src/main/java/org/apache/servicecomb/metrics/common/MetricsDimension.java index d8f661fbb46..23f1f40d606 100644 --- a/metrics/metrics-common/src/main/java/io/servicecomb/metrics/common/MetricsDimension.java +++ b/metrics/metrics-common/src/main/java/org/apache/servicecomb/metrics/common/MetricsDimension.java @@ -15,9 +15,9 @@ * limitations under the License. */ -package io.servicecomb.metrics.common; +package org.apache.servicecomb.metrics.common; -import io.servicecomb.foundation.common.exceptions.ServiceCombException; +import org.apache.servicecomb.foundation.common.exceptions.ServiceCombException; public class MetricsDimension { public static final String DIMENSION_STATUS = "Status"; diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/InvocationFinishedEventListener.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/InvocationFinishedEventListener.java index a802a49ed41..8d15eac6b65 100644 --- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/InvocationFinishedEventListener.java +++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/InvocationFinishedEventListener.java @@ -15,16 +15,16 @@ * limitations under the License. */ -package io.servicecomb.metrics.core.event; +package org.apache.servicecomb.metrics.core.event; -import io.servicecomb.core.metrics.InvocationFinishedEvent; -import io.servicecomb.foundation.common.event.Event; -import io.servicecomb.foundation.common.event.EventListener; -import io.servicecomb.metrics.common.MetricsDimension; -import io.servicecomb.metrics.core.monitor.ConsumerInvocationMonitor; -import io.servicecomb.metrics.core.monitor.ProducerInvocationMonitor; -import io.servicecomb.metrics.core.monitor.RegistryMonitor; -import io.servicecomb.swagger.invocation.InvocationType; +import org.apache.servicecomb.core.metrics.InvocationFinishedEvent; +import org.apache.servicecomb.foundation.common.event.Event; +import org.apache.servicecomb.foundation.common.event.EventListener; +import org.apache.servicecomb.metrics.common.MetricsDimension; +import org.apache.servicecomb.metrics.core.monitor.ConsumerInvocationMonitor; +import org.apache.servicecomb.metrics.core.monitor.ProducerInvocationMonitor; +import org.apache.servicecomb.metrics.core.monitor.RegistryMonitor; +import org.apache.servicecomb.swagger.invocation.InvocationType; public class InvocationFinishedEventListener implements EventListener { diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/InvocationStartedEventListener.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/InvocationStartedEventListener.java index 2ea0fee02d8..c13d17327c4 100644 --- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/InvocationStartedEventListener.java +++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/InvocationStartedEventListener.java @@ -15,16 +15,16 @@ * limitations under the License. */ -package io.servicecomb.metrics.core.event; +package org.apache.servicecomb.metrics.core.event; -import io.servicecomb.core.metrics.InvocationStartedEvent; -import io.servicecomb.foundation.common.event.Event; -import io.servicecomb.foundation.common.event.EventListener; -import io.servicecomb.metrics.common.MetricsDimension; -import io.servicecomb.metrics.core.monitor.ConsumerInvocationMonitor; -import io.servicecomb.metrics.core.monitor.ProducerInvocationMonitor; -import io.servicecomb.metrics.core.monitor.RegistryMonitor; -import io.servicecomb.swagger.invocation.InvocationType; +import org.apache.servicecomb.core.metrics.InvocationStartedEvent; +import org.apache.servicecomb.foundation.common.event.Event; +import org.apache.servicecomb.foundation.common.event.EventListener; +import org.apache.servicecomb.metrics.common.MetricsDimension; +import org.apache.servicecomb.metrics.core.monitor.ConsumerInvocationMonitor; +import org.apache.servicecomb.metrics.core.monitor.ProducerInvocationMonitor; +import org.apache.servicecomb.metrics.core.monitor.RegistryMonitor; +import org.apache.servicecomb.swagger.invocation.InvocationType; public class InvocationStartedEventListener implements EventListener { diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/CallMonitor.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/CallMonitor.java index 986592d1450..068776eab44 100644 --- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/CallMonitor.java +++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/CallMonitor.java @@ -17,21 +17,19 @@ package org.apache.servicecomb.metrics.core.monitor; -import org.apache.servicecomb.metrics.common.CallMetric; - import java.util.ArrayList; import java.util.List; +import org.apache.servicecomb.metrics.common.CallMetric; +import org.apache.servicecomb.metrics.common.DoubleMetricValue; +import org.apache.servicecomb.metrics.common.LongMetricValue; +import org.apache.servicecomb.metrics.common.MetricsDimension; +import org.apache.servicecomb.metrics.core.utils.MonitorUtils; + import com.netflix.servo.monitor.BasicCounter; import com.netflix.servo.monitor.MonitorConfig; import com.netflix.servo.monitor.StepCounter; -import io.servicecomb.metrics.common.CallMetric; -import io.servicecomb.metrics.common.DoubleMetricValue; -import io.servicecomb.metrics.common.LongMetricValue; -import io.servicecomb.metrics.common.MetricsDimension; -import io.servicecomb.metrics.core.utils.MonitorUtils; - public class CallMonitor { private final String prefix; diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/ConsumerInvocationMonitor.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/ConsumerInvocationMonitor.java index 076ecd1a91c..9a095513e9d 100644 --- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/ConsumerInvocationMonitor.java +++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/ConsumerInvocationMonitor.java @@ -15,12 +15,12 @@ * limitations under the License. */ -package io.servicecomb.metrics.core.monitor; +package org.apache.servicecomb.metrics.core.monitor; -import io.servicecomb.metrics.common.ConsumerInvocationMetric; -import io.servicecomb.metrics.common.MetricsConst; -import io.servicecomb.metrics.common.MetricsDimension; +import org.apache.servicecomb.metrics.common.ConsumerInvocationMetric; +import org.apache.servicecomb.metrics.common.MetricsConst; +import org.apache.servicecomb.metrics.common.MetricsDimension; public class ConsumerInvocationMonitor extends InvocationMonitor { private final TimerMonitor consumerLatency; diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/ProducerInvocationMonitor.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/ProducerInvocationMonitor.java index 82d426f0e08..50a508cf72a 100644 --- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/ProducerInvocationMonitor.java +++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/ProducerInvocationMonitor.java @@ -15,15 +15,15 @@ * limitations under the License. */ -package io.servicecomb.metrics.core.monitor; +package org.apache.servicecomb.metrics.core.monitor; + +import org.apache.servicecomb.metrics.common.MetricsConst; +import org.apache.servicecomb.metrics.common.MetricsDimension; +import org.apache.servicecomb.metrics.common.ProducerInvocationMetric; import com.netflix.servo.monitor.BasicCounter; import com.netflix.servo.monitor.MonitorConfig; -import io.servicecomb.metrics.common.MetricsConst; -import io.servicecomb.metrics.common.MetricsDimension; -import io.servicecomb.metrics.common.ProducerInvocationMetric; - public class ProducerInvocationMonitor extends InvocationMonitor { private final BasicCounter waitInQueue; diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/TimerMonitor.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/TimerMonitor.java index 33ba8ab8563..a88a604557f 100644 --- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/TimerMonitor.java +++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/TimerMonitor.java @@ -15,16 +15,16 @@ * limitations under the License. */ -package io.servicecomb.metrics.core.monitor; +package org.apache.servicecomb.metrics.core.monitor; + +import org.apache.servicecomb.metrics.common.TimerMetric; +import org.apache.servicecomb.metrics.core.utils.MonitorUtils; import com.netflix.servo.monitor.MaxGauge; import com.netflix.servo.monitor.MinGauge; import com.netflix.servo.monitor.MonitorConfig; import com.netflix.servo.monitor.StepCounter; -import io.servicecomb.metrics.common.TimerMetric; -import io.servicecomb.metrics.core.utils.MonitorUtils; - public class TimerMonitor { private final String prefix; diff --git a/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/utils/MonitorUtils.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/utils/MonitorUtils.java similarity index 98% rename from metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/utils/MonitorUtils.java rename to metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/utils/MonitorUtils.java index 741cdd53d09..31be367dcbe 100644 --- a/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/utils/MonitorUtils.java +++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/utils/MonitorUtils.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package io.servicecomb.metrics.core.utils; +package org.apache.servicecomb.metrics.core.utils; import java.util.HashMap; import java.util.Map; diff --git a/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/TestEventAndRunner.java b/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/TestEventAndRunner.java index c897bf117df..8e87439b8a1 100644 --- a/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/TestEventAndRunner.java +++ b/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/TestEventAndRunner.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package io.servicecomb.metrics.core; +package org.apache.servicecomb.metrics.core; import static org.hamcrest.Matchers.containsInAnyOrder; import static org.mockito.Mockito.when; @@ -29,22 +29,21 @@ import java.util.Map; import java.util.concurrent.TimeUnit; +import org.apache.servicecomb.core.metrics.InvocationFinishedEvent; +import org.apache.servicecomb.core.metrics.InvocationStartProcessingEvent; +import org.apache.servicecomb.core.metrics.InvocationStartedEvent; +import org.apache.servicecomb.foundation.common.utils.EventUtils; +import org.apache.servicecomb.metrics.common.MetricsDimension; +import org.apache.servicecomb.metrics.common.RegistryMetric; +import org.apache.servicecomb.metrics.core.event.DefaultEventListenerManager; +import org.apache.servicecomb.metrics.core.monitor.DefaultSystemMonitor; +import org.apache.servicecomb.metrics.core.monitor.RegistryMonitor; +import org.apache.servicecomb.metrics.core.publish.DefaultDataSource; +import org.apache.servicecomb.swagger.invocation.InvocationType; import org.junit.Assert; import org.junit.Test; import org.mockito.Mockito; -import io.servicecomb.core.metrics.InvocationFinishedEvent; -import io.servicecomb.core.metrics.InvocationStartProcessingEvent; -import io.servicecomb.core.metrics.InvocationStartedEvent; -import io.servicecomb.foundation.common.utils.EventUtils; -import io.servicecomb.metrics.common.MetricsDimension; -import io.servicecomb.metrics.common.RegistryMetric; -import io.servicecomb.metrics.core.event.DefaultEventListenerManager; -import io.servicecomb.metrics.core.monitor.DefaultSystemMonitor; -import io.servicecomb.metrics.core.monitor.RegistryMonitor; -import io.servicecomb.metrics.core.publish.DefaultDataSource; -import io.servicecomb.swagger.invocation.InvocationType; - public class TestEventAndRunner { @Test diff --git a/metrics/metrics-integration/metrics-prometheus/src/main/java/org/apache/servicecomb/metrics/prometheus/MetricsCollector.java b/metrics/metrics-integration/metrics-prometheus/src/main/java/org/apache/servicecomb/metrics/prometheus/MetricsCollector.java index f7847222dc5..290d3836518 100644 --- a/metrics/metrics-integration/metrics-prometheus/src/main/java/org/apache/servicecomb/metrics/prometheus/MetricsCollector.java +++ b/metrics/metrics-integration/metrics-prometheus/src/main/java/org/apache/servicecomb/metrics/prometheus/MetricsCollector.java @@ -15,25 +15,25 @@ * limitations under the License. */ -package io.servicecomb.metrics.prometheus; +package org.apache.servicecomb.metrics.prometheus; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.stream.Collectors; +import org.apache.servicecomb.metrics.common.CallMetric; +import org.apache.servicecomb.metrics.common.ConsumerInvocationMetric; +import org.apache.servicecomb.metrics.common.DoubleMetricValue; +import org.apache.servicecomb.metrics.common.LongMetricValue; +import org.apache.servicecomb.metrics.common.ProducerInvocationMetric; +import org.apache.servicecomb.metrics.common.RegistryMetric; +import org.apache.servicecomb.metrics.core.publish.DataSource; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import io.prometheus.client.Collector; import io.prometheus.client.Collector.MetricFamilySamples.Sample; -import io.servicecomb.metrics.common.CallMetric; -import io.servicecomb.metrics.common.ConsumerInvocationMetric; -import io.servicecomb.metrics.common.DoubleMetricValue; -import io.servicecomb.metrics.common.LongMetricValue; -import io.servicecomb.metrics.common.ProducerInvocationMetric; -import io.servicecomb.metrics.common.RegistryMetric; -import io.servicecomb.metrics.core.publish.DataSource; @Component public class MetricsCollector extends Collector implements Collector.Describable { diff --git a/samples/metrics-write-file-sample/metrics-write-file/src/test/java/org/apache/servicecomb/samples/mwf/TestWriteFile.java b/samples/metrics-write-file-sample/metrics-write-file/src/test/java/org/apache/servicecomb/samples/mwf/TestWriteFile.java index d73d30d44fb..d550f77c7f8 100644 --- a/samples/metrics-write-file-sample/metrics-write-file/src/test/java/org/apache/servicecomb/samples/mwf/TestWriteFile.java +++ b/samples/metrics-write-file-sample/metrics-write-file/src/test/java/org/apache/servicecomb/samples/mwf/TestWriteFile.java @@ -15,35 +15,36 @@ * limitations under the License. */ -package io.servicecomb.samples.mwf; +package org.apache.servicecomb.samples.mwf; import java.util.Arrays; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; +import org.apache.servicecomb.metrics.common.CallMetric; +import org.apache.servicecomb.metrics.common.ConsumerInvocationMetric; +import org.apache.servicecomb.metrics.common.DoubleMetricValue; +import org.apache.servicecomb.metrics.common.LongMetricValue; +import org.apache.servicecomb.metrics.common.RegistryMetric; +import org.apache.servicecomb.metrics.common.SystemMetric; +import org.apache.servicecomb.metrics.common.TimerMetric; +import org.apache.servicecomb.metrics.core.publish.DataSource; +import org.apache.servicecomb.serviceregistry.Features; +import org.apache.servicecomb.serviceregistry.RegistryUtils; +import org.apache.servicecomb.serviceregistry.ServiceRegistry; +import org.apache.servicecomb.serviceregistry.api.registry.Microservice; +import org.apache.servicecomb.serviceregistry.api.registry.MicroserviceInstance; +import org.apache.servicecomb.serviceregistry.cache.InstanceCacheManager; +import org.apache.servicecomb.serviceregistry.client.ServiceRegistryClient; +import org.apache.servicecomb.serviceregistry.client.http.MicroserviceInstances; +import org.apache.servicecomb.serviceregistry.consumer.AppManager; import org.junit.Assert; import org.junit.Test; import org.mockito.Mockito; -import io.servicecomb.metrics.common.CallMetric; -import io.servicecomb.metrics.common.ConsumerInvocationMetric; -import io.servicecomb.metrics.common.DoubleMetricValue; -import io.servicecomb.metrics.common.LongMetricValue; -import io.servicecomb.metrics.common.RegistryMetric; -import io.servicecomb.metrics.common.SystemMetric; -import io.servicecomb.metrics.common.TimerMetric; -import io.servicecomb.metrics.core.publish.DataSource; -import io.servicecomb.serviceregistry.Features; -import io.servicecomb.serviceregistry.RegistryUtils; -import io.servicecomb.serviceregistry.ServiceRegistry; -import io.servicecomb.serviceregistry.api.registry.Microservice; -import io.servicecomb.serviceregistry.api.registry.MicroserviceInstance; -import io.servicecomb.serviceregistry.cache.InstanceCacheManager; -import io.servicecomb.serviceregistry.client.ServiceRegistryClient; -import io.servicecomb.serviceregistry.client.http.MicroserviceInstances; -import io.servicecomb.serviceregistry.consumer.AppManager; import mockit.Expectations; public class TestWriteFile { @@ -146,13 +147,13 @@ public Features getFeatures() { Map consumerInvocationMetricMap = new HashMap<>(); consumerInvocationMetricMap.put("A", new ConsumerInvocationMetric("A", "A", new TimerMetric("A1", 1, 2, 3, 4), - new CallMetric("A2", Arrays.asList(new LongMetricValue("A2", 100L, new HashMap<>())), - Arrays.asList(new DoubleMetricValue("A2", 999.44444, new HashMap<>()))))); + new CallMetric("A2", Collections.singletonList(new LongMetricValue("A2", 100L, new HashMap<>())), + Collections.singletonList(new DoubleMetricValue("A2", 999.44444, new HashMap<>()))))); consumerInvocationMetricMap.put("B", new ConsumerInvocationMetric("B", "B", new TimerMetric("B1", 1, 2, 3, 4), - new CallMetric("B2", Arrays.asList(new LongMetricValue("B2", 100L, new HashMap<>())), - Arrays.asList(new DoubleMetricValue("B2", 888.66666, new HashMap<>()))))); + new CallMetric("B2", Collections.singletonList(new LongMetricValue("B2", 100L, new HashMap<>())), + Collections.singletonList(new DoubleMetricValue("B2", 888.66666, new HashMap<>()))))); RegistryMetric metric = new RegistryMetric(systemMetric, consumerInvocationMetricMap, new HashMap<>()); From 1e0da7af2e44f43ed75bccd0500578e14aa7f514 Mon Sep 17 00:00:00 2001 From: zhengyangyong Date: Wed, 17 Jan 2018 10:19:32 +0800 Subject: [PATCH 09/10] SCB-150 fix pr comment Signed-off-by: zhengyangyong --- .../metrics/common/DoubleMetricValue.java | 8 +---- .../metrics/common/LongMetricValue.java | 8 +---- .../metrics/core/utils/MonitorUtils.java | 3 +- .../metrics/prometheus/MetricsCollector.java | 33 ++++++++++--------- 4 files changed, 22 insertions(+), 30 deletions(-) diff --git a/metrics/metrics-common/src/main/java/org/apache/servicecomb/metrics/common/DoubleMetricValue.java b/metrics/metrics-common/src/main/java/org/apache/servicecomb/metrics/common/DoubleMetricValue.java index 30a7790373f..e6ace957c9f 100644 --- a/metrics/metrics-common/src/main/java/org/apache/servicecomb/metrics/common/DoubleMetricValue.java +++ b/metrics/metrics-common/src/main/java/org/apache/servicecomb/metrics/common/DoubleMetricValue.java @@ -22,8 +22,6 @@ import java.util.List; import java.util.Map; -import org.apache.servicecomb.foundation.common.exceptions.ServiceCombException; - import com.fasterxml.jackson.annotation.JsonProperty; public class DoubleMetricValue extends MetricValue { @@ -38,11 +36,7 @@ public DoubleMetricValue(@JsonProperty("key") String key, } private DoubleMetricValue merge(DoubleMetricValue value) { - if (this.getKey().equals(value.getKey())) { - return new DoubleMetricValue(this.getKey(), this.getValue() + value.getValue(), this.getDimensions()); - } - throw new ServiceCombException("unable merge different key values,source key :" + value.getKey() + - " target key :" + this.getKey()); + return new DoubleMetricValue(this.getKey(), this.getValue() + value.getValue(), this.getDimensions()); } public static List merge(List source, List target) { diff --git a/metrics/metrics-common/src/main/java/org/apache/servicecomb/metrics/common/LongMetricValue.java b/metrics/metrics-common/src/main/java/org/apache/servicecomb/metrics/common/LongMetricValue.java index 84babff5279..ff271349844 100644 --- a/metrics/metrics-common/src/main/java/org/apache/servicecomb/metrics/common/LongMetricValue.java +++ b/metrics/metrics-common/src/main/java/org/apache/servicecomb/metrics/common/LongMetricValue.java @@ -22,8 +22,6 @@ import java.util.List; import java.util.Map; -import org.apache.servicecomb.foundation.common.exceptions.ServiceCombException; - import com.fasterxml.jackson.annotation.JsonProperty; public class LongMetricValue extends MetricValue { @@ -38,11 +36,7 @@ public LongMetricValue(@JsonProperty("key") String key, } private LongMetricValue merge(LongMetricValue value) { - if (this.getKey().equals(value.getKey())) { - return new LongMetricValue(this.getKey(), this.getValue() + value.getValue(), this.getDimensions()); - } - throw new ServiceCombException("unable merge different key values,source key :" + value.getKey() + - " target key :" + this.getKey()); + return new LongMetricValue(this.getKey(), this.getValue() + value.getValue(), this.getDimensions()); } public static List merge(List source, List target) { diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/utils/MonitorUtils.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/utils/MonitorUtils.java index 31be367dcbe..f2a816985e0 100644 --- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/utils/MonitorUtils.java +++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/utils/MonitorUtils.java @@ -17,6 +17,7 @@ package org.apache.servicecomb.metrics.core.utils; +import java.util.Collections; import java.util.HashMap; import java.util.Map; import java.util.concurrent.TimeUnit; @@ -58,7 +59,7 @@ public static Map convertTags(Monitor monitor) { } return tagMap; } - return null; + return Collections.emptyMap(); } //Counting use System.nano get more precise time diff --git a/metrics/metrics-integration/metrics-prometheus/src/main/java/org/apache/servicecomb/metrics/prometheus/MetricsCollector.java b/metrics/metrics-integration/metrics-prometheus/src/main/java/org/apache/servicecomb/metrics/prometheus/MetricsCollector.java index 290d3836518..932863ea152 100644 --- a/metrics/metrics-integration/metrics-prometheus/src/main/java/org/apache/servicecomb/metrics/prometheus/MetricsCollector.java +++ b/metrics/metrics-integration/metrics-prometheus/src/main/java/org/apache/servicecomb/metrics/prometheus/MetricsCollector.java @@ -59,30 +59,33 @@ private List load() { RegistryMetric registryMetric = dataSource.getRegistryMetric(); List familySamples = new ArrayList<>(); - List samples = new ArrayList<>(); - samples.addAll(convertMetricValues(registryMetric.getInstanceMetric().getSystemMetric().toMap())); - samples.addAll(convertConsumerMetric(registryMetric.getInstanceMetric().getConsumerMetric())); - samples.addAll(convertCallMetric(registryMetric.getInstanceMetric().getConsumerMetric().getConsumerCall())); - samples.addAll(convertProducerMetric(registryMetric.getInstanceMetric().getProducerMetric())); - samples.addAll(convertCallMetric(registryMetric.getInstanceMetric().getProducerMetric().getProducerCall())); - familySamples.add(new MetricFamilySamples("Instance Level", Type.UNTYPED, "Instance Level Metrics", samples)); + List instanceSamples = new ArrayList<>(); + instanceSamples.addAll(convertMetricValues(registryMetric.getInstanceMetric().getSystemMetric().toMap())); + instanceSamples.addAll(convertConsumerMetric(registryMetric.getInstanceMetric().getConsumerMetric())); + instanceSamples.addAll(convertCallMetric(registryMetric.getInstanceMetric().getConsumerMetric().getConsumerCall())); + instanceSamples.addAll(convertProducerMetric(registryMetric.getInstanceMetric().getProducerMetric())); + instanceSamples.addAll(convertCallMetric(registryMetric.getInstanceMetric().getProducerMetric().getProducerCall())); + familySamples + .add(new MetricFamilySamples("Instance Level", Type.UNTYPED, "Instance Level Metrics", instanceSamples)); if (registryMetric.getConsumerMetrics().size() != 0) { - samples = new ArrayList<>(); + List consumerSamples = new ArrayList<>(); for (ConsumerInvocationMetric metric : registryMetric.getConsumerMetrics().values()) { - samples.addAll(convertConsumerMetric(metric)); - samples.addAll(convertCallMetric(metric.getConsumerCall())); + consumerSamples.addAll(convertConsumerMetric(metric)); + consumerSamples.addAll(convertCallMetric(metric.getConsumerCall())); } - familySamples.add(new MetricFamilySamples("Consumer Side", Type.UNTYPED, "Consumer Side Metrics", samples)); + familySamples + .add(new MetricFamilySamples("Consumer Side", Type.UNTYPED, "Consumer Side Metrics", consumerSamples)); } if (registryMetric.getProducerMetrics().size() != 0) { - samples = new ArrayList<>(); + List producerSamples = new ArrayList<>(); for (ProducerInvocationMetric metric : registryMetric.getProducerMetrics().values()) { - samples.addAll(convertProducerMetric(metric)); - samples.addAll(convertCallMetric(metric.getProducerCall())); + producerSamples.addAll(convertProducerMetric(metric)); + producerSamples.addAll(convertCallMetric(metric.getProducerCall())); } - familySamples.add(new MetricFamilySamples("Producer Side", Type.UNTYPED, "Producer Side Metrics", samples)); + familySamples + .add(new MetricFamilySamples("Producer Side", Type.UNTYPED, "Producer Side Metrics", producerSamples)); } return familySamples; From 63e93710e14324d1a4ea98f5276f7de351d24522 Mon Sep 17 00:00:00 2001 From: zhengyangyong Date: Wed, 17 Jan 2018 15:36:37 +0800 Subject: [PATCH 10/10] SCB-150 add Status Dimension output level support Signed-off-by: zhengyangyong --- .../common/rest/AbstractRestInvocation.java | 2 +- .../apache/servicecomb/core/Invocation.java | 4 +- .../core/metrics/InvocationFinishedEvent.java | 11 +- .../core/provider/consumer/InvokerUtils.java | 9 +- .../metrics/common/CallMetric.java | 4 +- .../metrics/common/MetricsDimension.java | 31 ++-- .../metrics/core/MetricsConfig.java | 2 + .../event/DefaultEventListenerManager.java | 17 +- .../InvocationFinishedEventListener.java | 14 +- .../dimension/CodeGroupStatusConvertor.java | 45 +++++ .../event/dimension/CodeStatusConvertor.java | 25 +++ .../core/event/dimension/StatusConvertor.java | 22 +++ .../dimension/StatusConvertorFactory.java | 53 ++++++ .../SuccessFailedStatusConvertor.java | 28 ++++ .../metrics/core/monitor/CallMonitor.java | 90 +++++----- .../monitor/ConsumerInvocationMonitor.java | 3 +- .../monitor/ProducerInvocationMonitor.java | 3 +- .../metrics/core/TestEventAndRunner.java | 72 +++++--- .../metrics/core/TestStatusDimension.java | 158 ++++++++++++++++++ .../highway/HighwayServerInvoke.java | 2 +- 20 files changed, 490 insertions(+), 105 deletions(-) create mode 100644 metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/dimension/CodeGroupStatusConvertor.java create mode 100644 metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/dimension/CodeStatusConvertor.java create mode 100644 metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/dimension/StatusConvertor.java create mode 100644 metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/dimension/StatusConvertorFactory.java create mode 100644 metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/dimension/SuccessFailedStatusConvertor.java create mode 100644 metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/TestStatusDimension.java 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 0ee799989fd..36c1739381b 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 @@ -189,7 +189,7 @@ protected void doInvoke() throws Throwable { invocation.next(resp -> { sendResponseQuietly(resp); - invocation.triggerFinishedEvent(resp.isSuccessed()); + invocation.triggerFinishedEvent(resp.getStatusCode(), resp.isSuccessed()); endMetrics(); }); } 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 19241b85041..81f25f83db3 100644 --- a/core/src/main/java/org/apache/servicecomb/core/Invocation.java +++ b/core/src/main/java/org/apache/servicecomb/core/Invocation.java @@ -202,12 +202,12 @@ public void triggerStartProcessingEvent() { operationMeta.getMicroserviceQualifiedName(), this.invocationType, startProcessingTime - startTime)); } - public void triggerFinishedEvent(boolean success) { + public void triggerFinishedEvent(int statusCode, boolean success) { long finishedTime = System.nanoTime(); EventUtils .triggerEvent(new InvocationFinishedEvent(operationMeta.getMicroserviceQualifiedName(), this.invocationType, finishedTime - startProcessingTime, - finishedTime - startTime, success)); + finishedTime - startTime, statusCode, success)); } public boolean isSync() { diff --git a/core/src/main/java/org/apache/servicecomb/core/metrics/InvocationFinishedEvent.java b/core/src/main/java/org/apache/servicecomb/core/metrics/InvocationFinishedEvent.java index ea54d672e73..4de6154e0d2 100644 --- a/core/src/main/java/org/apache/servicecomb/core/metrics/InvocationFinishedEvent.java +++ b/core/src/main/java/org/apache/servicecomb/core/metrics/InvocationFinishedEvent.java @@ -29,6 +29,8 @@ public class InvocationFinishedEvent implements Event { private final long totalElapsedNanoTime; + private final int statusCode; + private final boolean success; public String getOperationName() { @@ -47,18 +49,21 @@ public long getTotalElapsedNanoTime() { return totalElapsedNanoTime; } + public int getStatusCode() { + return statusCode; + } + public boolean isSuccess() { return success; } public InvocationFinishedEvent(String operationName, InvocationType invocationType, - long processElapsedNanoTime, - long totalElapsedNanoTime, - boolean success) { + long processElapsedNanoTime, long totalElapsedNanoTime, int statusCode, boolean success) { this.operationName = operationName; this.invocationType = invocationType; this.processElapsedNanoTime = processElapsedNanoTime; this.totalElapsedNanoTime = totalElapsedNanoTime; + this.statusCode = statusCode; this.success = success; } } diff --git a/core/src/main/java/org/apache/servicecomb/core/provider/consumer/InvokerUtils.java b/core/src/main/java/org/apache/servicecomb/core/provider/consumer/InvokerUtils.java index e8b824739f6..2635ac39248 100644 --- a/core/src/main/java/org/apache/servicecomb/core/provider/consumer/InvokerUtils.java +++ b/core/src/main/java/org/apache/servicecomb/core/provider/consumer/InvokerUtils.java @@ -63,6 +63,7 @@ public static Object syncInvoke(Invocation invocation) throws InvocationExceptio public static Response innerSyncInvoke(Invocation invocation) { boolean success = false; + int statusCode = 0; try { triggerStartedEvent(invocation); SyncResponseExecutor respExecutor = new SyncResponseExecutor(); @@ -72,6 +73,7 @@ public static Response innerSyncInvoke(Invocation invocation) { Response response = respExecutor.waitResponse(); success = response.isSuccessed(); + statusCode = response.getStatusCode(); return response; } catch (Throwable e) { String msg = @@ -79,7 +81,7 @@ public static Response innerSyncInvoke(Invocation invocation) { LOGGER.debug(msg, e); return Response.createConsumerFail(e); } finally { - invocation.triggerFinishedEvent(success); + invocation.triggerFinishedEvent(statusCode, success); } } @@ -92,11 +94,12 @@ public static void reactiveInvoke(Invocation invocation, AsyncResponse asyncResp invocation.setResponseExecutor(respExecutor); invocation.next(ar -> { - invocation.triggerFinishedEvent(ar.isSuccessed()); + invocation.triggerFinishedEvent(ar.getStatusCode(), ar.isSuccessed()); asyncResp.handle(ar); }); } catch (Throwable e) { - invocation.triggerFinishedEvent(false); + //if throw exception,we can use 500 for status code ? + invocation.triggerFinishedEvent(500, false); LOGGER.error("invoke failed, {}", invocation.getOperationMeta().getMicroserviceQualifiedName()); asyncResp.consumerFail(e); } diff --git a/metrics/metrics-common/src/main/java/org/apache/servicecomb/metrics/common/CallMetric.java b/metrics/metrics-common/src/main/java/org/apache/servicecomb/metrics/common/CallMetric.java index 56d0f99e5a4..4c5c862dc2b 100644 --- a/metrics/metrics-common/src/main/java/org/apache/servicecomb/metrics/common/CallMetric.java +++ b/metrics/metrics-common/src/main/java/org/apache/servicecomb/metrics/common/CallMetric.java @@ -45,7 +45,7 @@ public LongMetricValue getTotalValue(String dimensionKey, String dimensionValue) return value; } } - return null; + return new LongMetricValue(dimensionValue, 0L, null); } public List getTpsValues() { @@ -58,7 +58,7 @@ public DoubleMetricValue getTpsValue(String dimensionKey, String dimensionValue) return value; } } - return null; + return new DoubleMetricValue(dimensionValue, 0.0, null); } public CallMetric(String prefix) { diff --git a/metrics/metrics-common/src/main/java/org/apache/servicecomb/metrics/common/MetricsDimension.java b/metrics/metrics-common/src/main/java/org/apache/servicecomb/metrics/common/MetricsDimension.java index 23f1f40d606..904cc25b8ed 100644 --- a/metrics/metrics-common/src/main/java/org/apache/servicecomb/metrics/common/MetricsDimension.java +++ b/metrics/metrics-common/src/main/java/org/apache/servicecomb/metrics/common/MetricsDimension.java @@ -17,23 +17,30 @@ package org.apache.servicecomb.metrics.common; -import org.apache.servicecomb.foundation.common.exceptions.ServiceCombException; - public class MetricsDimension { public static final String DIMENSION_STATUS = "Status"; public static final String DIMENSION_STATUS_ALL = "all"; - public static final String DIMENSION_STATUS_SUCCESS = "success"; + public static final String DIMENSION_STATUS_SUCCESS_FAILED_SUCCESS = "success"; + + public static final String DIMENSION_STATUS_SUCCESS_FAILED_FAILED = "failed"; + + public static final String DIMENSION_STATUS_CODE_GROUP_1XX = "1xx"; + + public static final String DIMENSION_STATUS_CODE_GROUP_2XX = "2xx"; + + public static final String DIMENSION_STATUS_CODE_GROUP_3XX = "3xx"; + + public static final String DIMENSION_STATUS_CODE_GROUP_4XX = "4xx"; + + public static final String DIMENSION_STATUS_CODE_GROUP_5XX = "5xx"; + + public static final String DIMENSION_STATUS_CODE_GROUP_OTHER = "xxx"; + + public static final String DIMENSION_STATUS_OUTPUT_LEVEL_SUCCESS_FAILED = "success_failed"; - public static final String DIMENSION_STATUS_FAILED = "failed"; + public static final String DIMENSION_STATUS_OUTPUT_LEVEL_CODE_GROUP = "code_group"; - public static String[] getDimensionOptions(String dimension) { - if (DIMENSION_STATUS.equals(dimension)) { - return new String[] {MetricsDimension.DIMENSION_STATUS_ALL, - MetricsDimension.DIMENSION_STATUS_SUCCESS, - MetricsDimension.DIMENSION_STATUS_FAILED}; - } - throw new ServiceCombException("illegal dimension key : " + dimension); - } + public static final String DIMENSION_STATUS_OUTPUT_LEVEL_CODE = "code"; } diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/MetricsConfig.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/MetricsConfig.java index b903f158fca..cbf6455d857 100644 --- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/MetricsConfig.java +++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/MetricsConfig.java @@ -19,4 +19,6 @@ public class MetricsConfig { public static final String METRICS_POLLING_TIME = "servicecomb.metrics.window_time"; + + public static final String METRICS_DIMENSION_STATUS_OUTPUT_LEVEL = "servicecomb.metrics.dimension.status.output_level"; } diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/DefaultEventListenerManager.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/DefaultEventListenerManager.java index 42aa024b5d1..6dc6df4f442 100644 --- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/DefaultEventListenerManager.java +++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/DefaultEventListenerManager.java @@ -19,18 +19,31 @@ import org.apache.servicecomb.foundation.common.event.EventListener; import org.apache.servicecomb.foundation.common.utils.EventUtils; +import org.apache.servicecomb.metrics.common.MetricsDimension; +import org.apache.servicecomb.metrics.core.MetricsConfig; +import org.apache.servicecomb.metrics.core.event.dimension.StatusConvertorFactory; import org.apache.servicecomb.metrics.core.monitor.RegistryMonitor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import com.netflix.config.DynamicPropertyFactory; + @Component public class DefaultEventListenerManager implements EventListenerManager { @Autowired - public DefaultEventListenerManager(RegistryMonitor registryMonitor) { + public DefaultEventListenerManager(RegistryMonitor registryMonitor, StatusConvertorFactory convertorFactory) { + this(registryMonitor, convertorFactory, DynamicPropertyFactory + .getInstance().getStringProperty(MetricsConfig.METRICS_DIMENSION_STATUS_OUTPUT_LEVEL, + MetricsDimension.DIMENSION_STATUS_OUTPUT_LEVEL_SUCCESS_FAILED).get()); + } + + public DefaultEventListenerManager(RegistryMonitor registryMonitor, StatusConvertorFactory convertorFactory, + String outputLevel) { this.registerEventListener(new InvocationStartedEventListener(registryMonitor)); this.registerEventListener(new InvocationStartProcessingEventListener(registryMonitor)); - this.registerEventListener(new InvocationFinishedEventListener(registryMonitor)); + this.registerEventListener( + new InvocationFinishedEventListener(registryMonitor, convertorFactory.getConvertor(outputLevel))); } @Override diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/InvocationFinishedEventListener.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/InvocationFinishedEventListener.java index 8d15eac6b65..5b886b6f099 100644 --- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/InvocationFinishedEventListener.java +++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/InvocationFinishedEventListener.java @@ -21,17 +21,20 @@ import org.apache.servicecomb.foundation.common.event.Event; import org.apache.servicecomb.foundation.common.event.EventListener; import org.apache.servicecomb.metrics.common.MetricsDimension; +import org.apache.servicecomb.metrics.core.event.dimension.StatusConvertor; import org.apache.servicecomb.metrics.core.monitor.ConsumerInvocationMonitor; import org.apache.servicecomb.metrics.core.monitor.ProducerInvocationMonitor; import org.apache.servicecomb.metrics.core.monitor.RegistryMonitor; import org.apache.servicecomb.swagger.invocation.InvocationType; public class InvocationFinishedEventListener implements EventListener { - private final RegistryMonitor registryMonitor; - public InvocationFinishedEventListener(RegistryMonitor registryMonitor) { + private final StatusConvertor convertor; + + public InvocationFinishedEventListener(RegistryMonitor registryMonitor, StatusConvertor convertor) { this.registryMonitor = registryMonitor; + this.convertor = convertor; } @Override @@ -42,17 +45,16 @@ public Class getConcernedEvent() { @Override public void process(Event data) { InvocationFinishedEvent event = (InvocationFinishedEvent) data; + String statusDimensionValue = convertor.convert(event.isSuccess(), event.getStatusCode()); if (InvocationType.PRODUCER.equals(event.getInvocationType())) { ProducerInvocationMonitor monitor = registryMonitor.getProducerInvocationMonitor(event.getOperationName()); monitor.getExecutionTime().update(event.getProcessElapsedNanoTime()); monitor.getProducerLatency().update(event.getTotalElapsedNanoTime()); - monitor.getProducerCall().increment(MetricsDimension.DIMENSION_STATUS, - event.isSuccess() ? MetricsDimension.DIMENSION_STATUS_SUCCESS : MetricsDimension.DIMENSION_STATUS_FAILED); + monitor.getProducerCall().increment(MetricsDimension.DIMENSION_STATUS, statusDimensionValue); } else { ConsumerInvocationMonitor monitor = registryMonitor.getConsumerInvocationMonitor(event.getOperationName()); monitor.getConsumerLatency().update(event.getTotalElapsedNanoTime()); - monitor.getConsumerCall().increment(MetricsDimension.DIMENSION_STATUS, - event.isSuccess() ? MetricsDimension.DIMENSION_STATUS_SUCCESS : MetricsDimension.DIMENSION_STATUS_FAILED); + monitor.getConsumerCall().increment(MetricsDimension.DIMENSION_STATUS, statusDimensionValue); } } } diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/dimension/CodeGroupStatusConvertor.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/dimension/CodeGroupStatusConvertor.java new file mode 100644 index 00000000000..92b99d0bca2 --- /dev/null +++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/dimension/CodeGroupStatusConvertor.java @@ -0,0 +1,45 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.servicecomb.metrics.core.event.dimension; + +import java.util.HashMap; +import java.util.Map; + +import javax.ws.rs.core.Response.Status.Family; + +import org.apache.servicecomb.metrics.common.MetricsDimension; + +public class CodeGroupStatusConvertor implements StatusConvertor { + + private final Map families; + + public CodeGroupStatusConvertor() { + this.families = new HashMap<>(); + this.families.put(Family.INFORMATIONAL, MetricsDimension.DIMENSION_STATUS_CODE_GROUP_1XX); + this.families.put(Family.SUCCESSFUL, MetricsDimension.DIMENSION_STATUS_CODE_GROUP_2XX); + this.families.put(Family.REDIRECTION, MetricsDimension.DIMENSION_STATUS_CODE_GROUP_3XX); + this.families.put(Family.CLIENT_ERROR, MetricsDimension.DIMENSION_STATUS_CODE_GROUP_4XX); + this.families.put(Family.SERVER_ERROR, MetricsDimension.DIMENSION_STATUS_CODE_GROUP_5XX); + this.families.put(Family.OTHER, MetricsDimension.DIMENSION_STATUS_CODE_GROUP_OTHER); + } + + @Override + public String convert(boolean success, int statusCode) { + return families.get(Family.familyOf(statusCode)); + } +} diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/dimension/CodeStatusConvertor.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/dimension/CodeStatusConvertor.java new file mode 100644 index 00000000000..b01f5da674b --- /dev/null +++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/dimension/CodeStatusConvertor.java @@ -0,0 +1,25 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.servicecomb.metrics.core.event.dimension; + +public class CodeStatusConvertor implements StatusConvertor { + @Override + public String convert(boolean success, int statusCode) { + return String.valueOf(statusCode); + } +} diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/dimension/StatusConvertor.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/dimension/StatusConvertor.java new file mode 100644 index 00000000000..17023b66737 --- /dev/null +++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/dimension/StatusConvertor.java @@ -0,0 +1,22 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.servicecomb.metrics.core.event.dimension; + +public interface StatusConvertor { + String convert(boolean success, int statusCode); +} diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/dimension/StatusConvertorFactory.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/dimension/StatusConvertorFactory.java new file mode 100644 index 00000000000..369cda4eaf6 --- /dev/null +++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/dimension/StatusConvertorFactory.java @@ -0,0 +1,53 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.servicecomb.metrics.core.event.dimension; + +import java.util.HashMap; +import java.util.Map; +import java.util.function.Supplier; + +import org.apache.servicecomb.metrics.common.MetricsDimension; +import org.apache.servicecomb.metrics.core.MetricsConfig; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +@Component +public class StatusConvertorFactory { + + private final Map> suppliers; + + public StatusConvertorFactory() { + this.suppliers = new HashMap<>(); + this.suppliers.put(MetricsDimension.DIMENSION_STATUS_OUTPUT_LEVEL_CODE, CodeStatusConvertor::new); + this.suppliers.put(MetricsDimension.DIMENSION_STATUS_OUTPUT_LEVEL_CODE_GROUP, CodeGroupStatusConvertor::new); + this.suppliers + .put(MetricsDimension.DIMENSION_STATUS_OUTPUT_LEVEL_SUCCESS_FAILED, SuccessFailedStatusConvertor::new); + } + + public StatusConvertor getConvertor(String outputLevel) { + if (suppliers.containsKey(outputLevel)) { + return suppliers.get(outputLevel).get(); + } + LoggerFactory.getLogger(StatusConvertorFactory.class).error("unknown config value of " + + MetricsConfig.METRICS_DIMENSION_STATUS_OUTPUT_LEVEL + " : " + outputLevel + + ", use default level : " + + MetricsDimension.DIMENSION_STATUS_OUTPUT_LEVEL_SUCCESS_FAILED + " replace it"); + //return default + return suppliers.get(MetricsDimension.DIMENSION_STATUS_OUTPUT_LEVEL_SUCCESS_FAILED).get(); + } +} diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/dimension/SuccessFailedStatusConvertor.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/dimension/SuccessFailedStatusConvertor.java new file mode 100644 index 00000000000..c2cf9984be1 --- /dev/null +++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/dimension/SuccessFailedStatusConvertor.java @@ -0,0 +1,28 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.servicecomb.metrics.core.event.dimension; + +import org.apache.servicecomb.metrics.common.MetricsDimension; + +public class SuccessFailedStatusConvertor implements StatusConvertor { + @Override + public String convert(boolean success, int statusCode) { + return success ? MetricsDimension.DIMENSION_STATUS_SUCCESS_FAILED_SUCCESS + : MetricsDimension.DIMENSION_STATUS_SUCCESS_FAILED_FAILED; + } +} diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/CallMonitor.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/CallMonitor.java index 068776eab44..2e61440c208 100644 --- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/CallMonitor.java +++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/CallMonitor.java @@ -19,7 +19,9 @@ import java.util.ArrayList; import java.util.List; +import java.util.Map; +import org.apache.servicecomb.foundation.common.concurrent.ConcurrentHashMapEx; import org.apache.servicecomb.metrics.common.CallMetric; import org.apache.servicecomb.metrics.common.DoubleMetricValue; import org.apache.servicecomb.metrics.common.LongMetricValue; @@ -33,61 +35,61 @@ public class CallMonitor { private final String prefix; - private final List totalCounters; + private final Map> dimensionCounters; - private final List tpsCounters; - - public CallMonitor(String prefix, String... dimensionKeys) { + public CallMonitor(String prefix) { this.prefix = prefix; - this.totalCounters = new ArrayList<>(); - this.tpsCounters = new ArrayList<>(); - if (dimensionKeys.length == 0) { - this.totalCounters.add(new BasicCounter(MonitorConfig.builder(prefix + ".total").build())); - this.tpsCounters.add(new StepCounter(MonitorConfig.builder(prefix + ".tps").build())); - } else { - for (String dimensionKey : dimensionKeys) { - for (String option : MetricsDimension.getDimensionOptions(dimensionKey)) { - this.totalCounters - .add(new BasicCounter(MonitorConfig.builder(prefix + ".total").withTag(dimensionKey, option).build())); - this.tpsCounters - .add(new StepCounter(MonitorConfig.builder(prefix + ".tps").withTag(dimensionKey, option).build())); - } - } - } + this.dimensionCounters = new ConcurrentHashMapEx<>(); + this.dimensionCounters.put(MetricsDimension.DIMENSION_STATUS, new ConcurrentHashMapEx<>()); } - public void increment() { - for (int i = 0; i < totalCounters.size(); i++) { - totalCounters.get(i).increment(); - tpsCounters.get(i).increment(); - } - } - - public void increment(String dimensionKey, String dimensionValue) { - for (int i = 0; i < totalCounters.size(); i++) { - BasicCounter totalCounter = totalCounters.get(i); - if (MonitorUtils.containsTagValue(totalCounter, dimensionKey, dimensionValue)) { - totalCounter.increment(); - } - StepCounter tpsCounter = tpsCounters.get(i); - if (MonitorUtils.containsTagValue(tpsCounter, dimensionKey, dimensionValue)) { - tpsCounter.increment(); - } + public void increment(String dimensionKey, String... dimensionValues) { + for (String dimensionValue : dimensionValues) { + DimensionCounter counter = dimensionCounters.get(dimensionKey) + .computeIfAbsent(dimensionValue, d -> new DimensionCounter( + new BasicCounter(MonitorConfig.builder(prefix + ".total").withTag(dimensionKey, dimensionValue).build()), + new StepCounter(MonitorConfig.builder(prefix + ".tps").withTag(dimensionKey, dimensionValue).build()))); + counter.increment(); } } public CallMetric toMetric(int windowTimeIndex) { List totalValues = new ArrayList<>(); List tpsValues = new ArrayList<>(); - for (int i = 0; i < totalCounters.size(); i++) { - BasicCounter totalCounter = totalCounters.get(i); - totalValues.add(new LongMetricValue(totalCounter.getValue(windowTimeIndex).longValue(), - MonitorUtils.convertTags(totalCounter))); - StepCounter tpsCounter = tpsCounters.get(i); - tpsValues.add( - new DoubleMetricValue(MonitorUtils.adjustValue(tpsCounter.getValue(windowTimeIndex).doubleValue()), - MonitorUtils.convertTags(tpsCounter))); + for (Map dimensionCounter : dimensionCounters.values()) { + for (DimensionCounter counter : dimensionCounter.values()) { + totalValues.add(new LongMetricValue(counter.getTotal().getValue(windowTimeIndex).longValue(), + MonitorUtils.convertTags(counter.getTotal()))); + tpsValues.add( + new DoubleMetricValue(MonitorUtils.adjustValue(counter.getTps().getValue(windowTimeIndex).doubleValue()), + MonitorUtils.convertTags(counter.getTps()))); + } } + return new CallMetric(this.prefix, totalValues, tpsValues); } + + class DimensionCounter { + private final BasicCounter total; + + private final StepCounter tps; + + public BasicCounter getTotal() { + return total; + } + + public StepCounter getTps() { + return tps; + } + + public DimensionCounter(BasicCounter total, StepCounter tps) { + this.total = total; + this.tps = tps; + } + + public void increment() { + total.increment(); + tps.increment(); + } + } } diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/ConsumerInvocationMonitor.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/ConsumerInvocationMonitor.java index 9a095513e9d..1f2f2477550 100644 --- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/ConsumerInvocationMonitor.java +++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/ConsumerInvocationMonitor.java @@ -20,7 +20,6 @@ import org.apache.servicecomb.metrics.common.ConsumerInvocationMetric; import org.apache.servicecomb.metrics.common.MetricsConst; -import org.apache.servicecomb.metrics.common.MetricsDimension; public class ConsumerInvocationMonitor extends InvocationMonitor { private final TimerMonitor consumerLatency; @@ -38,7 +37,7 @@ public CallMonitor getConsumerCall() { public ConsumerInvocationMonitor(String operationName) { super(operationName, String.format(MetricsConst.CONSUMER_PREFIX_TEMPLATE, operationName)); this.consumerLatency = new TimerMonitor(this.getPrefix() + ".consumerLatency"); - this.consumerCall = new CallMonitor(this.getPrefix() + ".consumerCall", MetricsDimension.DIMENSION_STATUS); + this.consumerCall = new CallMonitor(this.getPrefix() + ".consumerCall"); } public ConsumerInvocationMetric toMetric(int windowTimeIndex) { diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/ProducerInvocationMonitor.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/ProducerInvocationMonitor.java index 50a508cf72a..9c77ec8ced2 100644 --- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/ProducerInvocationMonitor.java +++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/ProducerInvocationMonitor.java @@ -18,7 +18,6 @@ package org.apache.servicecomb.metrics.core.monitor; import org.apache.servicecomb.metrics.common.MetricsConst; -import org.apache.servicecomb.metrics.common.MetricsDimension; import org.apache.servicecomb.metrics.common.ProducerInvocationMetric; import com.netflix.servo.monitor.BasicCounter; @@ -61,7 +60,7 @@ public ProducerInvocationMonitor(String operationName) { this.lifeTimeInQueue = new TimerMonitor(this.getPrefix() + ".lifeTimeInQueue"); this.executionTime = new TimerMonitor(this.getPrefix() + ".executionTime"); this.producerLatency = new TimerMonitor(this.getPrefix() + ".producerLatency"); - this.producerCall = new CallMonitor(this.getPrefix() + ".producerCall", MetricsDimension.DIMENSION_STATUS); + this.producerCall = new CallMonitor(this.getPrefix() + ".producerCall"); } public ProducerInvocationMetric toMetric(int windowTimeIndex) { diff --git a/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/TestEventAndRunner.java b/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/TestEventAndRunner.java index 8e87439b8a1..85cf4634303 100644 --- a/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/TestEventAndRunner.java +++ b/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/TestEventAndRunner.java @@ -36,6 +36,7 @@ import org.apache.servicecomb.metrics.common.MetricsDimension; import org.apache.servicecomb.metrics.common.RegistryMetric; import org.apache.servicecomb.metrics.core.event.DefaultEventListenerManager; +import org.apache.servicecomb.metrics.core.event.dimension.StatusConvertorFactory; import org.apache.servicecomb.metrics.core.monitor.DefaultSystemMonitor; import org.apache.servicecomb.metrics.core.monitor.RegistryMonitor; import org.apache.servicecomb.metrics.core.publish.DefaultDataSource; @@ -74,7 +75,8 @@ public void test() throws InterruptedException { Assert.assertEquals(intervals.size(), 3); Assert.assertThat(intervals, containsInAnyOrder(Arrays.asList(1000L, 2000L, 3000L).toArray())); - new DefaultEventListenerManager(monitor); + new DefaultEventListenerManager(monitor, new StatusConvertorFactory(), + MetricsDimension.DIMENSION_STATUS_OUTPUT_LEVEL_SUCCESS_FAILED); //fun1 is a PRODUCER invocation call 2 time and all is completed //two time success @@ -84,7 +86,7 @@ public void test() throws InterruptedException { TimeUnit.MILLISECONDS.toNanos(100))); EventUtils .triggerEvent(new InvocationFinishedEvent("fun1", InvocationType.PRODUCER, - TimeUnit.MILLISECONDS.toNanos(200), TimeUnit.MILLISECONDS.toNanos(300), true)); + TimeUnit.MILLISECONDS.toNanos(200), TimeUnit.MILLISECONDS.toNanos(300), 200, true)); EventUtils.triggerEvent(new InvocationStartedEvent("fun1", InvocationType.PRODUCER, System.nanoTime())); EventUtils.triggerEvent( @@ -92,7 +94,7 @@ public void test() throws InterruptedException { TimeUnit.MILLISECONDS.toNanos(300))); EventUtils .triggerEvent(new InvocationFinishedEvent("fun1", InvocationType.PRODUCER, - TimeUnit.MILLISECONDS.toNanos(400), TimeUnit.MILLISECONDS.toNanos(700), false)); + TimeUnit.MILLISECONDS.toNanos(400), TimeUnit.MILLISECONDS.toNanos(700), 500, false)); //========================================================================== @@ -116,7 +118,7 @@ public void test() throws InterruptedException { TimeUnit.MILLISECONDS.toNanos(100))); EventUtils .triggerEvent(new InvocationFinishedEvent("fun2", InvocationType.CONSUMER, - TimeUnit.MILLISECONDS.toNanos(200), TimeUnit.MILLISECONDS.toNanos(300), true)); + TimeUnit.MILLISECONDS.toNanos(200), TimeUnit.MILLISECONDS.toNanos(300), 200, true)); //========================================================================== @@ -159,16 +161,20 @@ public void test() throws InterruptedException { Assert.assertEquals(4, model.getInstanceMetric().getProducerMetric().getProducerCall() .getTpsValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_ALL).getValue(), 0); Assert.assertEquals(1, model.getInstanceMetric().getProducerMetric().getProducerCall() - .getTpsValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_SUCCESS).getValue(), 0); + .getTpsValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_SUCCESS_FAILED_SUCCESS) + .getValue(), 0); Assert.assertEquals(1, model.getInstanceMetric().getProducerMetric().getProducerCall() - .getTpsValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_FAILED).getValue(), 0); + .getTpsValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_SUCCESS_FAILED_FAILED) + .getValue(), 0); Assert.assertEquals(4, model.getInstanceMetric().getProducerMetric().getProducerCall() .getTotalValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_ALL).getValue(), 0); Assert.assertEquals(1, model.getInstanceMetric().getProducerMetric().getProducerCall() - .getTotalValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_SUCCESS).getValue(), 0); + .getTotalValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_SUCCESS_FAILED_SUCCESS) + .getValue(), 0); Assert.assertEquals(1, model.getInstanceMetric().getProducerMetric().getProducerCall() - .getTotalValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_FAILED).getValue(), 0); + .getTotalValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_SUCCESS_FAILED_FAILED) + .getValue(), 0); Assert.assertEquals(1, model.getInstanceMetric().getConsumerMetric().getConsumerLatency().getCount()); Assert.assertEquals(300, model.getInstanceMetric().getConsumerMetric().getConsumerLatency().getTotal(), @@ -183,16 +189,20 @@ public void test() throws InterruptedException { Assert.assertEquals(1, model.getInstanceMetric().getConsumerMetric().getConsumerCall() .getTpsValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_ALL).getValue(), 0); Assert.assertEquals(1, model.getInstanceMetric().getConsumerMetric().getConsumerCall() - .getTpsValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_SUCCESS).getValue(), 0); + .getTpsValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_SUCCESS_FAILED_SUCCESS) + .getValue(), 0); Assert.assertEquals(0, model.getInstanceMetric().getConsumerMetric().getConsumerCall() - .getTpsValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_FAILED).getValue(), 0); + .getTpsValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_SUCCESS_FAILED_FAILED) + .getValue(), 0); Assert.assertEquals(1, model.getInstanceMetric().getConsumerMetric().getConsumerCall() .getTotalValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_ALL).getValue(), 0); Assert.assertEquals(1, model.getInstanceMetric().getConsumerMetric().getConsumerCall() - .getTotalValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_SUCCESS).getValue(), 0); + .getTotalValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_SUCCESS_FAILED_SUCCESS) + .getValue(), 0); Assert.assertEquals(0, model.getInstanceMetric().getConsumerMetric().getConsumerCall() - .getTotalValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_FAILED).getValue(), 0); + .getTotalValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_SUCCESS_FAILED_FAILED) + .getValue(), 0); //check ProducerMetrics Assert.assertEquals(0, model.getProducerMetrics().get("fun1").getWaitInQueue()); @@ -217,16 +227,20 @@ public void test() throws InterruptedException { Assert.assertEquals(2, model.getProducerMetrics().get("fun1").getProducerCall() .getTpsValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_ALL).getValue(), 0); Assert.assertEquals(1, model.getProducerMetrics().get("fun1").getProducerCall() - .getTpsValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_SUCCESS).getValue(), 0); + .getTpsValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_SUCCESS_FAILED_SUCCESS) + .getValue(), 0); Assert.assertEquals(1, model.getProducerMetrics().get("fun1").getProducerCall() - .getTpsValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_FAILED).getValue(), 0); + .getTpsValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_SUCCESS_FAILED_FAILED) + .getValue(), 0); Assert.assertEquals(2, model.getProducerMetrics().get("fun1").getProducerCall() .getTotalValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_ALL).getValue(), 0); Assert.assertEquals(1, model.getProducerMetrics().get("fun1").getProducerCall() - .getTotalValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_SUCCESS).getValue(), 0); + .getTotalValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_SUCCESS_FAILED_SUCCESS) + .getValue(), 0); Assert.assertEquals(1, model.getProducerMetrics().get("fun1").getProducerCall() - .getTotalValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_FAILED).getValue(), 0); + .getTotalValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_SUCCESS_FAILED_FAILED) + .getValue(), 0); //fun3 Assert.assertEquals(0, model.getProducerMetrics().get("fun3").getWaitInQueue()); @@ -251,16 +265,20 @@ public void test() throws InterruptedException { Assert.assertEquals(1, model.getProducerMetrics().get("fun3").getProducerCall() .getTpsValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_ALL).getValue(), 0); Assert.assertEquals(0, model.getProducerMetrics().get("fun3").getProducerCall() - .getTpsValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_SUCCESS).getValue(), 0); + .getTpsValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_SUCCESS_FAILED_SUCCESS) + .getValue(), 0); Assert.assertEquals(0, model.getProducerMetrics().get("fun3").getProducerCall() - .getTpsValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_FAILED).getValue(), 0); + .getTpsValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_SUCCESS_FAILED_FAILED) + .getValue(), 0); Assert.assertEquals(1, model.getProducerMetrics().get("fun3").getProducerCall() .getTotalValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_ALL).getValue(), 0); Assert.assertEquals(0, model.getProducerMetrics().get("fun3").getProducerCall() - .getTotalValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_SUCCESS).getValue(), 0); + .getTotalValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_SUCCESS_FAILED_SUCCESS) + .getValue(), 0); Assert.assertEquals(0, model.getProducerMetrics().get("fun3").getProducerCall() - .getTotalValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_FAILED).getValue(), 0); + .getTotalValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_SUCCESS_FAILED_FAILED) + .getValue(), 0); //check ConsumerMetrics //no need @@ -273,19 +291,23 @@ public void test() throws InterruptedException { Assert.assertEquals(1, model.getConsumerMetrics().get("fun2").getConsumerCall() .getTpsValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_ALL).getValue(), 0); Assert.assertEquals(1, model.getConsumerMetrics().get("fun2").getConsumerCall() - .getTpsValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_SUCCESS).getValue(), 0); + .getTpsValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_SUCCESS_FAILED_SUCCESS) + .getValue(), 0); Assert.assertEquals(0, model.getConsumerMetrics().get("fun2").getConsumerCall() - .getTpsValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_FAILED).getValue(), 0); + .getTpsValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_SUCCESS_FAILED_FAILED) + .getValue(), 0); Assert.assertEquals(1, model.getConsumerMetrics().get("fun2").getConsumerCall() .getTotalValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_ALL).getValue(), 0); Assert.assertEquals(1, model.getConsumerMetrics().get("fun2").getConsumerCall() - .getTotalValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_SUCCESS).getValue(), 0); + .getTotalValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_SUCCESS_FAILED_SUCCESS) + .getValue(), 0); Assert.assertEquals(0, model.getConsumerMetrics().get("fun2").getConsumerCall() - .getTotalValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_FAILED).getValue(), 0); + .getTotalValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_SUCCESS_FAILED_FAILED) + .getValue(), 0); Map metrics = model.toMap(); - Assert.assertEquals(120, metrics.size()); + Assert.assertEquals(108, metrics.size()); Assert.assertEquals(1.0, model.getInstanceMetric().getSystemMetric().getCpuLoad(), 0); Assert.assertEquals(2, model.getInstanceMetric().getSystemMetric().getCpuRunningThreads(), 0); diff --git a/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/TestStatusDimension.java b/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/TestStatusDimension.java new file mode 100644 index 00000000000..0a113fb9a04 --- /dev/null +++ b/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/TestStatusDimension.java @@ -0,0 +1,158 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.servicecomb.metrics.core; + +import java.util.concurrent.TimeUnit; + +import org.apache.servicecomb.core.metrics.InvocationFinishedEvent; +import org.apache.servicecomb.core.metrics.InvocationStartProcessingEvent; +import org.apache.servicecomb.core.metrics.InvocationStartedEvent; +import org.apache.servicecomb.foundation.common.utils.EventUtils; +import org.apache.servicecomb.metrics.common.MetricsDimension; +import org.apache.servicecomb.metrics.common.RegistryMetric; +import org.apache.servicecomb.metrics.core.event.DefaultEventListenerManager; +import org.apache.servicecomb.metrics.core.event.dimension.StatusConvertorFactory; +import org.apache.servicecomb.metrics.core.monitor.DefaultSystemMonitor; +import org.apache.servicecomb.metrics.core.monitor.RegistryMonitor; +import org.apache.servicecomb.metrics.core.publish.DefaultDataSource; +import org.apache.servicecomb.swagger.invocation.InvocationType; +import org.junit.Assert; +import org.junit.Test; + +public class TestStatusDimension { + + @Test + public void testCodeGroupDimension() throws InterruptedException { + RegistryMetric model = prepare(MetricsDimension.DIMENSION_STATUS_OUTPUT_LEVEL_CODE_GROUP); + + Assert.assertEquals(5, model.getInstanceMetric().getProducerMetric().getProducerCall() + .getTpsValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_ALL).getValue(), 0); + Assert.assertEquals(1, model.getInstanceMetric().getProducerMetric().getProducerCall() + .getTpsValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_CODE_GROUP_2XX) + .getValue(), 0); + Assert.assertEquals(1, model.getInstanceMetric().getProducerMetric().getProducerCall() + .getTpsValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_CODE_GROUP_3XX) + .getValue(), 0); + Assert.assertEquals(1, model.getInstanceMetric().getProducerMetric().getProducerCall() + .getTpsValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_CODE_GROUP_4XX) + .getValue(), 0); + Assert.assertEquals(1, model.getInstanceMetric().getProducerMetric().getProducerCall() + .getTpsValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_CODE_GROUP_5XX) + .getValue(), 0); + Assert.assertEquals(1, model.getInstanceMetric().getProducerMetric().getProducerCall() + .getTpsValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_CODE_GROUP_OTHER) + .getValue(), 0); + + Assert.assertEquals(1, model.getInstanceMetric().getConsumerMetric().getConsumerCall() + .getTotalValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_ALL).getValue(), 0); + Assert.assertEquals(1, model.getInstanceMetric().getConsumerMetric().getConsumerCall() + .getTotalValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_CODE_GROUP_2XX) + .getValue(), 0); + } + + @Test + public void testCodeDimension() throws InterruptedException { + RegistryMetric model = prepare(MetricsDimension.DIMENSION_STATUS_OUTPUT_LEVEL_CODE); + + Assert.assertEquals(5, model.getInstanceMetric().getProducerMetric().getProducerCall() + .getTpsValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_ALL).getValue(), 0); + Assert.assertEquals(1, model.getInstanceMetric().getProducerMetric().getProducerCall() + .getTpsValue(MetricsDimension.DIMENSION_STATUS, "222") + .getValue(), 0); + Assert.assertEquals(1, model.getInstanceMetric().getProducerMetric().getProducerCall() + .getTpsValue(MetricsDimension.DIMENSION_STATUS, "333") + .getValue(), 0); + Assert.assertEquals(1, model.getInstanceMetric().getProducerMetric().getProducerCall() + .getTpsValue(MetricsDimension.DIMENSION_STATUS, "444") + .getValue(), 0); + Assert.assertEquals(1, model.getInstanceMetric().getProducerMetric().getProducerCall() + .getTpsValue(MetricsDimension.DIMENSION_STATUS, "555") + .getValue(), 0); + Assert.assertEquals(1, model.getInstanceMetric().getProducerMetric().getProducerCall() + .getTpsValue(MetricsDimension.DIMENSION_STATUS, "666") + .getValue(), 0); + + Assert.assertEquals(1, model.getInstanceMetric().getConsumerMetric().getConsumerCall() + .getTotalValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_ALL).getValue(), 0); + Assert.assertEquals(1, model.getInstanceMetric().getConsumerMetric().getConsumerCall() + .getTotalValue(MetricsDimension.DIMENSION_STATUS, "200") + .getValue(), 0); + } + + private RegistryMetric prepare(String outputLevel) throws InterruptedException { + DefaultSystemMonitor systemMonitor = new DefaultSystemMonitor(); + RegistryMonitor monitor = new RegistryMonitor(systemMonitor); + DefaultDataSource dataSource = new DefaultDataSource(monitor, "1000,2000,3000"); + + new DefaultEventListenerManager(monitor, new StatusConvertorFactory(), outputLevel); + + EventUtils.triggerEvent(new InvocationStartedEvent("fun1", InvocationType.PRODUCER, System.nanoTime())); + EventUtils.triggerEvent( + new InvocationStartProcessingEvent("fun1", InvocationType.PRODUCER, + TimeUnit.MILLISECONDS.toNanos(100))); + EventUtils + .triggerEvent(new InvocationFinishedEvent("fun1", InvocationType.PRODUCER, + TimeUnit.MILLISECONDS.toNanos(200), TimeUnit.MILLISECONDS.toNanos(300), 222, true)); + + EventUtils.triggerEvent(new InvocationStartedEvent("fun1", InvocationType.PRODUCER, System.nanoTime())); + EventUtils.triggerEvent( + new InvocationStartProcessingEvent("fun1", InvocationType.PRODUCER, + TimeUnit.MILLISECONDS.toNanos(100))); + EventUtils + .triggerEvent(new InvocationFinishedEvent("fun1", InvocationType.PRODUCER, + TimeUnit.MILLISECONDS.toNanos(200), TimeUnit.MILLISECONDS.toNanos(300), 333, false)); + + EventUtils.triggerEvent(new InvocationStartedEvent("fun1", InvocationType.PRODUCER, System.nanoTime())); + EventUtils.triggerEvent( + new InvocationStartProcessingEvent("fun1", InvocationType.PRODUCER, + TimeUnit.MILLISECONDS.toNanos(100))); + EventUtils + .triggerEvent(new InvocationFinishedEvent("fun1", InvocationType.PRODUCER, + TimeUnit.MILLISECONDS.toNanos(200), TimeUnit.MILLISECONDS.toNanos(300), 444, false)); + + EventUtils.triggerEvent(new InvocationStartedEvent("fun1", InvocationType.PRODUCER, System.nanoTime())); + EventUtils.triggerEvent( + new InvocationStartProcessingEvent("fun1", InvocationType.PRODUCER, + TimeUnit.MILLISECONDS.toNanos(100))); + EventUtils + .triggerEvent(new InvocationFinishedEvent("fun1", InvocationType.PRODUCER, + TimeUnit.MILLISECONDS.toNanos(200), TimeUnit.MILLISECONDS.toNanos(300), 555, false)); + + EventUtils.triggerEvent(new InvocationStartedEvent("fun1", InvocationType.PRODUCER, System.nanoTime())); + EventUtils.triggerEvent( + new InvocationStartProcessingEvent("fun1", InvocationType.PRODUCER, + TimeUnit.MILLISECONDS.toNanos(100))); + EventUtils + .triggerEvent(new InvocationFinishedEvent("fun1", InvocationType.PRODUCER, + TimeUnit.MILLISECONDS.toNanos(200), TimeUnit.MILLISECONDS.toNanos(300), 666, false)); + + //fun2 is a CONSUMER invocation call once and completed + EventUtils.triggerEvent(new InvocationStartedEvent("fun2", InvocationType.CONSUMER, System.nanoTime())); + EventUtils.triggerEvent( + new InvocationStartProcessingEvent("fun2", InvocationType.CONSUMER, + TimeUnit.MILLISECONDS.toNanos(100))); + EventUtils + .triggerEvent(new InvocationFinishedEvent("fun2", InvocationType.CONSUMER, + TimeUnit.MILLISECONDS.toNanos(200), TimeUnit.MILLISECONDS.toNanos(300), 200, true)); + + //sim lease one window time + Thread.sleep(1000); + + return dataSource.getRegistryMetric(1000); + } +} 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 ba8c126d0de..020c926a3fb 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 @@ -134,7 +134,7 @@ private void doRunInExecutor(QueueMetrics metricsData, InvocationStartedEvent st invocation.next(response -> { sendResponse(invocation.getContext(), response); endMetrics(invocation); - invocation.triggerFinishedEvent(response.isSuccessed()); + invocation.triggerFinishedEvent(response.getStatusCode(), response.isSuccessed()); }); }