You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@skywalking.apache.org by ke...@apache.org on 2021/01/16 14:46:08 UTC

[skywalking] branch als/polish updated (bddccd9 -> ba02385)

This is an automated email from the ASF dual-hosted git repository.

kezhenxu94 pushed a change to branch als/polish
in repository https://gitbox.apache.org/repos/asf/skywalking.git.


 discard bddccd9  Polish ALS
     new ba02385  Polish ALS

This update added new revisions after undoing existing revisions.
That is to say, some revisions that were in the old version of the
branch are not in the new version.  This situation occurs
when a user --force pushes a change and generates a repository
containing something like this:

 * -- * -- B -- O -- O -- O   (bddccd9)
            \
             N -- N -- N   refs/heads/als/polish (ba02385)

You should already have received notification emails for all of the O
revisions, and so the following emails describe only the N revisions
from the common base, B.

Any revisions marked "omit" are not gone; other references still
refer to them.  Any revisions marked "discard" are gone forever.

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 CHANGES.md | 1 +
 1 file changed, 1 insertion(+)


[skywalking] 01/01: Polish ALS

Posted by ke...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

kezhenxu94 pushed a commit to branch als/polish
in repository https://gitbox.apache.org/repos/asf/skywalking.git

commit ba023853080533580df1d5c388677710b9d80e44
Author: kezhenxu94 <ke...@apache.org>
AuthorDate: Sat Jan 16 21:19:54 2021 +0800

    Polish ALS
---
 CHANGES.md                                         |  1 +
 .../src/main/resources/application.yml             |  1 +
 .../envoy-metrics-receiver-plugin/pom.xml          |  5 ++
 .../server/receiver/envoy/ALSCounterCollector.java | 83 ++++++++++++++++++++++
 .../envoy/AccessLogServiceGRPCHandler.java         | 25 +++++--
 .../receiver/envoy/EnvoyMetricReceiverConfig.java  |  5 ++
 .../envoy/EnvoyMetricReceiverProvider.java         | 10 +--
 .../receiver/envoy/als/AbstractALSAnalyzer.java    |  3 -
 .../envoy/als/mx/ServiceMetaInfoAdapter.java       |  2 +-
 9 files changed, 123 insertions(+), 12 deletions(-)

diff --git a/CHANGES.md b/CHANGES.md
index 51d722c..abdbd3d 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -67,6 +67,7 @@ Release Notes.
 * Fix bug endpoint name grouping not work due to setting service name and endpoint name out of order.
 * Fix receiver analysis error count metrics
 * Log collecting and query implementation
+* Add a config to enable / disable metrics service and some polishes of ALS.
 
 #### UI
 * Fix un-removed tags in trace query.
diff --git a/oap-server/server-bootstrap/src/main/resources/application.yml b/oap-server/server-bootstrap/src/main/resources/application.yml
index 7af29a4..2a52634 100755
--- a/oap-server/server-bootstrap/src/main/resources/application.yml
+++ b/oap-server/server-bootstrap/src/main/resources/application.yml
@@ -266,6 +266,7 @@ envoy-metric:
   selector: ${SW_ENVOY_METRIC:default}
   default:
     acceptMetricsService: ${SW_ENVOY_METRIC_SERVICE:true}
+    enableALS: ${SW_ENABLE_ENVOY_ALS:true}
     alsHTTPAnalysis: ${SW_ENVOY_METRIC_ALS_HTTP_ANALYSIS:""}
     # `k8sServiceNameRule` allows you to customize the service name in ALS via Kubernetes metadata,
     # the available variables are `pod`, `service`, f.e., you can use `${service.metadata.name}-${pod.metadata.labels.version}`
diff --git a/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/pom.xml b/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/pom.xml
index c1caf8b..c5f019f 100644
--- a/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/pom.xml
+++ b/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/pom.xml
@@ -71,5 +71,10 @@
             <groupId>com.google.flatbuffers</groupId>
             <artifactId>flatbuffers-java</artifactId>
         </dependency>
