This is an automated email from the ASF dual-hosted git repository. wusheng pushed a commit to branch support-default-value in repository https://gitbox.apache.org/repos/asf/skywalking.git
commit 448355ba8f805f7440bd1778e4da2b174bdfdd39 Author: Wu Sheng <[email protected]> AuthorDate: Sat Apr 25 15:47:03 2020 +0800 Support default value in labeled-value and heatmap query. --- .../oap/server/core/analysis/metrics/DataTable.java | 4 ++++ .../server/core/analysis/metrics/HistogramMetrics.java | 2 +- .../skywalking/oap/server/core/query/type/HeatMap.java | 16 ++++++++++------ .../plugin/elasticsearch/query/MetricsQueryEsDAO.java | 13 +++++++++---- .../storage/plugin/influxdb/query/MetricsQuery.java | 14 ++++++++++---- .../storage/plugin/jdbc/h2/dao/H2MetricsQueryDAO.java | 16 ++++++++++++---- 6 files changed, 46 insertions(+), 19 deletions(-) diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/DataTable.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/DataTable.java index 8216f69..92c7eec 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/DataTable.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/DataTable.java @@ -71,6 +71,10 @@ public class DataTable implements StorageDataComplexObject<DataTable> { return !data.isEmpty(); } + public boolean hasKey(String key) { + return data.containsKey(key); + } + public int size() { return data.size(); } diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/HistogramMetrics.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/HistogramMetrics.java index 014ccaf..d6957bf 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/HistogramMetrics.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/HistogramMetrics.java @@ -41,7 +41,7 @@ public abstract class HistogramMetrics extends Metrics { @Getter @Setter - @Column(columnName = DATASET, dataType = Column.ValueDataType.HISTOGRAM, storageOnly = true) + @Column(columnName = DATASET, dataType = Column.ValueDataType.HISTOGRAM, storageOnly = true, defaultValue = 0) private DataTable dataset = new DataTable(30); /** diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/type/HeatMap.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/type/HeatMap.java index 2ebff0a..a7331cd 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/type/HeatMap.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/type/HeatMap.java @@ -45,7 +45,7 @@ public class HeatMap { * @param id of the row * @param rawdata literal string, represent a {@link DataTable} */ - public void buildColumn(String id, String rawdata) { + public void buildColumn(String id, String rawdata, int defaultValue) { DataTable dataset = new DataTable(rawdata); final List<String> sortedKeys = dataset.sortedKeys( @@ -70,12 +70,16 @@ public class HeatMap { HeatMap.HeatMapColumn column = new HeatMap.HeatMapColumn(); column.setId(id); sortedKeys.forEach(key -> { - column.addValue(dataset.get(key)); + if (dataset.hasKey(key)) { + column.addValue(dataset.get(key)); + } else { + column.addValue((long) defaultValue); + } }); values.add(column); } - public void fixMissingColumns(List<String> ids) { + public void fixMissingColumns(List<String> ids, int defaultValue) { for (int i = 0; i < ids.size(); i++) { final String expectedId = ids.get(i); boolean found = false; @@ -85,17 +89,17 @@ public class HeatMap { } } if (!found) { - final HeatMapColumn emptyColumn = buildMissingColumn(expectedId); + final HeatMapColumn emptyColumn = buildMissingColumn(expectedId, defaultValue); values.add(i, emptyColumn); } } } - private HeatMapColumn buildMissingColumn(String id) { + private HeatMapColumn buildMissingColumn(String id, int defaultValue) { HeatMapColumn column = new HeatMapColumn(); column.setId(id); buckets.forEach(bucket -> { - column.addValue(0L); + column.addValue((long) defaultValue); }); return column; } diff --git a/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/query/MetricsQueryEsDAO.java b/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/query/MetricsQueryEsDAO.java index 278e19d..c49ca9a 100644 --- a/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/query/MetricsQueryEsDAO.java +++ b/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/query/MetricsQueryEsDAO.java @@ -148,14 +148,18 @@ public class MetricsQueryEsDAO extends EsDAO implements IMetricsQueryDAO { labeledValues.put(label, labelValue); }); + final int defaultValue = ValueColumnMetadata.INSTANCE.getDefaultValue(condition.getName()); for (String id : ids) { if (idMap.containsKey(id)) { Map<String, Object> source = idMap.get(id); DataTable multipleValues = new DataTable((String) source.getOrDefault(valueColumnName, "")); labels.forEach(label -> { - final Long data = multipleValues.get(label); final IntValues values = labeledValues.get(label).getValues(); + Long data = multipleValues.get(label); + if (data == null) { + data = (long) defaultValue; + } KVInt kv = new KVInt(); kv.setId(id); kv.setValue(data); @@ -168,7 +172,7 @@ public class MetricsQueryEsDAO extends EsDAO implements IMetricsQueryDAO { return Util.sortValues( new ArrayList<>(labeledValues.values()), ids, - ValueColumnMetadata.INSTANCE.getDefaultValue(condition.getName()) + defaultValue ); } @@ -187,15 +191,16 @@ public class MetricsQueryEsDAO extends EsDAO implements IMetricsQueryDAO { HeatMap heatMap = new HeatMap(); + final int defaultValue = ValueColumnMetadata.INSTANCE.getDefaultValue(condition.getName()); for (String id : ids) { Map<String, Object> source = idMap.get(id); if (source != null) { String value = (String) source.get(HistogramMetrics.DATASET); - heatMap.buildColumn(id, value); + heatMap.buildColumn(id, value, defaultValue); } } - heatMap.fixMissingColumns(ids); + heatMap.fixMissingColumns(ids, defaultValue); return heatMap; } diff --git a/oap-server/server-storage-plugin/storage-influxdb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/influxdb/query/MetricsQuery.java b/oap-server/server-storage-plugin/storage-influxdb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/influxdb/query/MetricsQuery.java index 60cde6a..b45749d 100644 --- a/oap-server/server-storage-plugin/storage-influxdb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/influxdb/query/MetricsQuery.java +++ b/oap-server/server-storage-plugin/storage-influxdb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/influxdb/query/MetricsQuery.java @@ -183,6 +183,7 @@ public class MetricsQuery implements IMetricsQueryDAO { labeledValues.put(label, labelValue); }); + final int defaultValue = ValueColumnMetadata.INSTANCE.getDefaultValue(condition.getName()); if (!CollectionUtils.isEmpty(series)) { series.get(0).getValues().forEach(values -> { final String id = (String) values.get(1); @@ -190,7 +191,10 @@ public class MetricsQuery implements IMetricsQueryDAO { multipleValues.toObject((String) values.get(2)); labels.forEach(label -> { - final Long data = multipleValues.get(label); + Long data = multipleValues.get(label); + if (data == null) { + data = (long) defaultValue; + } final IntValues intValues = labeledValues.get(label).getValues(); KVInt kv = new KVInt(); kv.setId(id); @@ -203,7 +207,7 @@ public class MetricsQuery implements IMetricsQueryDAO { return Util.sortValues( new ArrayList<>(labeledValues.values()), ids, - ValueColumnMetadata.INSTANCE.getDefaultValue(condition.getName()) + defaultValue ); } @@ -229,14 +233,16 @@ public class MetricsQuery implements IMetricsQueryDAO { log.debug("SQL: {} result set: {}", query.getCommand(), series); } + final int defaultValue = ValueColumnMetadata.INSTANCE.getDefaultValue(condition.getName()); + HeatMap heatMap = new HeatMap(); if (series != null) { for (List<Object> values : series.getValues()) { - heatMap.buildColumn(values.get(1).toString(), values.get(2).toString()); + heatMap.buildColumn(values.get(1).toString(), values.get(2).toString(), defaultValue); } } - heatMap.fixMissingColumns(ids); + heatMap.fixMissingColumns(ids, defaultValue); return heatMap; } diff --git a/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2MetricsQueryDAO.java b/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2MetricsQueryDAO.java index db5cbfd..84d0ca0 100644 --- a/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2MetricsQueryDAO.java +++ b/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2MetricsQueryDAO.java @@ -170,6 +170,8 @@ public class H2MetricsQueryDAO extends H2SQLExecutor implements IMetricsQueryDAO labeledValues.put(label, labelValue); }); + final int defaultValue = ValueColumnMetadata.INSTANCE.getDefaultValue(condition.getName()); + try (Connection connection = h2Client.getConnection()) { try (ResultSet resultSet = h2Client.executeQuery( connection, sql.toString(), parameters.toArray(new Object[0]))) { @@ -180,7 +182,10 @@ public class H2MetricsQueryDAO extends H2SQLExecutor implements IMetricsQueryDAO multipleValues.toObject(resultSet.getString(valueColumnName)); labels.forEach(label -> { - final Long data = multipleValues.get(label); + Long data = multipleValues.get(label); + if (data == null) { + data = (long) defaultValue; + } final IntValues values = labeledValues.get(label).getValues(); KVInt kv = new KVInt(); kv.setId(id); @@ -196,7 +201,7 @@ public class H2MetricsQueryDAO extends H2SQLExecutor implements IMetricsQueryDAO return Util.sortValues( new ArrayList<>(labeledValues.values()), ids, - ValueColumnMetadata.INSTANCE.getDefaultValue(condition.getName()) + defaultValue ); } @@ -223,17 +228,20 @@ public class H2MetricsQueryDAO extends H2SQLExecutor implements IMetricsQueryDAO } sql.append(")"); + final int defaultValue = ValueColumnMetadata.INSTANCE.getDefaultValue(condition.getName()); + try (Connection connection = h2Client.getConnection()) { HeatMap heatMap = new HeatMap(); try (ResultSet resultSet = h2Client.executeQuery( connection, sql.toString(), parameters.toArray(new Object[0]))) { while (resultSet.next()) { - heatMap.buildColumn(resultSet.getString("id"), resultSet.getString("dataset")); + heatMap.buildColumn( + resultSet.getString("id"), resultSet.getString("dataset"), defaultValue); } } - heatMap.fixMissingColumns(ids); + heatMap.fixMissingColumns(ids, defaultValue); return heatMap; } catch (SQLException e) {
