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 2021/07/03 05:58:46 UTC

[skywalking] branch master updated: Fix InfluxDB storage-plugin Metrics#multiGet issue (#7238)

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

wusheng pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/skywalking.git


The following commit(s) were added to refs/heads/master by this push:
     new 022bf38  Fix InfluxDB storage-plugin Metrics#multiGet issue (#7238)
022bf38 is described below

commit 022bf38116dd635df664cfc347ab678af37a95d6
Author: Daming <zt...@foxmail.com>
AuthorDate: Sat Jul 3 13:58:27 2021 +0800

    Fix InfluxDB storage-plugin Metrics#multiGet issue (#7238)
---
 CHANGES.md                                         |  1 +
 .../storage/plugin/influxdb/base/MetricsDAO.java   | 45 +++++++++++++---------
 2 files changed, 28 insertions(+), 18 deletions(-)

diff --git a/CHANGES.md b/CHANGES.md
index 9f674d5..7ce77b5 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -69,6 +69,7 @@ Release Notes.
 * Re-implement storage session mechanism, cached metrics are removed only according to their last access timestamp,
   rather than first time. This makes sure hot data never gets removed unexpectedly.
 * Support session expired threshold configurable. 
+* Fix InfluxDB storage-plugin Metrics#multiGet issue.
 
 #### UI
 
diff --git a/oap-server/server-storage-plugin/storage-influxdb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/influxdb/base/MetricsDAO.java b/oap-server/server-storage-plugin/storage-influxdb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/influxdb/base/MetricsDAO.java
index 3651745..bb8bfb0 100644
--- a/oap-server/server-storage-plugin/storage-influxdb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/influxdb/base/MetricsDAO.java
+++ b/oap-server/server-storage-plugin/storage-influxdb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/influxdb/base/MetricsDAO.java
@@ -21,9 +21,11 @@ package org.apache.skywalking.oap.server.storage.plugin.influxdb.base;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import java.io.IOException;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 import java.util.concurrent.TimeUnit;
 import java.util.function.Function;
 import java.util.stream.Collectors;
@@ -39,6 +41,7 @@ import org.apache.skywalking.oap.server.core.storage.model.Model;
 import org.apache.skywalking.oap.server.core.storage.type.StorageDataComplexObject;
 import org.apache.skywalking.oap.server.library.client.request.InsertRequest;
 import org.apache.skywalking.oap.server.library.client.request.UpdateRequest;
+import org.apache.skywalking.oap.server.library.util.CollectionUtils;
 import org.apache.skywalking.oap.server.storage.plugin.influxdb.InfluxClient;
 import org.apache.skywalking.oap.server.storage.plugin.influxdb.InfluxConstants.TagName;
 import org.apache.skywalking.oap.server.storage.plugin.influxdb.TableMetaInfo;
@@ -103,32 +106,38 @@ public class MetricsDAO implements IMetricsDAO {
         }
 
         final Query query = new Query(queryStr);
-        QueryResult.Series series = client.queryForSingleSeries(query);
+        final List<QueryResult.Result> results = client.query(query);
         if (log.isDebugEnabled()) {
-            log.debug("SQL: {} result: {}", query.getCommand(), series);
+            log.debug("SQL: {} result: {}", query.getCommand(), results);
         }
 
-        if (series == null) {
+        if (CollectionUtils.isEmpty(results)) {
             return Collections.emptyList();
         }
 
         final List<Metrics> newMetrics = Lists.newArrayList();
-        final List<String> columns = series.getColumns();
         final Map<String, String> storageAndColumnMap = metaInfo.getStorageAndColumnMap();
-
-        series.getValues().forEach(values -> {
-            Map<String, Object> data = Maps.newHashMap();
-
-            for (int i = 1; i < columns.size(); i++) {
-                Object value = values.get(i);
-                if (value instanceof StorageDataComplexObject) {
-                    value = ((StorageDataComplexObject) value).toStorageData();
-                }
-
-                data.put(storageAndColumnMap.get(columns.get(i)), value);
-            }
-            newMetrics.add(storageBuilder.storage2Entity(data));
-        });
+        results.stream()
+               .map(QueryResult.Result::getSeries)
+               .filter(Objects::nonNull)
+               .flatMap(Collection::stream)
+               .filter(Objects::nonNull)
+               .forEach(series -> {
+                   final List<String> columns = series.getColumns();
+                   series.getValues().forEach(values -> {
+                       Map<String, Object> data = Maps.newHashMap();
+
+                       for (int i = 1; i < columns.size(); i++) {
+                           Object value = values.get(i);
+                           if (value instanceof StorageDataComplexObject) {
+                               value = ((StorageDataComplexObject) value).toStorageData();
+                           }
+
+                           data.put(storageAndColumnMap.get(columns.get(i)), value);
+                       }
+                       newMetrics.add(storageBuilder.storage2Entity(data));
+                   });
+               });
 
         return newMetrics;
     }