+
+        <dependency>
+            <groupId>io.prometheus</groupId>
+            <artifactId>simpleclient</artifactId>
+        </dependency>
     </dependencies>
 </project>
diff --git a/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/ALSCounterCollector.java b/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/ALSCounterCollector.java
new file mode 100644
index 0000000..565936e
--- /dev/null
+++ b/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/ALSCounterCollector.java
@@ -0,0 +1,83 @@
+/*
+ * 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.skywalking.oap.server.receiver.envoy;
+
+import com.google.common.cache.Cache;
+import com.google.common.cache.CacheBuilder;
+import com.google.common.collect.Lists;
+import io.prometheus.client.Collector;
+import io.prometheus.client.CounterMetricFamily;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.atomic.AtomicInteger;
+import lombok.AccessLevel;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * ALSCounterCollector intend to expose metrics with limit size.
+ */
+@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
+@Slf4j
+public class ALSCounterCollector extends Collector {
+
+    private final String name;
+    private final String help;
+    private final String[] labelNames;
+    private final Cache<String, CounterSample> cache;
+
+    static ALSCounterCollector newInstance(final String name, final String help, final String... labelNames) {
+        return new ALSCounterCollector(name, help, labelNames, CacheBuilder.newBuilder()
+            .maximumSize(1000)
+            .build());
+    }
+
+    void inc(final String key, final int number, final String... labels) {
+        try {
+            cache.get(key, () -> new CounterSample(key, labels)).value.addAndGet(number);
+        } catch (final ExecutionException e) {
+            log.error("Get metric cache error", e);
+        }
+    }
+
+    @Override public List<MetricFamilySamples> collect() {
+        List<MetricFamilySamples> mfs = new ArrayList<>();
+        CounterMetricFamily labeledCounter = new CounterMetricFamily(name, help, Arrays.asList(labelNames));
+        cache.asMap().values().forEach(c -> {
+            if (labelNames.length != (1 + c.labels.length)) {
+                log.warn("Labels count is incorrect {}, {}", labelNames, c.labels);
+                return;
+            }
+            labeledCounter.addMetric(Lists.asList(c.key, c.labels), c.value.doubleValue());
+        });
+        mfs.add(labeledCounter);
+        return mfs;
+    }
+
+    @RequiredArgsConstructor
+    private static class CounterSample {
+        private final String key;
+
+        private final String[] labels;
+
+        private final AtomicInteger value = new AtomicInteger();
+    }
+}
diff --git a/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/AccessLogServiceGRPCHandler.java b/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/AccessLogServiceGRPCHandler.java
index 4d47072..2b5e60e 100644
--- a/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/AccessLogServiceGRPCHandler.java
+++ b/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/AccessLogServiceGRPCHandler.java
@@ -18,14 +18,17 @@
 
 package org.apache.skywalking.oap.server.receiver.envoy;
 
+import com.google.protobuf.TextFormat;
 import io.envoyproxy.envoy.data.accesslog.v3.HTTPAccessLogEntry;
 import io.envoyproxy.envoy.service.accesslog.v2.AccessLogServiceGrpc;
 import io.envoyproxy.envoy.service.accesslog.v3.StreamAccessLogsMessage;
 import io.envoyproxy.envoy.service.accesslog.v3.StreamAccessLogsResponse;
 import io.grpc.stub.StreamObserver;
 import java.util.ArrayList;
+import java.util.HashSet;
 import java.util.List;
 import java.util.ServiceLoader;
+import java.util.Set;
 import org.apache.skywalking.aop.server.receiver.mesh.TelemetryDataDispatcher;
 import org.apache.skywalking.apm.network.servicemesh.v3.ServiceMeshMetric;
 import org.apache.skywalking.oap.server.library.module.ModuleManager;
