You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@skywalking.apache.org by wu...@apache.org on 2019/03/06 07:01:23 UTC
[incubator-skywalking] branch envoy-metric updated: Finish metric
extension and oal.
This is an automated email from the ASF dual-hosted git repository.
wusheng pushed a commit to branch envoy-metric
in repository https://gitbox.apache.org/repos/asf/incubator-skywalking.git
The following commit(s) were added to refs/heads/envoy-metric by this push:
new 5e3e296 Finish metric extension and oal.
5e3e296 is described below
commit 5e3e2962e6dc3796100c88f965242e5313d0a74d
Author: Wu Sheng <wu...@foxmail.com>
AuthorDate: Wed Mar 6 14:45:49 2019 +0800
Finish metric extension and oal.
---
.../src/main/resources/generator-scope-meta.yml | 12 ++-
.../src/main/resources/official_analysis.oal | 5 ++
.../{MaxIndicator.java => MaxDoubleIndicator.java} | 23 +++---
.../{MaxIndicator.java => MaxLongIndicator.java} | 4 +-
.../oap/server/core/source/DefaultScopeDefine.java | 11 ++-
.../server/core/source/EnvoyInstanceMetric.java | 1 +
...ndicatorTest.java => MaxLongIndicatorTest.java} | 10 +--
.../receiver/envoy/MetricServiceGRPCHandler.java | 87 ++++++++++++++++++++--
8 files changed, 119 insertions(+), 34 deletions(-)
diff --git a/oap-server/generated-analysis/src/main/resources/generator-scope-meta.yml b/oap-server/generated-analysis/src/main/resources/generator-scope-meta.yml
index 2e2c9f5..603a766 100644
--- a/oap-server/generated-analysis/src/main/resources/generator-scope-meta.yml
+++ b/oap-server/generated-analysis/src/main/resources/generator-scope-meta.yml
@@ -163,4 +163,14 @@ scopes:
- fieldName: serviceInstanceId
columnName: service_instance_id
typeName: int
- ID: false
\ No newline at end of file
+ ID: false
+ - name: EnvoyInstanceMetric
+ columns:
+ - fieldName: entityId
+ columnName: entity_id
+ typeName: java.lang.String
+ ID: true
+ - fieldName: serviceInstanceId
+ columnName: service_instance_id
+ typeName: int
+ ID: false
\ No newline at end of file
diff --git a/oap-server/generated-analysis/src/main/resources/official_analysis.oal b/oap-server/generated-analysis/src/main/resources/official_analysis.oal
index 808ce58..799a118 100644
--- a/oap-server/generated-analysis/src/main/resources/official_analysis.oal
+++ b/oap-server/generated-analysis/src/main/resources/official_analysis.oal
@@ -91,3 +91,8 @@ instance_clr_available_completion_port_threads = from(ServiceInstanceCLRThread.a
instance_clr_available_worker_threads = from(ServiceInstanceCLRThread.availableWorkerThreads).max();
instance_clr_max_completion_port_threads = from(ServiceInstanceCLRThread.maxCompletionPortThreads).max();
instance_clr_max_worker_threads = from(ServiceInstanceCLRThread.maxWorkerThreads).max();
+
+// Envoy instance metric
+envoy_heap_memory_max_used = from(EnvoyInstanceMetric.value).filter(name == "server.memory_heap_size").maxDouble();
+envoy_total_connections_used = from(EnvoyInstanceMetric.value).filter(name == "server.total_connections").maxDouble();
+envoy_parent_connections_used = from(EnvoyInstanceMetric.value).filter(name == "server.parent_connections").maxDouble();
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/indicator/MaxIndicator.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/indicator/MaxDoubleIndicator.java
similarity index 71%
copy from oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/indicator/MaxIndicator.java
copy to oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/indicator/MaxDoubleIndicator.java
index be968d4..ed1251a 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/indicator/MaxIndicator.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/indicator/MaxDoubleIndicator.java
@@ -18,39 +18,36 @@
package org.apache.skywalking.oap.server.core.analysis.indicator;
-import lombok.Getter;
-import lombok.Setter;
-import org.apache.skywalking.oap.server.core.analysis.indicator.annotation.Entrance;
-import org.apache.skywalking.oap.server.core.analysis.indicator.annotation.IndicatorFunction;
-import org.apache.skywalking.oap.server.core.analysis.indicator.annotation.SourceFrom;
+import lombok.*;
+import org.apache.skywalking.oap.server.core.analysis.indicator.annotation.*;
import org.apache.skywalking.oap.server.core.storage.annotation.Column;
/**
- * @author liuhaoyang
- **/
-@IndicatorFunction(functionName = "max")
-public abstract class MaxIndicator extends Indicator implements LongValueHolder {
+ * @author wusheng
+ */
+@IndicatorFunction(functionName = "maxDouble")
+public abstract class MaxDoubleIndicator extends Indicator implements DoubleValueHolder {
protected static final String VALUE = "value";
- @Getter @Setter @Column(columnName = VALUE, isValue = true) private long value;
+ @Getter @Setter @Column(columnName = VALUE, isValue = true) private double value;
@Entrance
- public final void combine(@SourceFrom long count) {
+ public final void combine(@SourceFrom double count) {
if (count > this.value) {
this.value = count;
}
}
@Override public final void combine(Indicator indicator) {
- MaxIndicator countIndicator = (MaxIndicator)indicator;
+ MaxDoubleIndicator countIndicator = (MaxDoubleIndicator)indicator;
combine(countIndicator.value);
}
@Override public void calculate() {
}
- @Override public long getValue() {
+ @Override public double getValue() {
return value;
}
}
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/indicator/MaxIndicator.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/indicator/MaxLongIndicator.java
similarity index 92%
rename from oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/indicator/MaxIndicator.java
rename to oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/indicator/MaxLongIndicator.java
index be968d4..db2638a 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/indicator/MaxIndicator.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/indicator/MaxLongIndicator.java
@@ -29,7 +29,7 @@ import org.apache.skywalking.oap.server.core.storage.annotation.Column;
* @author liuhaoyang
**/
@IndicatorFunction(functionName = "max")
-public abstract class MaxIndicator extends Indicator implements LongValueHolder {
+public abstract class MaxLongIndicator extends Indicator implements LongValueHolder {
protected static final String VALUE = "value";
@@ -43,7 +43,7 @@ public abstract class MaxIndicator extends Indicator implements LongValueHolder
}
@Override public final void combine(Indicator indicator) {
- MaxIndicator countIndicator = (MaxIndicator)indicator;
+ MaxLongIndicator countIndicator = (MaxLongIndicator)indicator;
combine(countIndicator.value);
}
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/DefaultScopeDefine.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/DefaultScopeDefine.java
index d6576e3..a507597 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/DefaultScopeDefine.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/DefaultScopeDefine.java
@@ -31,6 +31,11 @@ public class DefaultScopeDefine {
private static final Map<String, Integer> NAME_2_ID = new HashMap<>();
private static final Map<Integer, String> ID_2_NAME = new HashMap<>();
+ /**
+ * All metric IDs in [0, 10,000) are reserved in Apache SkyWalking.
+ *
+ * If you want to extend the scope, recommend to start with 10,000.
+ */
public static final int ALL = 0;
public static final int SERVICE = 1;
public static final int SERVICE_INSTANCE = 2;
@@ -55,12 +60,6 @@ public class DefaultScopeDefine {
public static final int SERVICE_INSTANCE_CLR_THREAD = 21;
public static final int ENVOY_INSTANCE_METRIC = 22;
- /**
- * All metric IDs in [0, 10,000) are reserved in Apache SkyWalking.
- *
- * If you want to extend the scope, recommend to start with 10,000.
- */
-
public static class Listener implements AnnotationListener {
@Override public Class<? extends Annotation> annotation() {
return ScopeDeclaration.class;
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/EnvoyInstanceMetric.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/EnvoyInstanceMetric.java
index 0a5eafb..f2c0dff 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/EnvoyInstanceMetric.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/EnvoyInstanceMetric.java
@@ -44,6 +44,7 @@ public class EnvoyInstanceMetric extends Source {
*/
@Getter @Setter private int id;
@Getter @Setter private int serviceId;
+ @Getter @Setter private int serviceInstanceId;
@Getter @Setter private String name;
@Getter @Setter private String serviceName;
@Getter @Setter private String metricName;
diff --git a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/indicator/MaxIndicatorTest.java b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/indicator/MaxLongIndicatorTest.java
similarity index 87%
rename from oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/indicator/MaxIndicatorTest.java
rename to oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/indicator/MaxLongIndicatorTest.java
index 0c2ebd6..b7d9355 100644
--- a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/indicator/MaxIndicatorTest.java
+++ b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/indicator/MaxLongIndicatorTest.java
@@ -25,11 +25,11 @@ import org.junit.Test;
/**
* @author liuhaoyang
**/
-public class MaxIndicatorTest {
+public class MaxLongIndicatorTest {
@Test
public void testEntranceCombine() {
- MaxIndicatorImpl impl = new MaxIndicatorImpl();
+ MaxLongIndicatorImpl impl = new MaxLongIndicatorImpl();
impl.combine(10);
impl.combine(5);
impl.combine(20);
@@ -39,11 +39,11 @@ public class MaxIndicatorTest {
@Test
public void testSelfCombine() {
- MaxIndicatorImpl impl = new MaxIndicatorImpl();
+ MaxLongIndicatorImpl impl = new MaxLongIndicatorImpl();
impl.combine(10);
impl.combine(5);
- MaxIndicatorImpl impl2 = new MaxIndicatorImpl();
+ MaxLongIndicatorImpl impl2 = new MaxLongIndicatorImpl();
impl.combine(2);
impl.combine(6);
@@ -51,7 +51,7 @@ public class MaxIndicatorTest {
Assert.assertEquals(10, impl.getValue());
}
- public class MaxIndicatorImpl extends MaxIndicator {
+ public class MaxLongIndicatorImpl extends MaxLongIndicator {
@Override public String id() {
return null;
diff --git a/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/MetricServiceGRPCHandler.java b/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/MetricServiceGRPCHandler.java
index 3bc6fe3..37db515 100644
--- a/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/MetricServiceGRPCHandler.java
+++ b/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/MetricServiceGRPCHandler.java
@@ -22,8 +22,15 @@ import io.envoyproxy.envoy.api.v2.core.Node;
import io.envoyproxy.envoy.service.metrics.v2.*;
import io.grpc.stub.StreamObserver;
import io.prometheus.client.Metrics;
+import java.util.List;
import org.apache.skywalking.apm.util.StringUtil;
+import org.apache.skywalking.oap.server.core.*;
+import org.apache.skywalking.oap.server.core.register.service.*;
+import org.apache.skywalking.oap.server.core.source.*;
import org.apache.skywalking.oap.server.library.module.ModuleManager;
+import org.apache.skywalking.oap.server.library.util.TimeBucketUtils;
+import org.apache.skywalking.oap.server.telemetry.TelemetryModule;
+import org.apache.skywalking.oap.server.telemetry.api.*;
import org.slf4j.*;
/**
@@ -32,8 +39,21 @@ import org.slf4j.*;
public class MetricServiceGRPCHandler extends MetricsServiceGrpc.MetricsServiceImplBase {
private static final Logger logger = LoggerFactory.getLogger(MetricServiceGRPCHandler.class);
- public MetricServiceGRPCHandler(ModuleManager moduleManager
- ) {
+ private final IServiceInventoryRegister serviceInventoryRegister;
+ private final IServiceInstanceInventoryRegister serviceInstanceInventoryRegister;
+ private final SourceReceiver sourceReceiver;
+ private CounterMetric counter;
+ private HistogramMetric histogram;
+
+ public MetricServiceGRPCHandler(ModuleManager moduleManager) {
+ serviceInventoryRegister = moduleManager.find(CoreModule.NAME).provider().getService(IServiceInventoryRegister.class);
+ serviceInstanceInventoryRegister = moduleManager.find(CoreModule.NAME).provider().getService(IServiceInstanceInventoryRegister.class);
+ sourceReceiver = moduleManager.find(CoreModule.NAME).provider().getService(SourceReceiver.class);
+ MetricCreator metricCreator = moduleManager.find(TelemetryModule.NAME).provider().getService(MetricCreator.class);
+ counter = metricCreator.createCounter("envoy_metric_in_count", "The count of envoy service metric received",
+ MetricTag.EMPTY_KEY, MetricTag.EMPTY_VALUE);
+ histogram = metricCreator.createHistogramMetric("envoy_metric_in_latency", "The process latency of service metric receiver",
+ MetricTag.EMPTY_KEY, MetricTag.EMPTY_VALUE);
}
@Override
@@ -41,6 +61,9 @@ public class MetricServiceGRPCHandler extends MetricsServiceGrpc.MetricsServiceI
return new StreamObserver<StreamMetricsMessage>() {
private boolean isFirst = true;
private String serviceName = null;
+ private int serviceId = Const.NONE;
+ private String serviceInstanceName = null;
+ private int serviceInstanceId = Const.NONE;
@Override public void onNext(StreamMetricsMessage message) {
if (isFirst) {
@@ -50,24 +73,74 @@ public class MetricServiceGRPCHandler extends MetricsServiceGrpc.MetricsServiceI
if (node != null) {
String nodeId = node.getId();
if (!StringUtil.isEmpty(nodeId)) {
- serviceName = nodeId;
+ serviceInstanceName = nodeId;
String cluster = node.getCluster();
if (!StringUtil.isEmpty(cluster)) {
- serviceName = nodeId + "." + cluster;
+ serviceName = cluster;
}
}
}
+
+ if (serviceName == null) {
+ serviceName = serviceInstanceName;
+ }
+
+ if (logger.isDebugEnabled()) {
+ logger.debug("Envoy metric reported from service[{}], service instance[{}]", serviceName, serviceInstanceName);
+ }
+
+ if (serviceInstanceName != null) {
+ serviceId = serviceInventoryRegister.getOrCreate(serviceName, null);
+ if (serviceId != Const.NONE) {
+ serviceInstanceId = serviceInstanceInventoryRegister.getOrCreate(serviceId, serviceInstanceName, serviceInstanceName, System.currentTimeMillis(), null);
+ }
+ }
}
- if (serviceName != null) {
- for (Metrics.MetricFamily metricFamily : message.getEnvoyMetricsList()) {
+ if (serviceInstanceId != Const.NONE) {
+ List<Metrics.MetricFamily> list = message.getEnvoyMetricsList();
+ for (int i = 0; i < list.size(); i++) {
+ counter.inc();
+ HistogramMetric.Timer timer = histogram.createTimer();
+ try {
+ Metrics.MetricFamily metricFamily = list.get(i);
+ double value = 0;
+ long timestamp = 0;
+ switch (metricFamily.getType()) {
+ case GAUGE:
+ for (Metrics.Metric metric : metricFamily.getMetricList()) {
+ timestamp = metric.getTimestampMs();
+ value = metric.getCounter().getValue();
+ }
+ break;
+ default:
+ continue;
+ }
+ if (i == 0) {
+ // Send heartbeat
+ serviceInventoryRegister.heartbeat(serviceId, timestamp);
+ serviceInstanceInventoryRegister.heartbeat(serviceInstanceId, timestamp);
+ }
+ EnvoyInstanceMetric metric = new EnvoyInstanceMetric();
+ metric.setServiceId(serviceId);
+ metric.setServiceName(serviceName);
+ metric.setId(serviceInstanceId);
+ metric.setServiceInstanceId(serviceInstanceId);
+ metric.setName(serviceInstanceName);
+ metric.setMetricName(metricFamily.getName());
+ metric.setValue(value);
+ metric.setTimeBucket(TimeBucketUtils.INSTANCE.getMinuteTimeBucket(timestamp));
+ sourceReceiver.receive(metric);
+ } finally {
+ timer.finish();
+ }
}
}
}
@Override public void onError(Throwable throwable) {
-
+ logger.error("Error in receiving metric from envoy", throwable);
}
@Override public void onCompleted() {