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() {