@@ -48,25 +51,34 @@ public class AccessLogServiceGRPCHandler extends AccessLogServiceGrpc.AccessLogS
     private final CounterMetrics counter;
     private final HistogramMetrics histogram;
     private final CounterMetrics sourceDispatcherCounter;
+    private final ALSCounterCollector alsCounterCollector;
 
     public AccessLogServiceGRPCHandler(ModuleManager manager,
                                        EnvoyMetricReceiverConfig config) throws ModuleStartException {
         ServiceLoader<ALSHTTPAnalysis> alshttpAnalyses = ServiceLoader.load(ALSHTTPAnalysis.class);
         envoyHTTPAnalysisList = new ArrayList<>();
+        if (config.getAlsHTTPAnalysis().isEmpty()) {
+            throw new ModuleStartException("There is no any ALS analysis here");
+        }
+        Set<String> names = new HashSet<>(3);
         for (String httpAnalysisName : config.getAlsHTTPAnalysis()) {
             for (ALSHTTPAnalysis httpAnalysis : alshttpAnalyses) {
+                names.add(httpAnalysis.name());
                 if (httpAnalysisName.equals(httpAnalysis.name())) {
                     httpAnalysis.init(manager, config);
                     envoyHTTPAnalysisList.add(httpAnalysis);
                 }
             }
         }
+        if (envoyHTTPAnalysisList.isEmpty()) {
+            throw new ModuleStartException("Analysis name must be one of " + names);
+        }
 
         LOGGER.debug("envoy HTTP analysis: " + envoyHTTPAnalysisList);
 
         MetricsCreator metricCreator = manager.find(TelemetryModule.NAME).provider().getService(MetricsCreator.class);
         counter = metricCreator.createCounter(
-            "envoy_als_in_count", "The count of envoy ALS metric received", MetricsTag.EMPTY_KEY,
+            "envoy_als_total_count", "The total count of envoy ALS metric received", MetricsTag.EMPTY_KEY,
             MetricsTag.EMPTY_VALUE
         );
         histogram = metricCreator.createHistogramMetric(
@@ -77,6 +89,11 @@ public class AccessLogServiceGRPCHandler extends AccessLogServiceGrpc.AccessLogS
             "envoy_als_source_dispatch_count", "The count of envoy ALS metric received", MetricsTag.EMPTY_KEY,
             MetricsTag.EMPTY_VALUE
         );
+        alsCounterCollector = ALSCounterCollector.newInstance(
+            "envoy_als_in_count", "The count of envoy ALS received, its labels indicate where/which envoy it's from",
+            "id", "cluster"
+        );
+        alsCounterCollector.register();
     }
 
     @Override
@@ -106,9 +123,8 @@ public class AccessLogServiceGRPCHandler extends AccessLogServiceGrpc.AccessLogS
 
                     if (LOGGER.isDebugEnabled()) {
                         LOGGER.debug(
-                            "Messaged is identified from Envoy[{}], role[{}] in [{}]. Received msg {}", identifier
-                                .getNode()
-                                .getId(), role, logCase, message);
+                            "Messaged is identified from Envoy[{}], role[{}] in [{}]. Received msg {}",
+                            identifier.getNode().getId(), role, logCase, TextFormat.shortDebugString(message));
                     }
 
                     switch (logCase) {
@@ -129,6 +145,7 @@ public class AccessLogServiceGRPCHandler extends AccessLogServiceGrpc.AccessLogS
                             }
 
                             sourceDispatcherCounter.inc(sourceResult.size());
+                            alsCounterCollector.inc(identifier.getNode().getId(), sourceResult.size(), identifier.getNode().getCluster());
                             sourceResult.forEach(TelemetryDataDispatcher::process);
                             break;
                     }
diff --git a/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/EnvoyMetricReceiverConfig.java b/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/EnvoyMetricReceiverConfig.java
index fb029fb..12f671d 100644
--- a/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/EnvoyMetricReceiverConfig.java
+++ b/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/EnvoyMetricReceiverConfig.java
@@ -24,6 +24,7 @@ import java.util.Collections;
 import java.util.List;
 import java.util.stream.Collectors;
 import lombok.Getter;
