未验证 提交 418bdff2 编写于 作者: wu-sheng's avatar wu-sheng 提交者: GitHub

New metrics query protocol v2 (#4679)

1. Support the new query protocol, and the v1 query protocol is still supported 
2. All `numOfxxx`/`GlobalBrief` is only a mock now, no real number.
3. typeOfMetrics service is a mock only too, follow up PR will implement this.
上级 8e6a527f
......@@ -140,8 +140,8 @@ public class AnalysisResult {
case "long":
serializeFields.addLongField(column.getFieldName());
break;
case "IntKeyLongValueHashMap":
serializeFields.addIntKeyLongValueHashMapField(column.getFieldName());
case "DataTable":
serializeFields.addDataTableField(column.getFieldName());
break;
default:
throw new IllegalStateException("Unexpected field type [" + type + "] of persistence column [" + column
......
......@@ -26,7 +26,7 @@ public class PersistenceColumns {
private List<PersistenceField> longFields = new LinkedList<>();
private List<PersistenceField> doubleFields = new LinkedList<>();
private List<PersistenceField> intFields = new LinkedList<>();
private List<PersistenceField> intKeyLongValueHashMap = new LinkedList<>();
private List<PersistenceField> dataTableFields = new LinkedList<>();
public void addStringField(String fieldName) {
stringFields.add(new PersistenceField(fieldName));
......@@ -44,8 +44,8 @@ public class PersistenceColumns {
intFields.add(new PersistenceField(fieldName));
}
public void addIntKeyLongValueHashMapField(String fieldName) {
intKeyLongValueHashMap.add(new PersistenceField(fieldName));
public void addDataTableField(String fieldName) {
dataTableFields.add(new PersistenceField(fieldName));
}
public List<PersistenceField> getStringFields() {
......@@ -64,7 +64,7 @@ public class PersistenceColumns {
return intFields;
}
public List<PersistenceField> getIntKeyLongValueHashMapFields() {
return intKeyLongValueHashMap;
public List<PersistenceField> getDataTableFields() {
return dataTableFields;
}
}
......@@ -15,12 +15,8 @@ public void deserialize(org.apache.skywalking.oap.server.core.remote.grpc.proto.
${field.setter}(remoteData.getDataIntegers(${field?index}));
</#list>
java.util.Iterator iterator;
<#list serializeFields.intKeyLongValueHashMapFields as field>
iterator = remoteData.getDataLists(${field?index}).getValueList().iterator();
while (iterator.hasNext()) {
org.apache.skywalking.oap.server.core.remote.grpc.proto.IntKeyLongValuePair element = (org.apache.skywalking.oap.server.core.remote.grpc.proto.IntKeyLongValuePair)(iterator.next());
super.${field.getter}().put(new Integer(element.getKey()), new org.apache.skywalking.oap.server.core.analysis.metrics.IntKeyLongValue(element.getKey(), element.getValue()));
}
<#list serializeFields.dataTableFields as field>
${field.setter}(new org.apache.skywalking.oap.server.core.analysis.metrics.DataTable(remoteData.getDataTableStrings(${field?index})));
</#list>
}
\ No newline at end of file
......@@ -15,15 +15,9 @@ org.apache.skywalking.oap.server.core.remote.grpc.proto.RemoteData.Builder remot
<#list serializeFields.intFields as field>
remoteBuilder.addDataIntegers(${field.getter}());
</#list>
java.util.Iterator iterator;
org.apache.skywalking.oap.server.core.remote.grpc.proto.DataIntLongPairList.Builder pairListBuilder;
<#list serializeFields.intKeyLongValueHashMapFields as field>
iterator = super.${field.getter}().values().iterator();
pairListBuilder = org.apache.skywalking.oap.server.core.remote.grpc.proto.DataIntLongPairList.newBuilder();
while (iterator.hasNext()) {
pairListBuilder.addValue(((org.apache.skywalking.oap.server.core.analysis.metrics.IntKeyLongValue)(iterator.next())).serialize());
}
remoteBuilder.addDataLists(pairListBuilder);
<#list serializeFields.dataTableFields as field>
remoteBuilder.addDataTableStrings(${field.getter}().toStorageData());
</#list>
return remoteBuilder;
......
......@@ -23,7 +23,7 @@ import java.util.List;
import org.apache.skywalking.oap.server.core.alarm.AlarmMessage;
import org.apache.skywalking.oap.server.core.alarm.provider.AlarmRulesWatcher;
import org.apache.skywalking.oap.server.core.alarm.provider.Rules;
import org.apache.skywalking.oap.server.core.query.entity.Scope;
import org.apache.skywalking.oap.server.core.query.enumeration.Scope;
import org.junit.Before;
import org.junit.Test;
......
......@@ -18,7 +18,7 @@
// All scope metrics
all_percentile = from(All.latency).percentile(10); // Multiple values including p50, p75, p90, p95, p99
all_heatmap = from(All.latency).thermodynamic(100, 20);
all_heatmap = from(All.latency).histogram(100, 20);
// Service scope metrics
service_resp_time = from(Service.latency).longAvg();
......
......@@ -32,7 +32,7 @@ import org.apache.skywalking.oap.server.core.query.AggregationQueryService;
import org.apache.skywalking.oap.server.core.query.AlarmQueryService;
import org.apache.skywalking.oap.server.core.query.LogQueryService;
import org.apache.skywalking.oap.server.core.query.MetadataQueryService;
import org.apache.skywalking.oap.server.core.query.MetricQueryService;
import org.apache.skywalking.oap.server.core.query.MetricsQueryService;
import org.apache.skywalking.oap.server.core.query.ProfileTaskQueryService;
import org.apache.skywalking.oap.server.core.query.TopNRecordsQueryService;
import org.apache.skywalking.oap.server.core.query.TopologyQueryService;
......@@ -90,7 +90,7 @@ public class CoreModule extends ModuleDefine {
private void addQueryService(List<Class> classes) {
classes.add(TopologyQueryService.class);
classes.add(MetricQueryService.class);
classes.add(MetricsQueryService.class);
classes.add(TraceQueryService.class);
classes.add(LogQueryService.class);
classes.add(MetadataQueryService.class);
......
......@@ -48,7 +48,7 @@ import org.apache.skywalking.oap.server.core.query.AggregationQueryService;
import org.apache.skywalking.oap.server.core.query.AlarmQueryService;
import org.apache.skywalking.oap.server.core.query.LogQueryService;
import org.apache.skywalking.oap.server.core.query.MetadataQueryService;
import org.apache.skywalking.oap.server.core.query.MetricQueryService;
import org.apache.skywalking.oap.server.core.query.MetricsQueryService;
import org.apache.skywalking.oap.server.core.query.ProfileTaskQueryService;
import org.apache.skywalking.oap.server.core.query.TopNRecordsQueryService;
import org.apache.skywalking.oap.server.core.query.TopologyQueryService;
......@@ -213,7 +213,7 @@ public class CoreModuleProvider extends ModuleProvider {
NetworkAddressAliasCache.class, new NetworkAddressAliasCache(moduleConfig));
this.registerServiceImplementation(TopologyQueryService.class, new TopologyQueryService(getManager()));
this.registerServiceImplementation(MetricQueryService.class, new MetricQueryService(getManager()));
this.registerServiceImplementation(MetricsQueryService.class, new MetricsQueryService(getManager()));
this.registerServiceImplementation(TraceQueryService.class, new TraceQueryService(getManager()));
this.registerServiceImplementation(LogQueryService.class, new LogQueryService(getManager()));
this.registerServiceImplementation(MetadataQueryService.class, new MetadataQueryService(getManager()));
......
......@@ -39,8 +39,11 @@ public class IDManager {
* @return encoded service id
*/
public static String buildId(String name, NodeType type) {
return encode(name) + Const.SERVICE_ID_CONNECTOR + BooleanUtils.booleanToValue(
type.equals(NodeType.Normal));
return buildId(name, type.equals(NodeType.Normal));
}
public static String buildId(String name, boolean isNormal) {
return encode(name) + Const.SERVICE_ID_CONNECTOR + BooleanUtils.booleanToValue(isNormal);
}
/**
......@@ -157,11 +160,11 @@ public class IDManager {
@EqualsAndHashCode
public static class ServiceInstanceRelationDefine {
/**
* Built by {@link ServiceID#buildId(String, NodeType)}
* Built by {@link ServiceInstanceID#buildId(String, String)}
*/
private final String sourceId;
/**
* Built by {@link ServiceID#buildId(String, NodeType)}
* Built by {@link ServiceInstanceID#buildId(String, String)}
*/
private final String destId;
}
......
......@@ -94,14 +94,6 @@ public class TimeBucket {
return timeBucket < 99999999L && timeBucket > 10000000L;
}
/**
* The format of timeBucket in month Unit is "yyyyMM", so which means the TimeBucket must be between 100000 and
* 999999.
*/
public static boolean isMonthBucket(long timeBucket) {
return timeBucket < 999999L && timeBucket > 100000L;
}
/**
* Convert TimeBucket to Timestamp in millisecond.
*
......
......@@ -24,7 +24,7 @@ import lombok.Getter;
import lombok.Setter;
import org.apache.skywalking.oap.server.core.UnexpectedException;
import org.apache.skywalking.oap.server.core.analysis.record.Record;
import org.apache.skywalking.oap.server.core.query.entity.ContentType;
import org.apache.skywalking.oap.server.core.query.type.ContentType;
import org.apache.skywalking.oap.server.core.storage.StorageBuilder;
import org.apache.skywalking.oap.server.core.storage.annotation.Column;
......
......@@ -18,60 +18,102 @@
package org.apache.skywalking.oap.server.core.analysis.metrics;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import org.apache.skywalking.oap.server.core.Const;
import org.apache.skywalking.oap.server.core.storage.type.StorageDataComplexObject;
public class IntKeyLongValueHashMap extends HashMap<Integer, IntKeyLongValue> implements StorageDataComplexObject {
/**
* DataTable includes a hashmap to store string key and long value. It enhanced the serialization capability.
*/
public class DataTable implements StorageDataComplexObject<DataTable> {
private HashMap<String, Long> data;
public IntKeyLongValueHashMap() {
super();
public DataTable() {
data = new HashMap<>();
}
public IntKeyLongValueHashMap(int initialCapacity) {
super(initialCapacity);
public DataTable(int initialCapacity) {
data = new HashMap<>(initialCapacity);
}
public IntKeyLongValueHashMap(String data) {
super();
public DataTable(String data) {
this();
toObject(data);
}
public Long get(String key) {
return data.get(key);
}
public void put(String key, Long value) {
data.put(key, value);
}
public long sumOfValues() {
return data.values().stream().mapToLong(element -> element).sum();
}
public List<String> sortedKeys(Comparator<String> keyComparator) {
return data.keySet().stream().sorted(keyComparator).collect(Collectors.toList());
}
public List<Long> sortedValues(Comparator<String> keyComparator) {
final List<String> collect = data.keySet().stream().sorted(keyComparator).collect(Collectors.toList());
List<Long> values = new ArrayList<>(collect.size());
collect.forEach(key -> values.add(data.get(key)));
return values;
}
public boolean hasData() {
return !data.isEmpty();
}
public int size() {
return data.size();
}
@Override
public String toStorageData() {
StringBuilder data = new StringBuilder();
StringBuilder builder = new StringBuilder();
List<Map.Entry<Integer, IntKeyLongValue>> list = new ArrayList<>(this.entrySet());
for (int i = 0; i < list.size(); i++) {
if (i == 0) {
data.append(list.get(i).getValue().toStorageData());
} else {
data.append(Const.ARRAY_SPLIT).append(list.get(i).getValue().toStorageData());
this.data.forEach((key, value) -> {
if (builder.length() != 0) {
// For the first element.
builder.append(Const.ARRAY_SPLIT);
}
}
return data.toString();
builder.append(key).append(Const.KEY_VALUE_SPLIT).append(value);
});
return builder.toString();
}
@Override
public void toObject(String data) {
String[] keyValues = data.split(Const.ARRAY_PARSER_SPLIT);
for (String keyValue : keyValues) {
IntKeyLongValue value = new IntKeyLongValue();
value.toObject(keyValue);
this.put(value.getKey(), value);
final String[] keyValuePair = keyValue.split(Const.KEY_VALUE_SPLIT);
if (keyValuePair.length == 2) {
this.data.put(keyValuePair[0], Long.parseLong(keyValuePair[1]));
}
}
}
@Override
public void copyFrom(Object source) {
IntKeyLongValueHashMap intKeyLongValueHashMap = (IntKeyLongValueHashMap) source;
intKeyLongValueHashMap.values().forEach(value -> {
IntKeyLongValue newValue = new IntKeyLongValue();
newValue.copyFrom(value);
this.put(newValue.getKey(), newValue);
public void copyFrom(final DataTable source) {
this.append(source);
}
public void append(DataTable dataTable) {
dataTable.data.forEach((key, value) -> {
Long current = this.data.get(key);
if (current == null) {
current = value;
} else {
current += value;
}
this.data.put(key, current);
});
}
}
......@@ -27,73 +27,67 @@ import org.apache.skywalking.oap.server.core.analysis.metrics.annotation.SourceF
import org.apache.skywalking.oap.server.core.storage.annotation.Column;
/**
* Thermodynamic metrics represents the calculator for heat map.
* Histogram metrics represents the calculator for heat map.
* <p>
* It groups the given collection of values by the given step and number of steps.
* <p>
* A heat map (or heatmap) is a graphical representation of data where the individual values contained in a matrix are
* represented as colors.
*/
@MetricsFunction(functionName = "thermodynamic")
public abstract class ThermodynamicMetrics extends GroupMetrics {
@MetricsFunction(functionName = "histogram")
public abstract class HistogramMetrics extends Metrics {
public static final String DETAIL_GROUP = "detail_group";
public static final String STEP = "step";
public static final String NUM_OF_STEPS = "num_of_steps";
public static final String DATASET = "dataset";
@Getter
@Setter
@Column(columnName = STEP, storageOnly = true)
private int step = 0;
@Getter
@Setter
@Column(columnName = NUM_OF_STEPS, storageOnly = true)
private int numOfSteps = 0;
/**
* The special case when the column is isValue = true, but storageOnly = true, because it is {@link
* IntKeyLongValueHashMap} type, this column can't be query by the aggregation way.
* The special case when the column is isValue = true, but storageOnly = true, because it is {@link DataTable} type,
* this column can't be query by the aggregation way.
*/
@Getter
@Setter
@Column(columnName = DETAIL_GROUP, isValue = true, storageOnly = true)
private IntKeyLongValueHashMap detailGroup = new IntKeyLongValueHashMap(30);
@Column(columnName = DATASET, isValue = true, storageOnly = true)
private DataTable dataset = new DataTable(30);
/**
* Data will be grouped in
* <p>
* [0, step), [step, step * 2), ..., [step * (maxNumOfSteps - 1), step * maxNumOfSteps), [step * maxNumOfSteps,
* MAX)
* <pre>
* key = 0, represents [0, 100), value = count of requests in the latency range.
* key = 100, represents [100, 200), value = count of requests in the latency range.
* ...
* key = step * maxNumOfSteps, represents [step * maxNumOfSteps, MAX)
* </pre>
*
* @param step the size of each step. A positive integer.
* @param maxNumOfSteps Steps are used to group incoming value.
*/
@Entrance
public final void combine(@SourceFrom int value, @Arg int step, @Arg int maxNumOfSteps) {
if (this.step == 0) {
this.step = step;
}
if (this.numOfSteps == 0) {
this.numOfSteps = maxNumOfSteps;
if (!dataset.hasData()) {
for (int i = 0; i <= maxNumOfSteps; i++) {
String key = String.valueOf(i * step);
dataset.put(key, 0L);
}
}
int index = value / step;
if (index > maxNumOfSteps) {
index = numOfSteps;
index = maxNumOfSteps;
}
String idx = String.valueOf(index * step);
IntKeyLongValue element = detailGroup.get(index);
Long element = dataset.get(idx);
if (element == null) {
element = new IntKeyLongValue(index, 1);
detailGroup.put(element.getKey(), element);
element = 1L;
} else {
element.addValue(1);
element++;
}
dataset.put(idx, element);
}
@Override
public void combine(Metrics metrics) {
ThermodynamicMetrics thermodynamicMetrics = (ThermodynamicMetrics) metrics;
combine(thermodynamicMetrics.getDetailGroup(), this.detailGroup);
HistogramMetrics histogramMetrics = (HistogramMetrics) metrics;
this.dataset.append(histogramMetrics.dataset);
}
/**
......
/*
* 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.core.analysis.metrics;
import java.util.Objects;
import lombok.Getter;
import lombok.Setter;
import org.apache.skywalking.oap.server.core.Const;
import org.apache.skywalking.oap.server.core.remote.grpc.proto.IntKeyLongValuePair;
import org.apache.skywalking.oap.server.core.storage.type.StorageDataComplexObject;
/**
* IntKeyLongValue is a common bean, with key in Int and value in Long
*/
@Setter
@Getter
public class IntKeyLongValue implements Comparable<IntKeyLongValue>, StorageDataComplexObject {
private int key;
private long value;
public IntKeyLongValue() {
}
public IntKeyLongValue(int key, long value) {
this.key = key;
this.value = value;
}
public void addValue(long value) {
this.value += value;
}
@Override
public int compareTo(IntKeyLongValue o) {
return key - o.key;
}
@Override
public boolean equals(Object o) {
if (this == o)
return true;
if (o == null || getClass() != o.getClass())
return false;
IntKeyLongValue value = (IntKeyLongValue) o;
return key == value.key;
}
@Override
public int hashCode() {
return Objects.hash(key);
}
public IntKeyLongValuePair serialize() {
return IntKeyLongValuePair.newBuilder().setKey(key).setValue(value).build();
}
public void deserialize(IntKeyLongValuePair pair) {
this.key = pair.getKey();
this.value = pair.getValue();
}
@Override
public String toStorageData() {
return key + Const.KEY_VALUE_SPLIT + value;
}
@Override
public void toObject(String data) {
String[] keyValue = data.split(Const.KEY_VALUE_SPLIT);
this.key = Integer.parseInt(keyValue[0]);
this.value = Long.parseLong(keyValue[1]);
}
@Override
public void copyFrom(Object source) {
IntKeyLongValue value = (IntKeyLongValue) source;
this.key = value.key;
this.value = value.value;
}
}
......@@ -16,8 +16,12 @@
*
*/
package org.apache.skywalking.oap.server.core.query.entity;
package org.apache.skywalking.oap.server.core.analysis.metrics;
public enum Language {
UNKNOWN, JAVA, DOTNET, NODEJS, PYTHON, RUBY, GO, LUA, PHP
/**
* MetricsRegister has the metadata of all metrics type
*
* @since 8.0.0
*/
public class MetricsRegister {
}
......@@ -19,6 +19,8 @@
package org.apache.skywalking.oap.server.core.analysis.metrics;
import java.util.Comparator;
import java.util.List;
import java.util.stream.IntStream;
import lombok.Getter;
import lombok.Setter;
import org.apache.skywalking.oap.server.core.analysis.metrics.annotation.Arg;
......@@ -32,7 +34,7 @@ import org.apache.skywalking.oap.server.core.storage.annotation.Column;
* multiple P50/75/90/95/99 values once for all.
*/
@MetricsFunction(functionName = "percentile")
public abstract class PercentileMetrics extends GroupMetrics implements MultiIntValuesHolder {
public abstract class PercentileMetrics extends Metrics implements MultiIntValuesHolder {
protected static final String DATASET = "dataset";
protected static final String VALUE = "value";
protected static final String PRECISION = "precision";
......@@ -46,13 +48,13 @@ public abstract class PercentileMetrics extends GroupMetrics implements MultiInt
};
/**
* The special case when the column is isValue = true, but storageOnly = true, because it is {@link
* IntKeyLongValueHashMap} type, this column can't be query by the aggregation way.
* The special case when the column is isValue = true, but storageOnly = true, because it is {@link DataTable} type,
* this column can't be query by the aggregation way.
*/
@Getter
@Setter
@Column(columnName = VALUE, isValue = true, storageOnly = true)
private IntKeyLongValueHashMap percentileValues;
private DataTable percentileValues;
@Getter
@Setter
@Column(columnName = PRECISION, storageOnly = true)
......@@ -60,13 +62,13 @@ public abstract class PercentileMetrics extends GroupMetrics implements MultiInt
@Getter
@Setter
@Column(columnName = DATASET, storageOnly = true)
private IntKeyLongValueHashMap dataset;
private DataTable dataset;
private boolean isCalculated;
public PercentileMetrics() {
percentileValues = new IntKeyLongValueHashMap(RANKS.length);
dataset = new IntKeyLongValueHashMap(30);
percentileValues = new DataTable(RANKS.length);
dataset = new DataTable(30);
}
@Entrance
......@@ -74,14 +76,14 @@ public abstract class PercentileMetrics extends GroupMetrics implements MultiInt
this.isCalculated = false;
this.precision = precision;
int index = value / precision;
IntKeyLongValue element = dataset.get(index);
String index = String.valueOf(value / precision);
Long element = dataset.get(index);
if (element == null) {
element = new IntKeyLongValue(index, 1);
dataset.put(element.getKey(), element);
element = 1L;
} else {
element.addValue(1);
element++;
}
dataset.put(index, element);
}
@Override
......@@ -89,34 +91,33 @@ public abstract class PercentileMetrics extends GroupMetrics implements MultiInt
this.isCalculated = false;
PercentileMetrics percentileMetrics = (PercentileMetrics) metrics;
combine(percentileMetrics.getDataset(), this.dataset);
this.dataset.append(percentileMetrics.dataset);
}
@Override
public final void calculate() {
if (!isCalculated) {
int total = dataset.values().stream().mapToInt(element -> (int) element.getValue()).sum();
long total = dataset.sumOfValues();
int index = 0;
int[] roofs = new int[RANKS.length];
for (int i = 0; i < RANKS.length; i++) {
roofs[i] = Math.round(total * RANKS[i] * 1.0f / 100);
}
int count = 0;
IntKeyLongValue[] sortedData = dataset.values()
.stream()
.sorted(Comparator.comparingInt(IntKeyLongValue::getKey))
.toArray(IntKeyLongValue[]::new);
for (IntKeyLongValue element : sortedData) {
count += element.getValue();
for (int i = index; i < roofs.length; i++) {
int roof = roofs[i];
final List<String> sortedKeys = dataset.sortedKeys(Comparator.comparingInt(Integer::parseInt));
int loopIndex = 0;
for (String key : sortedKeys) {
final Long value = dataset.get(key);
count += value;
for (int rankIdx = loopIndex; rankIdx < roofs.length; rankIdx++) {
int roof = roofs[rankIdx];
if (count >= roof) {
percentileValues.put(index, new IntKeyLongValue(index, element.getKey() * precision));
index++;
percentileValues.put(String.valueOf(rankIdx), Long.parseLong(key) * precision);
loopIndex++;
} else {
break;
}
......@@ -126,10 +127,9 @@ public abstract class PercentileMetrics extends GroupMetrics implements MultiInt
}
public int[] getValues() {
int[] values = new int[percentileValues.size()];
for (int i = 0; i < values.length; i++) {
values[i] = (int) percentileValues.get(i).getValue();
}
return values;
return percentileValues.sortedValues(Comparator.comparingInt(Integer::parseInt))
.stream()
.flatMapToInt(l -> IntStream.of(l.intValue()))
.toArray();
}
}
......@@ -19,6 +19,7 @@
package org.apache.skywalking.oap.server.core.analysis.metrics;
import java.util.Comparator;
import java.util.List;
import lombok.Getter;
import lombok.Setter;
import org.apache.skywalking.oap.server.core.analysis.metrics.annotation.Arg;
......@@ -34,7 +35,7 @@ import org.apache.skywalking.oap.server.core.storage.annotation.Column;
* observations in a group of observations fall. For example, the 20th percentile is the value (or score) below which
* 20% of the observations may be found.
*/
public abstract class PxxMetrics extends GroupMetrics implements IntValueHolder {
public abstract class PxxMetrics extends Metrics implements IntValueHolder {
protected static final String DETAIL_GROUP = "detail_group";
protected static final String VALUE = "value";
......@@ -51,14 +52,14 @@ public abstract class PxxMetrics extends GroupMetrics implements IntValueHolder
@Getter
@Setter
@Column(columnName = DETAIL_GROUP, storageOnly = true)
private IntKeyLongValueHashMap detailGroup;
private DataTable detailGroup;
private final int percentileRank;
private boolean isCalculated;
public PxxMetrics(int percentileRank) {
this.percentileRank = percentileRank;
detailGroup = new IntKeyLongValueHashMap(30);
detailGroup = new DataTable(30);
}
@Entrance
......@@ -66,14 +67,14 @@ public abstract class PxxMetrics extends GroupMetrics implements IntValueHolder
this.isCalculated = false;
this.precision = precision;
int index = value / precision;
IntKeyLongValue element = detailGroup.get(index);
String index = String.valueOf(value / precision);
Long element = detailGroup.get(index);
if (element == null) {
element = new IntKeyLongValue(index, 1);
detailGroup.put(element.getKey(), element);
element = 1L;
} else {
element.addValue(1);
element++;
}
detailGroup.put(index, element);
}
@Override
......@@ -81,27 +82,24 @@ public abstract class PxxMetrics extends GroupMetrics implements IntValueHolder
this.isCalculated = false;
PxxMetrics pxxMetrics = (PxxMetrics) metrics;
combine(pxxMetrics.getDetailGroup(), this.detailGroup);
this.detailGroup.append(pxxMetrics.detailGroup);
}
@Override
public final void calculate() {
if (!isCalculated) {
int total = detailGroup.values().stream().mapToInt(element -> (int) element.getValue()).sum();
long total = detailGroup.sumOfValues();
int roof = Math.round(total * percentileRank * 1.0f / 100);
int count = 0;
IntKeyLongValue[] sortedData = detailGroup.values().stream().sorted(new Comparator<IntKeyLongValue>() {
@Override
public int compare(IntKeyLongValue o1, IntKeyLongValue o2) {
return o1.getKey() - o2.getKey();
}
}).toArray(IntKeyLongValue[]::new);
for (IntKeyLongValue element : sortedData) {
count += element.getValue();
long count = 0;
final List<String> sortedKeys = detailGroup.sortedKeys(Comparator.comparingInt(Integer::parseInt));
for (String index : sortedKeys) {
final Long value = detailGroup.get(index);
count += value;
if (count >= roof) {
value = element.getKey() * precision;
this.value = Integer.parseInt(index) * precision;
return;
}
}
......
......@@ -28,7 +28,7 @@ import org.apache.skywalking.apm.util.RunnableWithExceptionProtection;
import org.apache.skywalking.oap.server.core.CoreModule;
import org.apache.skywalking.oap.server.core.analysis.TimeBucket;
import org.apache.skywalking.oap.server.core.analysis.manual.networkalias.NetworkAddressAlias;
import org.apache.skywalking.oap.server.core.query.entity.ProfileTask;
import org.apache.skywalking.oap.server.core.query.type.ProfileTask;
import org.apache.skywalking.oap.server.core.storage.StorageModule;
import org.apache.skywalking.oap.server.core.storage.cache.INetworkAddressAliasDAO;
import org.apache.skywalking.oap.server.core.storage.profile.IProfileTaskQueryDAO;
......
......@@ -28,7 +28,7 @@ import java.util.Objects;
import java.util.concurrent.TimeUnit;
import org.apache.skywalking.oap.server.core.CoreModuleConfig;
import org.apache.skywalking.oap.server.core.analysis.TimeBucket;
import org.apache.skywalking.oap.server.core.query.entity.ProfileTask;
import org.apache.skywalking.oap.server.core.query.type.ProfileTask;
import org.apache.skywalking.oap.server.core.storage.StorageModule;
import org.apache.skywalking.oap.server.core.storage.profile.IProfileTaskQueryDAO;
import org.apache.skywalking.oap.server.library.module.ModuleManager;
......
......@@ -20,7 +20,7 @@ package org.apache.skywalking.oap.server.core.command;
import java.util.UUID;
import org.apache.skywalking.apm.network.trace.component.command.ProfileTaskCommand;
import org.apache.skywalking.oap.server.core.query.entity.ProfileTask;
import org.apache.skywalking.oap.server.core.query.type.ProfileTask;
import org.apache.skywalking.oap.server.library.module.ModuleManager;
import org.apache.skywalking.oap.server.library.module.Service;
......
......@@ -26,8 +26,8 @@ import org.apache.skywalking.apm.util.StringUtil;
import org.apache.skywalking.oap.server.core.analysis.DownSampling;
import org.apache.skywalking.oap.server.core.analysis.TimeBucket;
import org.apache.skywalking.oap.server.core.analysis.worker.NoneStreamingProcessor;
import org.apache.skywalking.oap.server.core.query.entity.ProfileTaskCreationResult;
import org.apache.skywalking.oap.server.core.query.entity.ProfileTask;
import org.apache.skywalking.oap.server.core.query.type.ProfileTaskCreationResult;
import org.apache.skywalking.oap.server.core.query.type.ProfileTask;
import org.apache.skywalking.oap.server.core.storage.StorageModule;
import org.apache.skywalking.oap.server.core.storage.profile.IProfileTaskQueryDAO;
import org.apache.skywalking.oap.server.library.module.ModuleManager;
......
......@@ -26,7 +26,7 @@ import java.util.function.BinaryOperator;
import java.util.function.Function;
import java.util.function.Supplier;
import java.util.stream.Collector;
import org.apache.skywalking.oap.server.core.query.entity.ProfileStackTree;
import org.apache.skywalking.oap.server.core.query.type.ProfileStackTree;
/**
* Work for {@link ProfileAnalyzer} to analyze.
......
......@@ -28,9 +28,9 @@ import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
import org.apache.skywalking.oap.server.core.profile.ProfileThreadSnapshotRecord;
import org.apache.skywalking.oap.server.core.query.entity.ProfileAnalyzation;
import org.apache.skywalking.oap.server.core.query.entity.ProfileAnalyzeTimeRange;
import org.apache.skywalking.oap.server.core.query.entity.ProfileStackTree;
import org.apache.skywalking.oap.server.core.query.type.ProfileAnalyzation;
import org.apache.skywalking.oap.server.core.query.type.ProfileAnalyzeTimeRange;
import org.apache.skywalking.oap.server.core.query.type.ProfileStackTree;
import org.apache.skywalking.oap.server.core.storage.StorageModule;
import org.apache.skywalking.oap.server.core.storage.profile.IProfileThreadSnapshotQueryDAO;
import org.apache.skywalking.oap.server.library.module.ModuleManager;
......
......@@ -25,8 +25,8 @@ import java.util.LinkedList;
import java.util.List;
import java.util.ListIterator;
import java.util.function.Consumer;
import org.apache.skywalking.oap.server.core.query.entity.ProfileStackElement;
import org.apache.skywalking.oap.server.core.query.entity.ProfileStackTree;
import org.apache.skywalking.oap.server.core.query.type.ProfileStackElement;
import org.apache.skywalking.oap.server.core.query.type.ProfileStackTree;
/**
* Work for profiling stacks, intermediate state of the {@link ProfileStackElement} and {@link ProfileStack}
......
......@@ -19,11 +19,16 @@
package org.apache.skywalking.oap.server.core.query;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.apache.skywalking.oap.server.core.analysis.DownSampling;
import org.apache.skywalking.apm.util.StringUtil;
import org.apache.skywalking.oap.server.core.Const;
import org.apache.skywalking.oap.server.core.analysis.IDManager;
import org.apache.skywalking.oap.server.core.query.entity.Order;
import org.apache.skywalking.oap.server.core.query.entity.TopNEntity;
import org.apache.skywalking.oap.server.core.analysis.manual.instance.InstanceTraffic;
import org.apache.skywalking.oap.server.core.query.input.Duration;
import org.apache.skywalking.oap.server.core.query.input.TopNCondition;
import org.apache.skywalking.oap.server.core.query.type.KeyValue;
import org.apache.skywalking.oap.server.core.query.type.SelectedRecord;
import org.apache.skywalking.oap.server.core.storage.StorageModule;
import org.apache.skywalking.oap.server.core.storage.annotation.ValueColumnMetadata;
import org.apache.skywalking.oap.server.core.storage.query.IAggregationQueryDAO;
......@@ -31,7 +36,6 @@ import org.apache.skywalking.oap.server.library.module.ModuleManager;
import org.apache.skywalking.oap.server.library.module.Service;
public class AggregationQueryService implements Service {
private final ModuleManager moduleManager;
private IAggregationQueryDAO aggregationQueryDAO;
......@@ -48,75 +52,31 @@ public class AggregationQueryService implements Service {
return aggregationQueryDAO;
}
public List<TopNEntity> getServiceTopN(final String indName, final int topN, final DownSampling downsampling,
final long startTB, final long endTB, final Order order) throws IOException {
List<TopNEntity> topNEntities = getAggregationQueryDAO().getServiceTopN(
indName, ValueColumnMetadata.INSTANCE.getValueCName(indName), topN, downsampling, startTB, endTB, order);
for (TopNEntity entity : topNEntities) {
entity.setName(IDManager.ServiceID.analysisId(entity.getId()).getName());
}
return topNEntities;
}
public List<TopNEntity> getAllServiceInstanceTopN(final String indName,
final int topN,
final DownSampling downsampling,
final long startTB,
final long endTB,
final Order order) throws IOException {
List<TopNEntity> topNEntities = getAggregationQueryDAO().getAllServiceInstanceTopN(
indName, ValueColumnMetadata.INSTANCE
.getValueCName(indName), topN, downsampling, startTB, endTB, order);
for (TopNEntity entity : topNEntities) {
entity.setName(IDManager.ServiceInstanceID.analysisId(entity.getId()).getName());
}
return topNEntities;
}
public List<TopNEntity> getServiceInstanceTopN(final String serviceId,
final String indName,
final int topN,
final DownSampling downsampling,
final long startTB,
final long endTB,
final Order order) throws IOException {
List<TopNEntity> topNEntities = getAggregationQueryDAO().getServiceInstanceTopN(
serviceId, indName, ValueColumnMetadata.INSTANCE
.getValueCName(indName), topN, downsampling, startTB, endTB, order);
for (TopNEntity entity : topNEntities) {
entity.setName(IDManager.ServiceInstanceID.analysisId(entity.getId()).getName());
}
return topNEntities;
}
public List<TopNEntity> getAllEndpointTopN(final String indName,
final int topN,
final DownSampling downsampling,
final long startTB,
final long endTB,
final Order order) throws IOException {
List<TopNEntity> topNEntities = getAggregationQueryDAO().getAllEndpointTopN(
indName, ValueColumnMetadata.INSTANCE.getValueCName(indName), topN, downsampling, startTB, endTB, order);
for (TopNEntity entity : topNEntities) {
entity.setName(IDManager.EndpointID.analysisId(entity.getId()).getEndpointName());
}
return topNEntities;
}
public List<TopNEntity> getEndpointTopN(final String serviceId,
final String indName,
final int topN,
final DownSampling downsampling,
final long startTB,
final long endTB,
final Order order) throws IOException {
List<TopNEntity> topNEntities = getAggregationQueryDAO().getEndpointTopN(
serviceId, indName, ValueColumnMetadata.INSTANCE
.getValueCName(indName), topN, downsampling, startTB, endTB, order);
for (TopNEntity entity : topNEntities) {
entity.setName(IDManager.EndpointID.analysisId(entity.getId()).getEndpointName());
public List<SelectedRecord> sortMetrics(TopNCondition condition, Duration duration) throws IOException {
final String valueCName = ValueColumnMetadata.INSTANCE.getValueCName(condition.getName());
List<KeyValue> additionalConditions = null;
if (StringUtil.isNotEmpty(condition.getParentService())) {
additionalConditions = new ArrayList<>(1);
final String serviceId = IDManager.ServiceID.buildId(condition.getParentService(), condition.isNormal());
additionalConditions.add(new KeyValue(InstanceTraffic.SERVICE_ID, serviceId));
}
return topNEntities;
final List<SelectedRecord> selectedRecords = getAggregationQueryDAO().sortMetrics(
condition, valueCName, duration, additionalConditions);
selectedRecords.forEach(selectedRecord -> {
switch (condition.getScope()) {
case Service:
selectedRecord.setName(IDManager.ServiceID.analysisId(selectedRecord.getId()).getName());
break;
case ServiceInstance:
selectedRecord.setName(IDManager.ServiceInstanceID.analysisId(selectedRecord.getId()).getName());
break;
case Endpoint:
selectedRecord.setName(IDManager.EndpointID.analysisId(selectedRecord.getId()).getEndpointName());
break;
default:
selectedRecord.setName(Const.UNKNOWN);
}
});
return selectedRecords;
}
}
......@@ -19,8 +19,8 @@
package org.apache.skywalking.oap.server.core.query;
import java.io.IOException;
import org.apache.skywalking.oap.server.core.query.entity.Alarms;
import org.apache.skywalking.oap.server.core.query.entity.Pagination;
import org.apache.skywalking.oap.server.core.query.type.Alarms;
import org.apache.skywalking.oap.server.core.query.type.Pagination;
import org.apache.skywalking.oap.server.core.storage.StorageModule;
import org.apache.skywalking.oap.server.core.storage.query.IAlarmQueryDAO;
import org.apache.skywalking.oap.server.library.module.ModuleManager;
......
......@@ -22,8 +22,7 @@ import java.util.LinkedList;
import java.util.List;
import org.apache.skywalking.oap.server.core.Const;
import org.apache.skywalking.oap.server.core.UnexpectedException;
import org.apache.skywalking.oap.server.core.analysis.DownSampling;
import org.apache.skywalking.oap.server.core.query.entity.Step;
import org.apache.skywalking.oap.server.core.query.enumeration.Step;
import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
......@@ -41,7 +40,11 @@ public enum DurationUtils {
private static final DateTimeFormatter YYYYMMDDHHMM = DateTimeFormat.forPattern("yyyyMMddHHmm");
private static final DateTimeFormatter YYYYMMDDHHMMSS = DateTimeFormat.forPattern("yyyyMMddHHmmss");
public long exchangeToTimeBucket(String dateStr) {
/**
* Convert date in `yyyy-MM-dd HHmmss` style to `yyyyMMddHHmmss` no matter the precision. Such as, in day precision,
* this covert `yyyy-MM-dd` style to `yyyyMMdd`.
*/
public long convertToTimeBucket(String dateStr) {
dateStr = dateStr.replaceAll(Const.LINE, Const.EMPTY_STRING);
dateStr = dateStr.replaceAll(Const.SPACE, Const.EMPTY_STRING);
return Long.parseLong(dateStr);
......@@ -51,16 +54,16 @@ public enum DurationUtils {
long secondTimeBucket = 0;
switch (step) {
case DAY:
secondTimeBucket = exchangeToTimeBucket(dateStr) * 100 * 100 * 100;
secondTimeBucket = convertToTimeBucket(dateStr) * 100 * 100 * 100;
break;
case HOUR:
secondTimeBucket = exchangeToTimeBucket(dateStr) * 100 * 100;
secondTimeBucket = convertToTimeBucket(dateStr) * 100 * 100;
break;
case MINUTE:
secondTimeBucket = exchangeToTimeBucket(dateStr) * 100;
secondTimeBucket = convertToTimeBucket(dateStr) * 100;
break;
case SECOND:
secondTimeBucket = exchangeToTimeBucket(dateStr);
secondTimeBucket = convertToTimeBucket(dateStr);
break;
}
return secondTimeBucket;
......@@ -70,21 +73,62 @@ public enum DurationUtils {
long secondTimeBucket = 0;
switch (step) {
case DAY:
secondTimeBucket = ((exchangeToTimeBucket(dateStr) * 100 + 99) * 100 + 99) * 100 + 99;
secondTimeBucket = ((convertToTimeBucket(dateStr) * 100 + 99) * 100 + 99) * 100 + 99;
break;
case HOUR:
secondTimeBucket = (exchangeToTimeBucket(dateStr) * 100 + 99) * 100 + 99;
secondTimeBucket = (convertToTimeBucket(dateStr) * 100 + 99) * 100 + 99;
break;
case MINUTE:
secondTimeBucket = exchangeToTimeBucket(dateStr) * 100 + 99;
secondTimeBucket = convertToTimeBucket(dateStr) * 100 + 99;
break;
case SECOND:
secondTimeBucket = exchangeToTimeBucket(dateStr);
secondTimeBucket = convertToTimeBucket(dateStr);
break;
}
return secondTimeBucket;
}
public List<PointOfTime> getDurationPoints(Step step, long startTimeBucket, long endTimeBucket) {
DateTime dateTime = parseToDateTime(step, startTimeBucket);
List<PointOfTime> durations = new LinkedList<>();
durations.add(new PointOfTime(startTimeBucket));
int i = 0;
do {
switch (step) {
case DAY:
dateTime = dateTime.plusDays(1);
String timeBucket = YYYYMMDD.print(dateTime);
durations.add(new PointOfTime(Long.parseLong(timeBucket)));
break;
case HOUR:
dateTime = dateTime.plusHours(1);
timeBucket = YYYYMMDDHH.print(dateTime);
durations.add(new PointOfTime(Long.parseLong(timeBucket)));
break;
case MINUTE:
dateTime = dateTime.plusMinutes(1);
timeBucket = YYYYMMDDHHMM.print(dateTime);
durations.add(new PointOfTime(Long.parseLong(timeBucket)));
break;
case SECOND:
dateTime = dateTime.plusSeconds(1);
timeBucket = YYYYMMDDHHMMSS.print(dateTime);
durations.add(new PointOfTime(Long.parseLong(timeBucket)));
break;
}
i++;
if (i > 500) {
throw new UnexpectedException(
"Duration data error, step: " + step.name() + ", start: " + startTimeBucket + ", end: " + endTimeBucket);
}
}
while (endTimeBucket != durations.get(durations.size() - 1).getPoint());
return durations;
}
public long startTimeToTimestamp(Step step, String dateStr) {
switch (step) {
case DAY:
......@@ -113,92 +157,17 @@ public enum DurationUtils {
throw new UnexpectedException("Unsupported step " + step.name());
}
public int minutesBetween(DownSampling downsampling, DateTime dateTime) {
switch (downsampling) {
case Day:
return 24 * 60;
case Hour:
return 60;
default:
return 1;
}
}
public int secondsBetween(DownSampling downsampling, DateTime dateTime) {
switch (downsampling) {
case Day:
return 24 * 60 * 60;
case Hour:
return 60 * 60;
case Minute:
return 60;
default:
return 1;
}
}
public List<DurationPoint> getDurationPoints(DownSampling downsampling, long startTimeBucket, long endTimeBucket) {
DateTime dateTime = parseToDateTime(downsampling, startTimeBucket);
List<DurationPoint> durations = new LinkedList<>();
durations.add(new DurationPoint(startTimeBucket, secondsBetween(downsampling, dateTime),
minutesBetween(downsampling, dateTime)
));
int i = 0;
do {
switch (downsampling) {
case Day:
dateTime = dateTime.plusDays(1);
String timeBucket = YYYYMMDD.print(dateTime);
durations.add(new DurationPoint(Long.parseLong(timeBucket), secondsBetween(downsampling, dateTime),
minutesBetween(downsampling, dateTime)
));
break;
case Hour:
dateTime = dateTime.plusHours(1);
timeBucket = YYYYMMDDHH.print(dateTime);
durations.add(new DurationPoint(Long.parseLong(timeBucket), secondsBetween(downsampling, dateTime),
minutesBetween(downsampling, dateTime)
));
break;
case Minute:
dateTime = dateTime.plusMinutes(1);
timeBucket = YYYYMMDDHHMM.print(dateTime);
durations.add(new DurationPoint(Long.parseLong(timeBucket), secondsBetween(downsampling, dateTime),
minutesBetween(downsampling, dateTime)
));
break;
case Second:
dateTime = dateTime.plusSeconds(1);
timeBucket = YYYYMMDDHHMMSS.print(dateTime);
durations.add(new DurationPoint(Long.parseLong(timeBucket), secondsBetween(downsampling, dateTime),
minutesBetween(downsampling, dateTime)
));
break;
}
i++;
if (i > 500) {
throw new UnexpectedException(
"Duration data error, step: " + downsampling.name() + ", start: " + startTimeBucket + ", end: " + endTimeBucket);
}
}
while (endTimeBucket != durations.get(durations.size() - 1).getPoint());
return durations;
}
private DateTime parseToDateTime(DownSampling downsampling, long time) {
switch (downsampling) {
case Day:
private DateTime parseToDateTime(Step step, long time) {
switch (step) {
case DAY:
return YYYYMMDD.parseDateTime(String.valueOf(time));
case Hour:
case HOUR:
return YYYYMMDDHH.parseDateTime(String.valueOf(time));
case Minute:
case MINUTE:
return YYYYMMDDHHMM.parseDateTime(String.valueOf(time));
case Second:
case SECOND:
return YYYYMMDDHHMMSS.parseDateTime(String.valueOf(time));
}
throw new UnexpectedException("Unexpected downsampling: " + downsampling.name());
throw new UnexpectedException("Unexpected downsampling: " + step.name());
}
}
......@@ -21,9 +21,9 @@ package org.apache.skywalking.oap.server.core.query;
import java.io.IOException;
import org.apache.skywalking.apm.util.StringUtil;
import org.apache.skywalking.oap.server.core.analysis.IDManager;
import org.apache.skywalking.oap.server.core.query.entity.LogState;
import org.apache.skywalking.oap.server.core.query.entity.Logs;
import org.apache.skywalking.oap.server.core.query.entity.Pagination;
import org.apache.skywalking.oap.server.core.query.type.LogState;
import org.apache.skywalking.oap.server.core.query.type.Logs;
import org.apache.skywalking.oap.server.core.query.type.Pagination;
import org.apache.skywalking.oap.server.core.storage.StorageModule;
import org.apache.skywalking.oap.server.core.storage.query.ILogQueryDAO;
import org.apache.skywalking.oap.server.library.module.ModuleManager;
......
......@@ -21,13 +21,11 @@ package org.apache.skywalking.oap.server.core.query;
import java.io.IOException;
import java.util.List;
import org.apache.skywalking.oap.server.core.analysis.IDManager;
import org.apache.skywalking.oap.server.core.query.entity.ClusterBrief;
import org.apache.skywalking.oap.server.core.query.entity.Database;
import org.apache.skywalking.oap.server.core.query.entity.Endpoint;
import org.apache.skywalking.oap.server.core.query.entity.EndpointInfo;
import org.apache.skywalking.oap.server.core.query.entity.Service;
import org.apache.skywalking.oap.server.core.query.entity.ServiceInstance;
import org.apache.skywalking.oap.server.core.analysis.NodeType;
import org.apache.skywalking.oap.server.core.query.type.Database;
import org.apache.skywalking.oap.server.core.query.type.Endpoint;
import org.apache.skywalking.oap.server.core.query.type.EndpointInfo;
import org.apache.skywalking.oap.server.core.query.type.Service;
import org.apache.skywalking.oap.server.core.query.type.ServiceInstance;
import org.apache.skywalking.oap.server.core.storage.StorageModule;
import org.apache.skywalking.oap.server.core.storage.query.IMetadataQueryDAO;
import org.apache.skywalking.oap.server.library.module.ModuleManager;
......@@ -48,16 +46,6 @@ public class MetadataQueryService implements org.apache.skywalking.oap.server.li
return metadataQueryDAO;
}
public ClusterBrief getGlobalBrief(final long startTimestamp, final long endTimestamp) throws IOException {
ClusterBrief clusterBrief = new ClusterBrief();
clusterBrief.setNumOfService(getMetadataQueryDAO().numOfService(startTimestamp, endTimestamp));
clusterBrief.setNumOfEndpoint(getMetadataQueryDAO().numOfEndpoint());
clusterBrief.setNumOfDatabase(getMetadataQueryDAO().numOfConjectural(NodeType.Database.value()));
clusterBrief.setNumOfCache(getMetadataQueryDAO().numOfConjectural(NodeType.Cache.value()));
clusterBrief.setNumOfMQ(getMetadataQueryDAO().numOfConjectural(NodeType.MQ.value()));
return clusterBrief;
}
public List<Service> getAllServices(final long startTimestamp, final long endTimestamp) throws IOException {
return getMetadataQueryDAO().getAllServices(startTimestamp, endTimestamp);
}
......
/*
* 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.core.query;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.apache.skywalking.apm.util.StringUtil;
import org.apache.skywalking.oap.server.core.Const;
import org.apache.skywalking.oap.server.core.analysis.DownSampling;
import org.apache.skywalking.oap.server.core.analysis.metrics.Metrics;
import org.apache.skywalking.oap.server.core.query.entity.IntValues;
import org.apache.skywalking.oap.server.core.query.entity.Thermodynamic;
import org.apache.skywalking.oap.server.core.query.sql.KeyValues;
import org.apache.skywalking.oap.server.core.query.sql.Where;
import org.apache.skywalking.oap.server.core.storage.StorageModule;
import org.apache.skywalking.oap.server.core.storage.annotation.ValueColumnMetadata;
import org.apache.skywalking.oap.server.core.storage.query.IMetricsQueryDAO;
import org.apache.skywalking.oap.server.library.module.ModuleManager;
import org.apache.skywalking.oap.server.library.module.Service;
import org.apache.skywalking.oap.server.library.util.CollectionUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class MetricQueryService implements Service {
private static final Logger logger = LoggerFactory.getLogger(MetricQueryService.class);
private final ModuleManager moduleManager;
private IMetricsQueryDAO metricQueryDAO;
public MetricQueryService(ModuleManager moduleManager) {
this.moduleManager = moduleManager;
}
private IMetricsQueryDAO getMetricQueryDAO() {
if (metricQueryDAO == null) {
metricQueryDAO = moduleManager.find(StorageModule.NAME).provider().getService(IMetricsQueryDAO.class);
}
return metricQueryDAO;
}
public IntValues getValues(final String metricsName, final List<String> ids, final DownSampling downsampling,
final long startTB, final long endTB) throws IOException {
if (CollectionUtils.isEmpty(ids)) {
/*
* Don't support query values w/o ID. but UI still did this(as bug),
* we return an empty list, and a debug level log,
* rather than an exception, which always being considered as a serious error from new users.
*/
logger.debug("query metrics[{}] w/o IDs", metricsName);
return new IntValues();
}
Where where = new Where();
KeyValues intKeyValues = new KeyValues();
intKeyValues.setKey(Metrics.ENTITY_ID);
where.getKeyValues().add(intKeyValues);
ids.forEach(intKeyValues.getValues()::add);
return getMetricQueryDAO().getValues(metricsName, downsampling, startTB, endTB, where, ValueColumnMetadata.INSTANCE.getValueCName(metricsName), ValueColumnMetadata.INSTANCE
.getValueFunction(metricsName));
}
public IntValues getLinearIntValues(final String indName, final String id, final DownSampling downsampling,
final long startTB, final long endTB) throws IOException {
List<DurationPoint> durationPoints = DurationUtils.INSTANCE.getDurationPoints(downsampling, startTB, endTB);
List<String> ids = new ArrayList<>();
if (StringUtil.isEmpty(id)) {
durationPoints.forEach(durationPoint -> ids.add(String.valueOf(durationPoint.getPoint())));
} else {
durationPoints.forEach(durationPoint -> ids.add(durationPoint.getPoint() + Const.ID_CONNECTOR + id));
}
return getMetricQueryDAO().getLinearIntValues(indName, downsampling, ids, ValueColumnMetadata.INSTANCE.getValueCName(indName));
}
public List<IntValues> getMultipleLinearIntValues(final String indName, final String id, final int numOfLinear,
final DownSampling downsampling, final long startTB, final long endTB) throws IOException {
List<Integer> linearIndex = new ArrayList<>(numOfLinear);
for (int i = 0; i < numOfLinear; i++) {
linearIndex.add(i);
}
return getSubsetOfMultipleLinearIntValues(indName, id, linearIndex, downsampling, startTB, endTB);
}
public List<IntValues> getSubsetOfMultipleLinearIntValues(final String indName, final String id,
final List<Integer> linearIndex, final DownSampling downsampling, final long startTB,
final long endTB) throws IOException {
List<DurationPoint> durationPoints = DurationUtils.INSTANCE.getDurationPoints(downsampling, startTB, endTB);
List<String> ids = new ArrayList<>();
if (StringUtil.isEmpty(id)) {
durationPoints.forEach(durationPoint -> ids.add(String.valueOf(durationPoint.getPoint())));
} else {
durationPoints.forEach(durationPoint -> ids.add(durationPoint.getPoint() + Const.ID_CONNECTOR + id));
}
IntValues[] multipleLinearIntValues = getMetricQueryDAO().getMultipleLinearIntValues(indName, downsampling, ids, linearIndex, ValueColumnMetadata.INSTANCE
.getValueCName(indName));
List<IntValues> response = new ArrayList<>(linearIndex.size());
Collections.addAll(response, multipleLinearIntValues);
return response;
}
public Thermodynamic getThermodynamic(final String indName, final String id, final DownSampling downsampling,
final long startTB, final long endTB) throws IOException {
List<DurationPoint> durationPoints = DurationUtils.INSTANCE.getDurationPoints(downsampling, startTB, endTB);
List<String> ids = new ArrayList<>();
durationPoints.forEach(durationPoint -> {
if (id == null) {
ids.add(String.valueOf(durationPoint.getPoint()));
} else {
ids.add(durationPoint.getPoint() + Const.ID_CONNECTOR + id);
}
});
return getMetricQueryDAO().getThermodynamic(indName, downsampling, ids, ValueColumnMetadata.INSTANCE.getValueCName(indName));
}
}
/*
* 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.core.query;
import java.io.IOException;
import java.util.List;
import lombok.extern.slf4j.Slf4j;
import org.apache.skywalking.oap.server.core.query.input.Duration;
import org.apache.skywalking.oap.server.core.query.input.MetricsCondition;
import org.apache.skywalking.oap.server.core.query.type.HeatMap;
import org.apache.skywalking.oap.server.core.query.type.MetricsValues;
import org.apache.skywalking.oap.server.core.storage.StorageModule;
import org.apache.skywalking.oap.server.core.storage.annotation.ValueColumnMetadata;
import org.apache.skywalking.oap.server.core.storage.query.IMetricsQueryDAO;
import org.apache.skywalking.oap.server.library.module.ModuleManager;
import org.apache.skywalking.oap.server.library.module.Service;
@Slf4j
public class MetricsQueryService implements Service {
private final ModuleManager moduleManager;
private IMetricsQueryDAO metricQueryDAO;
public MetricsQueryService(ModuleManager moduleManager) {
this.moduleManager = moduleManager;
}
private IMetricsQueryDAO getMetricQueryDAO() {
if (metricQueryDAO == null) {
metricQueryDAO = moduleManager.find(StorageModule.NAME).provider().getService(IMetricsQueryDAO.class);
}
return metricQueryDAO;
}
/**
* Read metrics single value in the duration of required metrics
*/
public int readMetricsValue(MetricsCondition condition, Duration duration) throws IOException {
return getMetricQueryDAO().readMetricsValue(
condition, ValueColumnMetadata.INSTANCE.getValueCName(condition.getName()), duration);
}
/**
* Read time-series values in the duration of required metrics
*/
public MetricsValues readMetricsValues(MetricsCondition condition, Duration duration) throws IOException {
return getMetricQueryDAO().readMetricsValues(
condition, ValueColumnMetadata.INSTANCE.getValueCName(condition.getName()), duration);
}
/**
* Read value in the given time duration, usually as a linear.
*
* @param labels the labels you need to query.
*/
public List<MetricsValues> readLabeledMetricsValues(MetricsCondition condition,
List<String> labels,
Duration duration) throws IOException {
return getMetricQueryDAO().readLabeledMetricsValues(
condition, ValueColumnMetadata.INSTANCE.getValueCName(condition.getName()), labels, duration);
}
/**
* Heatmap is bucket based value statistic result.
*/
public HeatMap readHeatMap(MetricsCondition condition, Duration duration) throws IOException {
return getMetricQueryDAO().readHeatMap(
condition, ValueColumnMetadata.INSTANCE.getValueCName(condition.getName()), duration);
}
}
......@@ -18,7 +18,7 @@
package org.apache.skywalking.oap.server.core.query;
import org.apache.skywalking.oap.server.core.query.entity.Pagination;
import org.apache.skywalking.oap.server.core.query.type.Pagination;
public enum PaginationUtils {
INSTANCE;
......
......@@ -18,26 +18,29 @@
package org.apache.skywalking.oap.server.core.query;
public class DurationPoint {
import lombok.Getter;
import org.apache.skywalking.oap.server.core.Const;
/**
* PointOfTime represents any point of time based on different precisions.
*/
@Getter
public class PointOfTime {
private long point;
private long secondsBetween;
private long minutesBetween;
public DurationPoint(long point, long secondsBetween, long minutesBetween) {
public PointOfTime(long point) {
this.point = point;
this.secondsBetween = secondsBetween;
this.minutesBetween = minutesBetween;
}
public long getPoint() {
return point;
}
public long getSecondsBetween() {
return secondsBetween;
}
public long getMinutesBetween() {
return minutesBetween;
/**
* @return the row id
*/
public String id(String entityId) {
// null means scope = all or unexpected entity.
if (entityId == null) {
return String.valueOf(point);
} else {
return point + Const.ID_CONNECTOR + entityId;
}
}
}
}
\ No newline at end of file
......@@ -32,15 +32,15 @@ import org.apache.skywalking.oap.server.core.analysis.manual.segment.SegmentReco
import org.apache.skywalking.oap.server.core.cache.NetworkAddressAliasCache;
import org.apache.skywalking.oap.server.core.config.IComponentLibraryCatalogService;
import org.apache.skywalking.oap.server.core.profile.analyze.ProfileAnalyzer;
import org.apache.skywalking.oap.server.core.query.entity.BasicTrace;
import org.apache.skywalking.oap.server.core.query.entity.KeyValue;
import org.apache.skywalking.oap.server.core.query.entity.LogEntity;
import org.apache.skywalking.oap.server.core.query.entity.ProfileAnalyzation;
import org.apache.skywalking.oap.server.core.query.entity.ProfileAnalyzeTimeRange;
import org.apache.skywalking.oap.server.core.query.entity.ProfileTask;
import org.apache.skywalking.oap.server.core.query.entity.ProfileTaskLog;
import org.apache.skywalking.oap.server.core.query.entity.ProfiledSegment;
import org.apache.skywalking.oap.server.core.query.entity.ProfiledSpan;
import org.apache.skywalking.oap.server.core.query.type.BasicTrace;
import org.apache.skywalking.oap.server.core.query.type.KeyValue;
import org.apache.skywalking.oap.server.core.query.type.LogEntity;
import org.apache.skywalking.oap.server.core.query.type.ProfileAnalyzation;
import org.apache.skywalking.oap.server.core.query.type.ProfileAnalyzeTimeRange;
import org.apache.skywalking.oap.server.core.query.type.ProfileTask;
import org.apache.skywalking.oap.server.core.query.type.ProfileTaskLog;
import org.apache.skywalking.oap.server.core.query.type.ProfiledSegment;
import org.apache.skywalking.oap.server.core.query.type.ProfiledSpan;
import org.apache.skywalking.oap.server.core.storage.StorageModule;
import org.apache.skywalking.oap.server.core.storage.profile.IProfileTaskLogQueryDAO;
import org.apache.skywalking.oap.server.core.storage.profile.IProfileTaskQueryDAO;
......
......@@ -27,9 +27,9 @@ import org.apache.skywalking.apm.util.StringUtil;
import org.apache.skywalking.oap.server.core.CoreModule;
import org.apache.skywalking.oap.server.core.analysis.IDManager;
import org.apache.skywalking.oap.server.core.config.IComponentLibraryCatalogService;
import org.apache.skywalking.oap.server.core.query.entity.Call;
import org.apache.skywalking.oap.server.core.query.entity.ServiceInstanceNode;
import org.apache.skywalking.oap.server.core.query.entity.ServiceInstanceTopology;
import org.apache.skywalking.oap.server.core.query.type.Call;
import org.apache.skywalking.oap.server.core.query.type.ServiceInstanceNode;
import org.apache.skywalking.oap.server.core.query.type.ServiceInstanceTopology;
import org.apache.skywalking.oap.server.core.source.DetectPoint;
import org.apache.skywalking.oap.server.library.module.ModuleManager;
......
......@@ -31,9 +31,9 @@ import org.apache.skywalking.oap.server.core.analysis.NodeType;
import org.apache.skywalking.oap.server.core.analysis.manual.networkalias.NetworkAddressAlias;
import org.apache.skywalking.oap.server.core.cache.NetworkAddressAliasCache;
import org.apache.skywalking.oap.server.core.config.IComponentLibraryCatalogService;
import org.apache.skywalking.oap.server.core.query.entity.Call;
import org.apache.skywalking.oap.server.core.query.entity.Node;
import org.apache.skywalking.oap.server.core.query.entity.Topology;
import org.apache.skywalking.oap.server.core.query.type.Call;
import org.apache.skywalking.oap.server.core.query.type.Node;
import org.apache.skywalking.oap.server.core.query.type.Topology;
import org.apache.skywalking.oap.server.core.source.DetectPoint;
import org.apache.skywalking.oap.server.library.module.ModuleManager;
......
/*
* 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.core.query;
import org.apache.skywalking.oap.server.core.UnexpectedException;
import org.apache.skywalking.oap.server.core.analysis.DownSampling;
import org.apache.skywalking.oap.server.core.query.entity.Step;
public class StepToDownSampling {
public static DownSampling transform(Step step) {
switch (step) {
case SECOND:
return DownSampling.Second;
case MINUTE:
return DownSampling.Minute;
case HOUR:
return DownSampling.Hour;
case DAY:
return DownSampling.Day;
}
throw new UnexpectedException("Unknown step value.");
}
}
......@@ -20,8 +20,9 @@ package org.apache.skywalking.oap.server.core.query;
import java.io.IOException;
import java.util.List;
import org.apache.skywalking.oap.server.core.query.entity.Order;
import org.apache.skywalking.oap.server.core.query.entity.TopNRecord;
import org.apache.skywalking.oap.server.core.query.input.Duration;
import org.apache.skywalking.oap.server.core.query.input.TopNCondition;
import org.apache.skywalking.oap.server.core.query.type.SelectedRecord;
import org.apache.skywalking.oap.server.core.storage.StorageModule;
import org.apache.skywalking.oap.server.core.storage.query.ITopNRecordsQueryDAO;
import org.apache.skywalking.oap.server.library.module.ModuleManager;
......@@ -44,8 +45,7 @@ public class TopNRecordsQueryService implements Service {
return topNRecordsQueryDAO;
}
public List<TopNRecord> getTopNRecords(long startSecondTB, long endSecondTB, String metricName, String serviceId,
int topN, Order order) throws IOException {
return getTopNRecordsQueryDAO().getTopNRecords(startSecondTB, endSecondTB, metricName, serviceId, topN, order);
public List<SelectedRecord> readSampledRecords(TopNCondition condition, Duration duration) throws IOException {
return getTopNRecordsQueryDAO().readSampledRecords(condition, duration);
}
}
......@@ -27,13 +27,12 @@ import java.util.Set;
import lombok.extern.slf4j.Slf4j;
import org.apache.skywalking.oap.server.core.Const;
import org.apache.skywalking.oap.server.core.CoreModule;
import org.apache.skywalking.oap.server.core.analysis.DownSampling;
import org.apache.skywalking.oap.server.core.analysis.IDManager;
import org.apache.skywalking.oap.server.core.config.IComponentLibraryCatalogService;
import org.apache.skywalking.oap.server.core.query.entity.Call;
import org.apache.skywalking.oap.server.core.query.entity.Node;
import org.apache.skywalking.oap.server.core.query.entity.ServiceInstanceTopology;
import org.apache.skywalking.oap.server.core.query.entity.Topology;
import org.apache.skywalking.oap.server.core.query.type.Call;
import org.apache.skywalking.oap.server.core.query.type.Node;
import org.apache.skywalking.oap.server.core.query.type.ServiceInstanceTopology;
import org.apache.skywalking.oap.server.core.query.type.Topology;
import org.apache.skywalking.oap.server.core.source.DetectPoint;
import org.apache.skywalking.oap.server.core.storage.StorageModule;
import org.apache.skywalking.oap.server.core.storage.query.ITopologyQueryDAO;
......@@ -67,24 +66,23 @@ public class TopologyQueryService implements Service {
return componentLibraryCatalogService;
}
public Topology getGlobalTopology(final DownSampling downsampling, final long startTB,
public Topology getGlobalTopology(final long startTB,
final long endTB) throws IOException {
log.debug("Downsampling: {}, startTimeBucket: {}, endTimeBucket: {}", downsampling, startTB, endTB);
List<Call.CallDetail> serviceRelationServerCalls = getTopologyQueryDAO().loadServiceRelationsDetectedAtServerSide(
downsampling, startTB, endTB);
startTB, endTB);
List<Call.CallDetail> serviceRelationClientCalls = getTopologyQueryDAO().loadServiceRelationDetectedAtClientSide(
downsampling, startTB, endTB);
startTB, endTB);
ServiceTopologyBuilder builder = new ServiceTopologyBuilder(moduleManager);
return builder.build(serviceRelationClientCalls, serviceRelationServerCalls);
}
public Topology getServiceTopology(final DownSampling downsampling, final long startTB, final long endTB,
public Topology getServiceTopology(final long startTB, final long endTB,
final List<String> serviceIds) throws IOException {
List<Call.CallDetail> serviceRelationClientCalls = getTopologyQueryDAO().loadServiceRelationDetectedAtClientSide(
downsampling, startTB, endTB, serviceIds);
startTB, endTB, serviceIds);
List<Call.CallDetail> serviceRelationServerCalls = getTopologyQueryDAO().loadServiceRelationsDetectedAtServerSide(
downsampling, startTB, endTB, serviceIds);
startTB, endTB, serviceIds);
ServiceTopologyBuilder builder = new ServiceTopologyBuilder(moduleManager);
Topology topology = builder.build(serviceRelationClientCalls, serviceRelationServerCalls);
......@@ -105,7 +103,7 @@ public class TopologyQueryService implements Service {
if (CollectionUtils.isNotEmpty(outScopeSourceServiceIds)) {
// If exist, query them as the server side to get the target's component.
List<Call.CallDetail> sourceCalls = getTopologyQueryDAO().loadServiceRelationsDetectedAtServerSide(
downsampling, startTB, endTB, outScopeSourceServiceIds);
startTB, endTB, outScopeSourceServiceIds);
topology.getNodes().forEach(node -> {
if (Strings.isNullOrEmpty(node.getType())) {
for (Call.CallDetail call : sourceCalls) {
......@@ -123,27 +121,21 @@ public class TopologyQueryService implements Service {
public ServiceInstanceTopology getServiceInstanceTopology(final String clientServiceId,
final String serverServiceId,
final DownSampling downsampling,
final long startTB,
final long endTB) throws IOException {
log.debug(
"ClientServiceId: {}, ServerServiceId: {}, Downsampling: {}, startTimeBucket: {}, endTimeBucket: {}",
clientServiceId, serverServiceId, downsampling, startTB, endTB
);
List<Call.CallDetail> serviceInstanceRelationClientCalls = getTopologyQueryDAO().loadInstanceRelationDetectedAtClientSide(
clientServiceId, serverServiceId, downsampling, startTB, endTB);
clientServiceId, serverServiceId, startTB, endTB);
List<Call.CallDetail> serviceInstanceRelationServerCalls = getTopologyQueryDAO().loadInstanceRelationDetectedAtServerSide(
clientServiceId, serverServiceId, downsampling, startTB, endTB);
clientServiceId, serverServiceId, startTB, endTB);
ServiceInstanceTopologyBuilder builder = new ServiceInstanceTopologyBuilder(moduleManager);
return builder.build(serviceInstanceRelationClientCalls, serviceInstanceRelationServerCalls);
}
public Topology getEndpointTopology(final DownSampling downsampling, final long startTB, final long endTB,
public Topology getEndpointTopology(final long startTB, final long endTB,
final String endpointId) throws IOException {
List<Call.CallDetail> serverSideCalls = getTopologyQueryDAO().loadEndpointRelation(
downsampling, startTB, endTB, endpointId);
startTB, endTB, endpointId);
Topology topology = new Topology();
serverSideCalls.forEach(callDetail -> {
......
......@@ -28,16 +28,16 @@ import org.apache.skywalking.oap.server.core.Const;
import org.apache.skywalking.oap.server.core.CoreModule;
import org.apache.skywalking.oap.server.core.analysis.manual.segment.SegmentRecord;
import org.apache.skywalking.oap.server.core.config.IComponentLibraryCatalogService;
import org.apache.skywalking.oap.server.core.query.entity.KeyValue;
import org.apache.skywalking.oap.server.core.query.entity.LogEntity;
import org.apache.skywalking.oap.server.core.query.entity.Pagination;
import org.apache.skywalking.oap.server.core.query.entity.QueryOrder;
import org.apache.skywalking.oap.server.core.query.entity.Ref;
import org.apache.skywalking.oap.server.core.query.entity.RefType;
import org.apache.skywalking.oap.server.core.query.entity.Span;
import org.apache.skywalking.oap.server.core.query.entity.Trace;
import org.apache.skywalking.oap.server.core.query.entity.TraceBrief;
import org.apache.skywalking.oap.server.core.query.entity.TraceState;
import org.apache.skywalking.oap.server.core.query.type.KeyValue;
import org.apache.skywalking.oap.server.core.query.type.LogEntity;
import org.apache.skywalking.oap.server.core.query.type.Pagination;
import org.apache.skywalking.oap.server.core.query.type.QueryOrder;
import org.apache.skywalking.oap.server.core.query.type.Ref;
import org.apache.skywalking.oap.server.core.query.type.RefType;
import org.apache.skywalking.oap.server.core.query.type.Span;
import org.apache.skywalking.oap.server.core.query.type.Trace;
import org.apache.skywalking.oap.server.core.query.type.TraceBrief;
import org.apache.skywalking.oap.server.core.query.type.TraceState;
import org.apache.skywalking.oap.server.core.storage.StorageModule;
import org.apache.skywalking.oap.server.core.storage.query.ITraceQueryDAO;
import org.apache.skywalking.oap.server.library.module.ModuleManager;
......
......@@ -16,12 +16,12 @@
*
*/
package org.apache.skywalking.oap.server.core.query.entity;
package org.apache.skywalking.oap.server.core.query.enumeration;
public enum LanguageTrans {
INSTANCE;
public enum Language {
UNKNOWN, JAVA, DOTNET, NODEJS, PYTHON, RUBY, GO, LUA, PHP;
public Language value(String language) {
public static Language value(String language) {
switch (language) {
case "java":
return Language.JAVA;
......
/*
* 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.core.query.enumeration;
/**
* @since 8.0.0
*/
public enum MetricsType {
UNKNOWN,
// Regular value type is suitable for readMetricsValue, readMetricsValues and sortMetrics
REGULAR_VALUE,
// Metrics value includes multiple labels, is suitable for readLabeledMetricsValues
// Label should be assigned before the query happens, such as at the setting stage
LABELED_VALUE,
// Heatmap value suitable for readHeatMap
HEATMAP,
// Top metrics is for readSampledRecords only.
SAMPLED_RECORD
}
......@@ -16,7 +16,7 @@
*
*/
package org.apache.skywalking.oap.server.core.query.entity;
package org.apache.skywalking.oap.server.core.query.enumeration;
public enum Order {
ASC, DES
......
......@@ -16,7 +16,7 @@
*
*/
package org.apache.skywalking.oap.server.core.query.entity;
package org.apache.skywalking.oap.server.core.query.enumeration;
import java.util.HashMap;
import lombok.Getter;
......@@ -24,7 +24,13 @@ import org.apache.skywalking.oap.server.core.UnexpectedException;
import org.apache.skywalking.oap.server.core.source.DefaultScopeDefine;
public enum Scope {
Service(DefaultScopeDefine.SERVICE), ServiceInstance(DefaultScopeDefine.SERVICE_INSTANCE), Endpoint(DefaultScopeDefine.ENDPOINT), ServiceRelation(DefaultScopeDefine.SERVICE_RELATION), ServiceInstanceRelation(DefaultScopeDefine.SERVICE_INSTANCE_RELATION), EndpointRelation(DefaultScopeDefine.ENDPOINT_RELATION);
All(DefaultScopeDefine.ALL),
Service(DefaultScopeDefine.SERVICE),
ServiceInstance(DefaultScopeDefine.SERVICE_INSTANCE),
Endpoint(DefaultScopeDefine.ENDPOINT),
ServiceRelation(DefaultScopeDefine.SERVICE_RELATION),
ServiceInstanceRelation(DefaultScopeDefine.SERVICE_INSTANCE_RELATION),
EndpointRelation(DefaultScopeDefine.ENDPOINT_RELATION);
@Getter
private int scopeId;
......
......@@ -16,7 +16,7 @@
*
*/
package org.apache.skywalking.oap.server.core.query.entity;
package org.apache.skywalking.oap.server.core.query.enumeration;
public enum Step {
DAY, HOUR, MINUTE, SECOND
......
......@@ -16,14 +16,54 @@
*
*/
package org.apache.skywalking.oap.query.graphql.type;
package org.apache.skywalking.oap.server.core.query.input;
import java.util.List;
import lombok.Getter;
import org.apache.skywalking.oap.server.core.query.entity.Step;
import org.apache.skywalking.oap.server.core.query.DurationUtils;
import org.apache.skywalking.oap.server.core.query.PointOfTime;
import org.apache.skywalking.oap.server.core.query.enumeration.Step;
@Getter
public class Duration {
private String start;
private String end;
private Step step;
/**
* See {@link DurationUtils#convertToTimeBucket(String)}
*/
public long getStartTimeBucket() {
return DurationUtils.INSTANCE.convertToTimeBucket(start);
}
/**
* See {@link DurationUtils#convertToTimeBucket(String)}
*/
public long getEndTimeBucket() {
return DurationUtils.INSTANCE.convertToTimeBucket(end);
}
public long getStartTimestamp() {
return DurationUtils.INSTANCE.startTimeToTimestamp(step, start);
}
public long getEndTimestamp() {
return DurationUtils.INSTANCE.startTimeToTimestamp(step, end);
}
public long getStartTimeBucketInSec() {
return DurationUtils.INSTANCE.startTimeDurationToSecondTimeBucket(step, start);
}
public long getEndTimeBucketInSec() {
return DurationUtils.INSTANCE.endTimeDurationToSecondTimeBucket(step, end);
}
/**
* Assemble time point based on {@link #step} and {@link #start} / {@link #end}
*/
public List<PointOfTime> assembleDurationPoints() {
return DurationUtils.INSTANCE.getDurationPoints(step, getStartTimeBucket(), getEndTimeBucket());
}
}
/*
* 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.core.query.input;
import lombok.Getter;
import lombok.Setter;
import org.apache.skywalking.oap.server.core.analysis.IDManager;
import org.apache.skywalking.oap.server.core.query.enumeration.Scope;
/**
* Entity represents the query entity, including service, instance, endpoint and conjecture service.
*
* @since 8.0.0
*/
@Setter
@Getter
public class Entity {
/**
* <pre>
* 1. scope=All, no name is required.
* 2. scope=Service, ServiceInstance and Endpoint, set neccessary serviceName/serviceInstanceName/endpointName
* 3. Scope=ServiceRelation, ServiceInstanceRelation and EndpointRelation
* serviceName/serviceInstanceName/endpointName is/are the source(s)
* estServiceName/destServiceInstanceName/destEndpointName is/are destination(s)
* set necessary names of sources and destinations.
* </pre>
*/
private Scope scope;
private String serviceName;
/**
* Normal service is the service having installed agent or metrics reported directly. Unnormal service is
* conjectural service, usually detected by the agent.
*/
private boolean isNormal;
private String serviceInstanceName;
private String endpointName;
private String destServiceName;
/**
* Normal service is the service having installed agent or metrics reported directly. Unnormal service is
* conjectural service, usually detected by the agent.
*/
private boolean destIsNormal;
private String destServiceInstanceName;
private String destEndpointName;
public boolean isService() {
return Scope.Service.equals(scope);
}
/**
* @return entity id based on the definition.
*/
public String buildId() {
switch (scope) {
case All:
// This is unnecessary. Just for making core clear.
return null;
case Service:
return IDManager.ServiceID.buildId(serviceName, isNormal);
case ServiceInstance:
return IDManager.ServiceInstanceID.buildId(
IDManager.ServiceID.buildId(serviceName, isNormal), serviceInstanceName);
case Endpoint:
return IDManager.EndpointID.buildId(IDManager.ServiceID.buildId(serviceName, isNormal), endpointName);
case ServiceRelation:
return IDManager.ServiceID.buildRelationId(
new IDManager.ServiceID.ServiceRelationDefine(
IDManager.ServiceID.buildId(serviceName, isNormal),
IDManager.ServiceID.buildId(destServiceName, destIsNormal)
)
);
case ServiceInstanceRelation:
return IDManager.ServiceInstanceID.buildRelationId(
new IDManager.ServiceInstanceID.ServiceInstanceRelationDefine(
IDManager.ServiceInstanceID.buildId(
IDManager.ServiceID.buildId(serviceName, isNormal), serviceInstanceName),
IDManager.ServiceInstanceID.buildId(
IDManager.ServiceID.buildId(destServiceName, destIsNormal), destServiceInstanceName)
)
);
case EndpointRelation:
return IDManager.EndpointID.buildRelationId(
new IDManager.EndpointID.EndpointRelationDefine(
IDManager.ServiceID.buildId(serviceName, isNormal),
endpointName,
IDManager.ServiceID.buildId(destServiceName, destIsNormal),
destEndpointName
)
);
default:
return null;
}
}
}
......@@ -16,12 +16,12 @@
*
*/
package org.apache.skywalking.oap.query.graphql.type;
package org.apache.skywalking.oap.server.core.query.input;
import lombok.Getter;
import lombok.Setter;
import org.apache.skywalking.oap.server.core.query.entity.LogState;
import org.apache.skywalking.oap.server.core.query.entity.Pagination;
import org.apache.skywalking.oap.server.core.query.type.LogState;
import org.apache.skywalking.oap.server.core.query.type.Pagination;
@Getter
@Setter
......
......@@ -16,7 +16,7 @@
*
*/
package org.apache.skywalking.oap.query.graphql.type;
package org.apache.skywalking.oap.server.core.query.input;
import lombok.Getter;
import lombok.Setter;
......
/*
* 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.core.query.input;
import lombok.Getter;
import lombok.Setter;
/**
* @since 8.0.0
*/
@Getter
@Setter
public class MetricsCondition {
/**
* Metrics name
*/
private String name;
/**
* See {@link Entity}
*/
private Entity entity;
}
......@@ -16,11 +16,11 @@
*
*/
package org.apache.skywalking.oap.query.graphql.type;
package org.apache.skywalking.oap.server.core.query.input;
import lombok.Getter;
import lombok.Setter;
import org.apache.skywalking.oap.server.core.query.entity.Step;
import org.apache.skywalking.oap.server.core.query.enumeration.Step;
/**
* Profile task create need data
......
/*
* 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.core.query.input;
import lombok.Getter;
import lombok.Setter;
import org.apache.skywalking.oap.server.core.query.enumeration.Order;
import org.apache.skywalking.oap.server.core.query.enumeration.Scope;
/**
* Top N query condition.
*
* @since 8.0.0
*/
@Setter
@Getter
public class TopNCondition {
/**
* Metrics name
*/
private String name;
/**
* See {@link Entity}
*/
private String parentService;
/**
* Normal service is the service having installed agent or metrics reported directly. Unnormal service is
* conjectural service, usually detected by the agent.
*/
private boolean isNormal;
/**
* Indicate the metrics entity scope. Because this is a top list, don't need to set the Entity like the
* MetricsCondition. Only accept scope = {@link Scope#Service} {@link Scope#ServiceInstance} and {@link
* Scope#Endpoint}, ignore others due to those are pointless.
*/
private Scope scope;
private int topN;
private Order order;
}
......@@ -16,13 +16,13 @@
*
*/
package org.apache.skywalking.oap.query.graphql.type;
package org.apache.skywalking.oap.server.core.query.input;
import lombok.Getter;
import lombok.Setter;
import org.apache.skywalking.oap.server.core.query.entity.Pagination;
import org.apache.skywalking.oap.server.core.query.entity.QueryOrder;
import org.apache.skywalking.oap.server.core.query.entity.TraceState;
import org.apache.skywalking.oap.server.core.query.type.Pagination;
import org.apache.skywalking.oap.server.core.query.type.QueryOrder;
import org.apache.skywalking.oap.server.core.query.type.TraceState;
@Getter
@Setter
......
......@@ -16,10 +16,11 @@
*
*/
package org.apache.skywalking.oap.server.core.query.entity;
package org.apache.skywalking.oap.server.core.query.type;
import lombok.Getter;
import lombok.Setter;
import org.apache.skywalking.oap.server.core.query.enumeration.Scope;
@Getter
@Setter
......
......@@ -16,7 +16,7 @@
*
*/
package org.apache.skywalking.oap.server.core.query.entity;
package org.apache.skywalking.oap.server.core.query.type;
import java.util.ArrayList;
import java.util.List;
......
......@@ -16,7 +16,7 @@
*
*/
package org.apache.skywalking.oap.server.core.query.entity;
package org.apache.skywalking.oap.server.core.query.type;
import java.util.ArrayList;
import java.util.List;
......
......@@ -16,7 +16,7 @@
*
*/
package org.apache.skywalking.oap.server.core.query.entity;
package org.apache.skywalking.oap.server.core.query.type;
import lombok.Getter;
import lombok.Setter;
......
......@@ -16,7 +16,7 @@
*
*/
package org.apache.skywalking.oap.server.core.query.entity;
package org.apache.skywalking.oap.server.core.query.type;
import java.util.ArrayList;
import java.util.List;
......
......@@ -16,48 +16,67 @@
*
*/
package org.apache.skywalking.oap.server.core.query.entity;
import java.util.ArrayList;
import java.util.List;
import lombok.Getter;
import lombok.Setter;
@Getter
public class Thermodynamic {
private final List<List<Long>> nodes;
@Setter
private int axisYStep;
public Thermodynamic() {
this.nodes = new ArrayList<>();
}
public void fromMatrixData(List<List<Long>> thermodynamicValueMatrix, int numOfSteps) {
thermodynamicValueMatrix.forEach(columnOfThermodynamic -> {
if (columnOfThermodynamic.size() == 0) {
if (numOfSteps > 0) {
for (int i = 0; i < numOfSteps; i++) {
columnOfThermodynamic.add(0L);
}
}
}
});
for (int colNum = 0; colNum < thermodynamicValueMatrix.size(); colNum++) {
List<Long> column = thermodynamicValueMatrix.get(colNum);
for (int rowNum = 0; rowNum < column.size(); rowNum++) {
Long value = column.get(rowNum);
this.setNodeValue(colNum, rowNum, value);
}
}
package org.apache.skywalking.oap.server.core.query.type;
/**
* @since 8.0.0
*/
public class Bucket {
private static final String INFINITE_NEGATIVE = "infinite-";
private static final String INFINITE_POSITIVE = "infinite+";
/**
* The min value of this bucket representing.
*/
private String min = "0";
/**
* The max value of this bucket representing.
*/
private String max = "0";
public Bucket() {
}
public Bucket(int min, int max) {
setMin(min);
setMax(max);
}
public Bucket setMin(int min) {
this.min = String.valueOf(min);
return this;
}
public Bucket setMax(int max) {
this.max = String.valueOf(max);
return this;
}
private void setNodeValue(int columnNum, int rowNum, Long value) {
List<Long> element = new ArrayList<>(3);
element.add((long) columnNum);
element.add((long) rowNum);
element.add(value);
nodes.add(element);
public Bucket infiniteMin() {
this.min = INFINITE_NEGATIVE;
return this;
}
public Bucket infiniteMax() {
this.max = INFINITE_POSITIVE;
return this;
}
public boolean isInfiniteMin() {
return INFINITE_NEGATIVE.equals(this.min);
}
public boolean isInfiniteMax() {
return INFINITE_POSITIVE.equals(this.max);
}
public int duration() {
if (isInfiniteMin()) {
return Integer.MIN_VALUE;
}
if (isInfiniteMax()) {
return Integer.MAX_VALUE;
}
return Integer.parseInt(this.max) - Integer.parseInt(this.min);
}
}
\ No newline at end of file
}
......@@ -16,7 +16,7 @@
*
*/
package org.apache.skywalking.oap.server.core.query.entity;
package org.apache.skywalking.oap.server.core.query.type;
import java.util.ArrayList;
import java.util.List;
......
......@@ -16,17 +16,18 @@
*
*/
package org.apache.skywalking.oap.server.core.query.entity;
package org.apache.skywalking.oap.server.core.query.type;
import lombok.Getter;
import lombok.Setter;
@Deprecated
@Getter
@Setter
public class ClusterBrief {
private int numOfService;
private int numOfEndpoint;
private int numOfDatabase;
private int numOfCache;
private int numOfMQ;
private int numOfService = 0;
private int numOfEndpoint = 0;
private int numOfDatabase = 0;
private int numOfCache = 0;
private int numOfMQ = 0;
}
......@@ -16,7 +16,7 @@
*
*/
package org.apache.skywalking.oap.server.core.query.entity;
package org.apache.skywalking.oap.server.core.query.type;
import org.apache.skywalking.oap.server.core.UnexpectedException;
......
......@@ -16,7 +16,7 @@
*
*/
package org.apache.skywalking.oap.server.core.query.entity;
package org.apache.skywalking.oap.server.core.query.type;
import lombok.Getter;
import lombok.Setter;
......
......@@ -16,7 +16,7 @@
*
*/
package org.apache.skywalking.oap.server.core.query.entity;
package org.apache.skywalking.oap.server.core.query.type;
import lombok.Getter;
import lombok.Setter;
......
......@@ -16,7 +16,7 @@
*
*/
package org.apache.skywalking.oap.server.core.query.entity;
package org.apache.skywalking.oap.server.core.query.type;
import lombok.Getter;
import lombok.Setter;
......
/*
* 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.core.query.type;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import lombok.Getter;
import lombok.Setter;
import org.apache.skywalking.oap.server.core.analysis.metrics.DataTable;
/**
* HeatMap represents the value distribution in the defined buckets.
*
* @since 8.0.0
*/
@Getter
public class HeatMap {
private List<HeatMapColumn> values = new ArrayList<>(10);
private List<Bucket> buckets = null;
public void addBucket(Bucket bucket) {
this.buckets.add(bucket);
}
/**
* Build one heatmap value column based on rawdata in the storage and row id.
*
* @param id of the row
* @param rawdata literal string, represent a {@link DataTable}
*/
public void buildColumn(String id, String rawdata) {
DataTable dataset = new DataTable(rawdata);
final List<String> sortedKeys = dataset.sortedKeys(
Comparator.comparingInt(Integer::parseInt));
if (buckets == null) {
buckets = new ArrayList<>(dataset.size());
for (int i = 0; i < sortedKeys.size(); i++) {
if (i == sortedKeys.size() - 1) {
// last element
this.addBucket(
new Bucket().setMin(Integer.parseInt(sortedKeys.get(i))).infiniteMax()
);
} else {
this.addBucket(new Bucket(
Integer.parseInt(sortedKeys.get(i)),
Integer.parseInt(sortedKeys.get(i + 1))
));
}
}
}
HeatMap.HeatMapColumn column = new HeatMap.HeatMapColumn();
column.setId(id);
sortedKeys.forEach(key -> {
column.addValue(dataset.get(key));
});
values.add(column);
}
public void fixMissingColumns(List<String> ids) {
for (int i = 0; i < ids.size(); i++) {
final String expectedId = ids.get(i);
boolean found = false;
for (final HeatMapColumn value : values) {
if (expectedId.equals(value.id)) {
found = true;
}
}
if (!found) {
final HeatMapColumn emptyColumn = buildMissingColumn(expectedId);
values.add(i, emptyColumn);
}
}
}
private HeatMapColumn buildMissingColumn(String id) {
HeatMapColumn column = new HeatMapColumn();
column.setId(id);
buckets.forEach(bucket -> {
column.addValue(0L);
});
return column;
}
@Getter
public static class HeatMapColumn {
@Setter
private String id;
private List<Long> values = new ArrayList<>();
public void addValue(Long value) {
values.add(value);
}
}
}
......@@ -16,13 +16,13 @@
*
*/
package org.apache.skywalking.oap.server.core.query.entity;
package org.apache.skywalking.oap.server.core.query.type;
import java.util.LinkedList;
import java.util.ArrayList;
import java.util.List;
public class IntValues {
private LinkedList<KVInt> values = new LinkedList<>();
private List<KVInt> values = new ArrayList<>();
public void addKVInt(KVInt e) {
values.add(e);
......@@ -36,17 +36,4 @@ public class IntValues {
}
return defaultValue;
}
public KVInt getLast() {
return values.getLast();
}
public boolean contain(String id) {
for (KVInt value : values) {
if (value.getId().equals(id)) {
return true;
}
}
return false;
}
}
......@@ -16,7 +16,7 @@
*
*/
package org.apache.skywalking.oap.server.core.query.entity;
package org.apache.skywalking.oap.server.core.query.type;
import lombok.Getter;
import lombok.Setter;
......
......@@ -16,7 +16,7 @@
*
*/
package org.apache.skywalking.oap.server.core.query.entity;
package org.apache.skywalking.oap.server.core.query.type;
import lombok.Getter;
import lombok.Setter;
......
......@@ -16,7 +16,7 @@
*
*/
package org.apache.skywalking.oap.server.core.query.entity;
package org.apache.skywalking.oap.server.core.query.type;
import lombok.Getter;
import lombok.Setter;
......
......@@ -16,7 +16,7 @@
*
*/
package org.apache.skywalking.oap.server.core.query.entity;
package org.apache.skywalking.oap.server.core.query.type;
import java.util.ArrayList;
import java.util.List;
......
......@@ -16,7 +16,7 @@
*
*/
package org.apache.skywalking.oap.server.core.query.entity;
package org.apache.skywalking.oap.server.core.query.type;
public enum LogState {
ALL, SUCCESS, ERROR
......
......@@ -16,7 +16,7 @@
*
*/
package org.apache.skywalking.oap.server.core.query.entity;
package org.apache.skywalking.oap.server.core.query.type;
import java.util.ArrayList;
import java.util.List;
......
/*
* 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.core.query.type;
import lombok.Getter;
import lombok.Setter;
/**
* @since 8.0.0
*/
@Getter
@Setter
public class MetricsValues {
private String label;
private IntValues values = new IntValues();
}
......@@ -16,7 +16,7 @@
*
*/
package org.apache.skywalking.oap.server.core.query.entity;
package org.apache.skywalking.oap.server.core.query.type;
import lombok.Getter;
import lombok.Setter;
......
......@@ -16,7 +16,7 @@
*
*/
package org.apache.skywalking.oap.server.core.query.entity;
package org.apache.skywalking.oap.server.core.query.type;
import lombok.Getter;
import lombok.Setter;
......
......@@ -16,7 +16,7 @@
*
*/
package org.apache.skywalking.oap.server.core.query.entity;
package org.apache.skywalking.oap.server.core.query.type;
import java.util.ArrayList;
import java.util.List;
......
......@@ -16,7 +16,7 @@
*
*/
package org.apache.skywalking.oap.server.core.query.entity;
package org.apache.skywalking.oap.server.core.query.type;
import lombok.Getter;
import lombok.Setter;
......
......@@ -16,7 +16,7 @@
*
*/
package org.apache.skywalking.oap.server.core.query.entity;
package org.apache.skywalking.oap.server.core.query.type;
import lombok.Getter;
import lombok.Setter;
......
......@@ -16,7 +16,7 @@
*
*/
package org.apache.skywalking.oap.server.core.query.entity;
package org.apache.skywalking.oap.server.core.query.type;
import java.util.ArrayList;
import java.util.List;
......
......@@ -16,7 +16,7 @@
*
*/
package org.apache.skywalking.oap.server.core.query.entity;
package org.apache.skywalking.oap.server.core.query.type;
import java.util.List;
import lombok.AllArgsConstructor;
......
......@@ -16,7 +16,7 @@
*
*/
package org.apache.skywalking.oap.server.core.query.entity;
package org.apache.skywalking.oap.server.core.query.type;
import lombok.AllArgsConstructor;
import lombok.Builder;
......
......@@ -16,7 +16,7 @@
*
*/
package org.apache.skywalking.oap.server.core.query.entity;
package org.apache.skywalking.oap.server.core.query.type;
import lombok.AllArgsConstructor;
import lombok.Builder;
......
......@@ -16,7 +16,7 @@
*
*/
package org.apache.skywalking.oap.server.core.query.entity;
package org.apache.skywalking.oap.server.core.query.type;
import java.util.HashMap;
import java.util.Map;
......
......@@ -16,7 +16,7 @@
*
*/
package org.apache.skywalking.oap.server.core.query.entity;
package org.apache.skywalking.oap.server.core.query.type;
import lombok.Getter;
import lombok.Setter;
......
......@@ -16,7 +16,7 @@
*
*/
package org.apache.skywalking.oap.server.core.query.entity;
package org.apache.skywalking.oap.server.core.query.type;
import java.util.ArrayList;
import java.util.List;
......
......@@ -16,7 +16,7 @@
*
*/
package org.apache.skywalking.oap.server.core.query.entity;
package org.apache.skywalking.oap.server.core.query.type;
public enum QueryOrder {
BY_START_TIME, BY_DURATION
......
......@@ -16,7 +16,7 @@
*
*/
package org.apache.skywalking.oap.server.core.query.entity;
package org.apache.skywalking.oap.server.core.query.type;
import lombok.Getter;
import lombok.Setter;
......
......@@ -16,7 +16,7 @@
*
*/
package org.apache.skywalking.oap.server.core.query.entity;
package org.apache.skywalking.oap.server.core.query.type;
public enum RefType {
CROSS_PROCESS, CROSS_THREAD
......
/*
* 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.core.query.type;
import lombok.Getter;
import lombok.Setter;
/**
* SelectedRecord is an abtract data element, including id, name, value and a reference id.
*/
@Setter
@Getter
public class SelectedRecord {
/**
* Literal string name for visualization
*/
private String name;
/**
* ID represents the owner of this entity.
*/
private String id;
/**
* Usually an integer value as this is metrics.
*/
private String value;
/**
* Have value, Only if the record has related trace id. UI should show this as an attached value.
*/
private String refId;
}
......@@ -16,7 +16,7 @@
*
*/
package org.apache.skywalking.oap.server.core.query.entity;
package org.apache.skywalking.oap.server.core.query.type;
import lombok.Getter;
import lombok.Setter;
......
......@@ -16,12 +16,13 @@
*
*/
package org.apache.skywalking.oap.server.core.query.entity;
package org.apache.skywalking.oap.server.core.query.type;
import java.util.ArrayList;
import java.util.List;
import lombok.Getter;
import lombok.Setter;
import org.apache.skywalking.oap.server.core.query.enumeration.Language;
@Getter
public class ServiceInstance {
......
......@@ -16,7 +16,7 @@
*
*/
package org.apache.skywalking.oap.server.core.query.entity;
package org.apache.skywalking.oap.server.core.query.type;
import lombok.Getter;
import lombok.Setter;
......
......@@ -16,7 +16,7 @@
*
*/
package org.apache.skywalking.oap.server.core.query.entity;
package org.apache.skywalking.oap.server.core.query.type;
import java.util.ArrayList;
import java.util.List;
......
......@@ -16,7 +16,7 @@
*
*/
package org.apache.skywalking.oap.server.core.query.entity;
package org.apache.skywalking.oap.server.core.query.type;
import java.util.ArrayList;
import java.util.List;
......
/*
* 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.core.query.type;
import java.util.ArrayList;
import java.util.List;
import lombok.Getter;
import lombok.Setter;
/**
* Replaced by {@link HeatMap}
*/
@Deprecated
@Getter
public class Thermodynamic {
private final List<List<Long>> nodes;
@Setter
private int axisYStep;
public Thermodynamic() {
this.nodes = new ArrayList<>();
}
public void addNodeValue(int columnNum, int rowNum, Long value) {
List<Long> element = new ArrayList<>(3);
element.add((long) columnNum);
element.add((long) rowNum);
element.add(value);
nodes.add(element);
}
}
\ No newline at end of file
......@@ -16,15 +16,28 @@
*
*/
package org.apache.skywalking.oap.server.core.query.entity;
package org.apache.skywalking.oap.server.core.query.type;
import lombok.Getter;
import lombok.Setter;
/**
* @since 8.0.0 replaced by {@link SelectedRecord}
*/
@Deprecated
@Getter
@Setter
public class TopNEntity {
private String name;
private String id;
private long value;
public TopNEntity() {
}
public TopNEntity(SelectedRecord record) {
this.name = record.getName();
this.id = record.getId();
this.value = Long.parseLong(record.getValue());
}
}
......@@ -16,11 +16,15 @@
*
*/
package org.apache.skywalking.oap.server.core.query.entity;
package org.apache.skywalking.oap.server.core.query.type;
import lombok.Getter;
import lombok.Setter;
/**
* @since 8.0.0 replaced by {@link SelectedRecord}
*/
@Deprecated
@Setter
@Getter
public class TopNRecord {
......
......@@ -16,7 +16,7 @@
*
*/
package org.apache.skywalking.oap.server.core.query.entity;
package org.apache.skywalking.oap.server.core.query.type;
import java.util.ArrayList;
import java.util.List;
......
......@@ -16,7 +16,7 @@
*
*/
package org.apache.skywalking.oap.server.core.query.entity;
package org.apache.skywalking.oap.server.core.query.type;
import java.util.ArrayList;
import java.util.List;
......
此差异已折叠。
此差异已折叠。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册