+import lombok.Setter;
 import org.apache.skywalking.oap.meter.analyzer.prometheus.rule.Rule;
 import org.apache.skywalking.oap.meter.analyzer.prometheus.rule.Rules;
 import org.apache.skywalking.oap.server.library.module.ModuleConfig;
@@ -31,7 +32,11 @@ import org.apache.skywalking.oap.server.library.module.ModuleStartException;
 
 public class EnvoyMetricReceiverConfig extends ModuleConfig {
     @Getter
+    @Setter
     private boolean acceptMetricsService = false;
+    @Getter
+    @Setter
+    private boolean enableALS = true;
     private String alsHTTPAnalysis;
     @Getter
     private String k8sServiceNameRule;
diff --git a/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/EnvoyMetricReceiverProvider.java b/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/EnvoyMetricReceiverProvider.java
index 1e3d8c0..4da7ff0 100644
--- a/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/EnvoyMetricReceiverProvider.java
+++ b/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/EnvoyMetricReceiverProvider.java
@@ -31,7 +31,7 @@ import org.apache.skywalking.oap.server.receiver.sharing.server.SharingServerMod
 import org.apache.skywalking.oap.server.telemetry.TelemetryModule;
 
 public class EnvoyMetricReceiverProvider extends ModuleProvider {
-    private final EnvoyMetricReceiverConfig config;
+    protected EnvoyMetricReceiverConfig config;
 
     protected String fieldMappingFile = "metadata-service-mapping.yaml";
 
@@ -73,9 +73,11 @@ public class EnvoyMetricReceiverProvider extends ModuleProvider {
             service.addHandler(handler);
             service.addHandler(new MetricServiceGRPCHandlerV3(handler));
         }
-        final AccessLogServiceGRPCHandler handler = new AccessLogServiceGRPCHandler(getManager(), config);
-        service.addHandler(handler);
-        service.addHandler(new AccessLogServiceGRPCHandlerV3(handler));
+        if (config.isEnableALS()) {
+            final AccessLogServiceGRPCHandler handler = new AccessLogServiceGRPCHandler(getManager(), config);
+            service.addHandler(handler);
+            service.addHandler(new AccessLogServiceGRPCHandlerV3(handler));
+        }
     }
 
     @Override
diff --git a/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/als/AbstractALSAnalyzer.java b/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/als/AbstractALSAnalyzer.java
index 462eeba..c4db727 100644
--- a/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/als/AbstractALSAnalyzer.java
+++ b/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/als/AbstractALSAnalyzer.java
@@ -33,9 +33,6 @@ public abstract class AbstractALSAnalyzer implements ALSHTTPAnalysis {
             return defaultRole;
         }
         final Node node = alsIdentifier.getNode();
-        if (node == null) {
-            return defaultRole;
-        }
         final String id = node.getId();
         if (id.startsWith("router~")) {
             return Role.PROXY;
diff --git a/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/als/mx/ServiceMetaInfoAdapter.java b/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/als/mx/ServiceMetaInfoAdapter.java
index 099231d..df8e38b 100644
--- a/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/als/mx/ServiceMetaInfoAdapter.java
+++ b/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/als/mx/ServiceMetaInfoAdapter.java
@@ -83,7 +83,7 @@ public class ServiceMetaInfoAdapter extends ServiceMetaInfo {
      * @param node the flat buffer node where to extract the metadata
      * @return the metadata {@link Struct}
      */
-    protected Struct extractStructFromNodeFlatBuffer(final FlatNode node) {
+    public static Struct extractStructFromNodeFlatBuffer(final FlatNode node) {
         final Struct.Builder builder = Struct.newBuilder();
 
         builder.putFields("NAME", Value.newBuilder().setStringValue(nullToEmpty(node.name())).build());