diff --git a/apm-protocol/apm-network/src/main/proto b/apm-protocol/apm-network/src/main/proto index e259efbc2..e7fc69462 160000 --- a/apm-protocol/apm-network/src/main/proto +++ b/apm-protocol/apm-network/src/main/proto @@ -1 +1 @@ -Subproject commit e259efbc20a69e23a5c8542394579f006396e6a5 +Subproject commit e7fc69462955c86d70f3f7f33712dfe33ecefbc6 diff --git a/oap-server/server-core/pom.xml b/oap-server/server-core/pom.xml index 32f1a6074..b9b915406 100644 --- a/oap-server/server-core/pom.xml +++ b/oap-server/server-core/pom.xml @@ -60,6 +60,11 @@ apm-datacarrier ${project.version} + + org.apache.skywalking + apm-network + ${project.version} + diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/CoreModule.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/CoreModule.java index d0b93eb72..f921fc0c0 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/CoreModule.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/CoreModule.java @@ -21,7 +21,7 @@ package org.apache.skywalking.oap.server.core; import java.util.*; import org.apache.skywalking.oap.server.core.cache.*; import org.apache.skywalking.oap.server.core.config.IComponentLibraryCatalogService; -import org.apache.skywalking.oap.server.core.query.TopologyQueryService; +import org.apache.skywalking.oap.server.core.query.*; import org.apache.skywalking.oap.server.core.register.service.*; import org.apache.skywalking.oap.server.core.remote.RemoteSenderService; import org.apache.skywalking.oap.server.core.remote.annotation.StreamDataClassGetter; @@ -58,6 +58,8 @@ public class CoreModule extends ModuleDefine { private void addQueryService(List classes) { classes.add(TopologyQueryService.class); + classes.add(MetricQueryService.class); + classes.add(TraceQueryService.class); } private void addServerInterface(List classes) { diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/CoreModuleProvider.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/CoreModuleProvider.java index 91d0b338e..e567b9c36 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/CoreModuleProvider.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/CoreModuleProvider.java @@ -25,7 +25,7 @@ import org.apache.skywalking.oap.server.core.annotation.AnnotationScan; import org.apache.skywalking.oap.server.core.cache.*; import org.apache.skywalking.oap.server.core.cluster.*; import org.apache.skywalking.oap.server.core.config.*; -import org.apache.skywalking.oap.server.core.query.TopologyQueryService; +import org.apache.skywalking.oap.server.core.query.*; import org.apache.skywalking.oap.server.core.register.annotation.InventoryTypeListener; import org.apache.skywalking.oap.server.core.register.service.*; import org.apache.skywalking.oap.server.core.remote.*; @@ -111,6 +111,8 @@ public class CoreModuleProvider extends ModuleProvider { this.registerServiceImplementation(INetworkAddressInventoryRegister.class, new NetworkAddressInventoryRegister(getManager())); this.registerServiceImplementation(TopologyQueryService.class, new TopologyQueryService(getManager())); + this.registerServiceImplementation(MetricQueryService.class, new MetricQueryService(getManager())); + this.registerServiceImplementation(TraceQueryService.class, new TraceQueryService(getManager())); annotationScan.registerListener(storageAnnotationListener); annotationScan.registerListener(streamAnnotationListener); diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/all/AllHeatmapIndicator.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/all/AllHeatmapIndicator.java index 507f6cdf5..731dd9d0b 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/all/AllHeatmapIndicator.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/all/AllHeatmapIndicator.java @@ -153,7 +153,7 @@ public class AllHeatmapIndicator extends ThermodynamicIndicator implements Alarm AllHeatmapIndicator indicator = new AllHeatmapIndicator(); indicator.setStep(((Number)dbMap.get("step")).intValue()); indicator.setNumOfSteps(((Number)dbMap.get("num_of_steps")).intValue()); - indicator.setDetailGroup((org.apache.skywalking.oap.server.core.analysis.indicator.IntKeyLongValueArray)dbMap.get("detail_group")); + indicator.setDetailGroup(new org.apache.skywalking.oap.server.core.analysis.indicator.IntKeyLongValueArray((String)dbMap.get("detail_group"))); indicator.setTimeBucket(((Number)dbMap.get("time_bucket")).longValue()); return indicator; } diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/all/AllP50Indicator.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/all/AllP50Indicator.java index 7c49051a5..068e2e522 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/all/AllP50Indicator.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/all/AllP50Indicator.java @@ -153,7 +153,7 @@ public class AllP50Indicator extends P50Indicator implements AlarmSupported { AllP50Indicator indicator = new AllP50Indicator(); indicator.setValue(((Number)dbMap.get("value")).intValue()); indicator.setPrecision(((Number)dbMap.get("precision")).intValue()); - indicator.setDetailGroup((org.apache.skywalking.oap.server.core.analysis.indicator.IntKeyLongValueArray)dbMap.get("detail_group")); + indicator.setDetailGroup(new org.apache.skywalking.oap.server.core.analysis.indicator.IntKeyLongValueArray((String)dbMap.get("detail_group"))); indicator.setTimeBucket(((Number)dbMap.get("time_bucket")).longValue()); return indicator; } diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/all/AllP75Indicator.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/all/AllP75Indicator.java index cca74d36d..b235c4f70 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/all/AllP75Indicator.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/all/AllP75Indicator.java @@ -153,7 +153,7 @@ public class AllP75Indicator extends P75Indicator implements AlarmSupported { AllP75Indicator indicator = new AllP75Indicator(); indicator.setValue(((Number)dbMap.get("value")).intValue()); indicator.setPrecision(((Number)dbMap.get("precision")).intValue()); - indicator.setDetailGroup((org.apache.skywalking.oap.server.core.analysis.indicator.IntKeyLongValueArray)dbMap.get("detail_group")); + indicator.setDetailGroup(new org.apache.skywalking.oap.server.core.analysis.indicator.IntKeyLongValueArray((String)dbMap.get("detail_group"))); indicator.setTimeBucket(((Number)dbMap.get("time_bucket")).longValue()); return indicator; } diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/all/AllP90Indicator.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/all/AllP90Indicator.java index ff9a5b338..3cf4ac074 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/all/AllP90Indicator.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/all/AllP90Indicator.java @@ -153,7 +153,7 @@ public class AllP90Indicator extends P90Indicator implements AlarmSupported { AllP90Indicator indicator = new AllP90Indicator(); indicator.setValue(((Number)dbMap.get("value")).intValue()); indicator.setPrecision(((Number)dbMap.get("precision")).intValue()); - indicator.setDetailGroup((org.apache.skywalking.oap.server.core.analysis.indicator.IntKeyLongValueArray)dbMap.get("detail_group")); + indicator.setDetailGroup(new org.apache.skywalking.oap.server.core.analysis.indicator.IntKeyLongValueArray((String)dbMap.get("detail_group"))); indicator.setTimeBucket(((Number)dbMap.get("time_bucket")).longValue()); return indicator; } diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/all/AllP95Indicator.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/all/AllP95Indicator.java index 2afa42765..8355de3d6 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/all/AllP95Indicator.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/all/AllP95Indicator.java @@ -153,7 +153,7 @@ public class AllP95Indicator extends P95Indicator implements AlarmSupported { AllP95Indicator indicator = new AllP95Indicator(); indicator.setValue(((Number)dbMap.get("value")).intValue()); indicator.setPrecision(((Number)dbMap.get("precision")).intValue()); - indicator.setDetailGroup((org.apache.skywalking.oap.server.core.analysis.indicator.IntKeyLongValueArray)dbMap.get("detail_group")); + indicator.setDetailGroup(new org.apache.skywalking.oap.server.core.analysis.indicator.IntKeyLongValueArray((String)dbMap.get("detail_group"))); indicator.setTimeBucket(((Number)dbMap.get("time_bucket")).longValue()); return indicator; } diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/all/AllP99Indicator.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/all/AllP99Indicator.java index c1032bd87..85d50237c 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/all/AllP99Indicator.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/all/AllP99Indicator.java @@ -153,7 +153,7 @@ public class AllP99Indicator extends P99Indicator implements AlarmSupported { AllP99Indicator indicator = new AllP99Indicator(); indicator.setValue(((Number)dbMap.get("value")).intValue()); indicator.setPrecision(((Number)dbMap.get("precision")).intValue()); - indicator.setDetailGroup((org.apache.skywalking.oap.server.core.analysis.indicator.IntKeyLongValueArray)dbMap.get("detail_group")); + indicator.setDetailGroup(new org.apache.skywalking.oap.server.core.analysis.indicator.IntKeyLongValueArray((String)dbMap.get("detail_group"))); indicator.setTimeBucket(((Number)dbMap.get("time_bucket")).longValue()); return indicator; } diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/endpoint/EndpointP50Indicator.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/endpoint/EndpointP50Indicator.java index 613ca16ad..0102e94d2 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/endpoint/EndpointP50Indicator.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/endpoint/EndpointP50Indicator.java @@ -184,7 +184,7 @@ public class EndpointP50Indicator extends P50Indicator implements AlarmSupported indicator.setServiceInstanceId(((Number)dbMap.get("service_instance_id")).intValue()); indicator.setValue(((Number)dbMap.get("value")).intValue()); indicator.setPrecision(((Number)dbMap.get("precision")).intValue()); - indicator.setDetailGroup((org.apache.skywalking.oap.server.core.analysis.indicator.IntKeyLongValueArray)dbMap.get("detail_group")); + indicator.setDetailGroup(new org.apache.skywalking.oap.server.core.analysis.indicator.IntKeyLongValueArray((String)dbMap.get("detail_group"))); indicator.setTimeBucket(((Number)dbMap.get("time_bucket")).longValue()); return indicator; } diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/endpoint/EndpointP75Indicator.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/endpoint/EndpointP75Indicator.java index 27fcb15e9..02da8226b 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/endpoint/EndpointP75Indicator.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/endpoint/EndpointP75Indicator.java @@ -184,7 +184,7 @@ public class EndpointP75Indicator extends P75Indicator implements AlarmSupported indicator.setServiceInstanceId(((Number)dbMap.get("service_instance_id")).intValue()); indicator.setValue(((Number)dbMap.get("value")).intValue()); indicator.setPrecision(((Number)dbMap.get("precision")).intValue()); - indicator.setDetailGroup((org.apache.skywalking.oap.server.core.analysis.indicator.IntKeyLongValueArray)dbMap.get("detail_group")); + indicator.setDetailGroup(new org.apache.skywalking.oap.server.core.analysis.indicator.IntKeyLongValueArray((String)dbMap.get("detail_group"))); indicator.setTimeBucket(((Number)dbMap.get("time_bucket")).longValue()); return indicator; } diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/endpoint/EndpointP90Indicator.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/endpoint/EndpointP90Indicator.java index 20b0cd603..cdba9065b 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/endpoint/EndpointP90Indicator.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/endpoint/EndpointP90Indicator.java @@ -184,7 +184,7 @@ public class EndpointP90Indicator extends P90Indicator implements AlarmSupported indicator.setServiceInstanceId(((Number)dbMap.get("service_instance_id")).intValue()); indicator.setValue(((Number)dbMap.get("value")).intValue()); indicator.setPrecision(((Number)dbMap.get("precision")).intValue()); - indicator.setDetailGroup((org.apache.skywalking.oap.server.core.analysis.indicator.IntKeyLongValueArray)dbMap.get("detail_group")); + indicator.setDetailGroup(new org.apache.skywalking.oap.server.core.analysis.indicator.IntKeyLongValueArray((String)dbMap.get("detail_group"))); indicator.setTimeBucket(((Number)dbMap.get("time_bucket")).longValue()); return indicator; } diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/endpoint/EndpointP95Indicator.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/endpoint/EndpointP95Indicator.java index 888584159..436b9850a 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/endpoint/EndpointP95Indicator.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/endpoint/EndpointP95Indicator.java @@ -184,7 +184,7 @@ public class EndpointP95Indicator extends P95Indicator implements AlarmSupported indicator.setServiceInstanceId(((Number)dbMap.get("service_instance_id")).intValue()); indicator.setValue(((Number)dbMap.get("value")).intValue()); indicator.setPrecision(((Number)dbMap.get("precision")).intValue()); - indicator.setDetailGroup((org.apache.skywalking.oap.server.core.analysis.indicator.IntKeyLongValueArray)dbMap.get("detail_group")); + indicator.setDetailGroup(new org.apache.skywalking.oap.server.core.analysis.indicator.IntKeyLongValueArray((String)dbMap.get("detail_group"))); indicator.setTimeBucket(((Number)dbMap.get("time_bucket")).longValue()); return indicator; } diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/endpoint/EndpointP99Indicator.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/endpoint/EndpointP99Indicator.java index b47e86381..fa14beb38 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/endpoint/EndpointP99Indicator.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/endpoint/EndpointP99Indicator.java @@ -184,7 +184,7 @@ public class EndpointP99Indicator extends P99Indicator implements AlarmSupported indicator.setServiceInstanceId(((Number)dbMap.get("service_instance_id")).intValue()); indicator.setValue(((Number)dbMap.get("value")).intValue()); indicator.setPrecision(((Number)dbMap.get("precision")).intValue()); - indicator.setDetailGroup((org.apache.skywalking.oap.server.core.analysis.indicator.IntKeyLongValueArray)dbMap.get("detail_group")); + indicator.setDetailGroup(new org.apache.skywalking.oap.server.core.analysis.indicator.IntKeyLongValueArray((String)dbMap.get("detail_group"))); indicator.setTimeBucket(((Number)dbMap.get("time_bucket")).longValue()); return indicator; } diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/service/ServiceP50Indicator.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/service/ServiceP50Indicator.java index 15c87a8fc..a09301cc8 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/service/ServiceP50Indicator.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/service/ServiceP50Indicator.java @@ -168,7 +168,7 @@ public class ServiceP50Indicator extends P50Indicator implements AlarmSupported indicator.setEntityId((String)dbMap.get("entity_id")); indicator.setValue(((Number)dbMap.get("value")).intValue()); indicator.setPrecision(((Number)dbMap.get("precision")).intValue()); - indicator.setDetailGroup((org.apache.skywalking.oap.server.core.analysis.indicator.IntKeyLongValueArray)dbMap.get("detail_group")); + indicator.setDetailGroup(new org.apache.skywalking.oap.server.core.analysis.indicator.IntKeyLongValueArray((String)dbMap.get("detail_group"))); indicator.setTimeBucket(((Number)dbMap.get("time_bucket")).longValue()); return indicator; } diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/service/ServiceP75Indicator.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/service/ServiceP75Indicator.java index b1f51675f..bd7bfa821 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/service/ServiceP75Indicator.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/service/ServiceP75Indicator.java @@ -168,7 +168,7 @@ public class ServiceP75Indicator extends P75Indicator implements AlarmSupported indicator.setEntityId((String)dbMap.get("entity_id")); indicator.setValue(((Number)dbMap.get("value")).intValue()); indicator.setPrecision(((Number)dbMap.get("precision")).intValue()); - indicator.setDetailGroup((org.apache.skywalking.oap.server.core.analysis.indicator.IntKeyLongValueArray)dbMap.get("detail_group")); + indicator.setDetailGroup(new org.apache.skywalking.oap.server.core.analysis.indicator.IntKeyLongValueArray((String)dbMap.get("detail_group"))); indicator.setTimeBucket(((Number)dbMap.get("time_bucket")).longValue()); return indicator; } diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/service/ServiceP90Indicator.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/service/ServiceP90Indicator.java index d30bfd060..810b78343 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/service/ServiceP90Indicator.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/service/ServiceP90Indicator.java @@ -168,7 +168,7 @@ public class ServiceP90Indicator extends P90Indicator implements AlarmSupported indicator.setEntityId((String)dbMap.get("entity_id")); indicator.setValue(((Number)dbMap.get("value")).intValue()); indicator.setPrecision(((Number)dbMap.get("precision")).intValue()); - indicator.setDetailGroup((org.apache.skywalking.oap.server.core.analysis.indicator.IntKeyLongValueArray)dbMap.get("detail_group")); + indicator.setDetailGroup(new org.apache.skywalking.oap.server.core.analysis.indicator.IntKeyLongValueArray((String)dbMap.get("detail_group"))); indicator.setTimeBucket(((Number)dbMap.get("time_bucket")).longValue()); return indicator; } diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/service/ServiceP95Indicator.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/service/ServiceP95Indicator.java index 4b62dbf42..ff2591f79 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/service/ServiceP95Indicator.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/service/ServiceP95Indicator.java @@ -168,7 +168,7 @@ public class ServiceP95Indicator extends P95Indicator implements AlarmSupported indicator.setEntityId((String)dbMap.get("entity_id")); indicator.setValue(((Number)dbMap.get("value")).intValue()); indicator.setPrecision(((Number)dbMap.get("precision")).intValue()); - indicator.setDetailGroup((org.apache.skywalking.oap.server.core.analysis.indicator.IntKeyLongValueArray)dbMap.get("detail_group")); + indicator.setDetailGroup(new org.apache.skywalking.oap.server.core.analysis.indicator.IntKeyLongValueArray((String)dbMap.get("detail_group"))); indicator.setTimeBucket(((Number)dbMap.get("time_bucket")).longValue()); return indicator; } diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/service/ServiceP99Indicator.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/service/ServiceP99Indicator.java index 41f213aba..93da1af4e 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/service/ServiceP99Indicator.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/service/ServiceP99Indicator.java @@ -168,7 +168,7 @@ public class ServiceP99Indicator extends P99Indicator implements AlarmSupported indicator.setEntityId((String)dbMap.get("entity_id")); indicator.setValue(((Number)dbMap.get("value")).intValue()); indicator.setPrecision(((Number)dbMap.get("precision")).intValue()); - indicator.setDetailGroup((org.apache.skywalking.oap.server.core.analysis.indicator.IntKeyLongValueArray)dbMap.get("detail_group")); + indicator.setDetailGroup(new org.apache.skywalking.oap.server.core.analysis.indicator.IntKeyLongValueArray((String)dbMap.get("detail_group"))); indicator.setTimeBucket(((Number)dbMap.get("time_bucket")).longValue()); return indicator; } diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/indicator/IntKeyLongValueArray.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/indicator/IntKeyLongValueArray.java index 298da6268..113fe877a 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/indicator/IntKeyLongValueArray.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/indicator/IntKeyLongValueArray.java @@ -31,8 +31,9 @@ public class IntKeyLongValueArray extends ArrayList implements super(initialCapacity); } - public IntKeyLongValueArray() { + public IntKeyLongValueArray(String data) { super(); + toObject(data); } @Override public String toStorageData() { diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/PaginationUtils.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/PaginationUtils.java new file mode 100644 index 000000000..8d7002af0 --- /dev/null +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/PaginationUtils.java @@ -0,0 +1,53 @@ +/* + * 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.query.entity.Pagination; + +/** + * @author peng-yongsheng + */ +public enum PaginationUtils { + INSTANCE; + + public Page exchange(Pagination paging) { + int limit = paging.getPageSize(); + int from = paging.getPageSize() * ((paging.getPageNum() == 0 ? 1 : paging.getPageNum()) - 1); + + return new Page(from, limit); + } + + public class Page { + private int from; + private int limit; + + Page(int from, int limit) { + this.from = from; + this.limit = limit; + } + + public int getFrom() { + return from; + } + + public int getLimit() { + return limit; + } + } +} diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/TraceQueryService.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/TraceQueryService.java new file mode 100644 index 000000000..eece16514 --- /dev/null +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/TraceQueryService.java @@ -0,0 +1,260 @@ +/* + * 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.*; +import org.apache.skywalking.apm.network.language.agent.*; +import org.apache.skywalking.oap.server.core.*; +import org.apache.skywalking.oap.server.core.analysis.manual.segment.SegmentRecord; +import org.apache.skywalking.oap.server.core.cache.*; +import org.apache.skywalking.oap.server.core.config.IComponentLibraryCatalogService; +import org.apache.skywalking.oap.server.core.query.entity.*; +import org.apache.skywalking.oap.server.core.query.entity.RefType; +import org.apache.skywalking.oap.server.core.register.EndpointInventory; +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.*; +import org.apache.skywalking.oap.server.library.module.Service; +import org.apache.skywalking.oap.server.library.util.CollectionUtils; + +import static java.util.Objects.nonNull; + +/** + * @author peng-yongsheng + */ +public class TraceQueryService implements Service { + + private final ModuleManager moduleManager; + private ITraceQueryDAO traceQueryDAO; + private ServiceInventoryCache serviceInventoryCache; + private EndpointInventoryCache endpointInventoryCache; + private NetworkAddressInventoryCache networkAddressInventoryCache; + private IComponentLibraryCatalogService componentLibraryCatalogService; + + public TraceQueryService(ModuleManager moduleManager) { + this.moduleManager = moduleManager; + } + + private ITraceQueryDAO getTraceQueryDAO() { + if (traceQueryDAO == null) { + this.traceQueryDAO = moduleManager.find(StorageModule.NAME).getService(ITraceQueryDAO.class); + } + return traceQueryDAO; + } + + private ServiceInventoryCache getServiceInventoryCache() { + if (serviceInventoryCache == null) { + this.serviceInventoryCache = moduleManager.find(CoreModule.NAME).getService(ServiceInventoryCache.class); + } + return serviceInventoryCache; + } + + private EndpointInventoryCache getEndpointInventoryCache() { + if (endpointInventoryCache == null) { + this.endpointInventoryCache = moduleManager.find(CoreModule.NAME).getService(EndpointInventoryCache.class); + } + return endpointInventoryCache; + } + + private NetworkAddressInventoryCache getNetworkAddressInventoryCache() { + if (networkAddressInventoryCache == null) { + this.networkAddressInventoryCache = moduleManager.find(CoreModule.NAME).getService(NetworkAddressInventoryCache.class); + } + return networkAddressInventoryCache; + } + + private IComponentLibraryCatalogService getComponentLibraryCatalogService() { + if (componentLibraryCatalogService == null) { + this.componentLibraryCatalogService = moduleManager.find(CoreModule.NAME).getService(IComponentLibraryCatalogService.class); + } + return componentLibraryCatalogService; + } + + public TraceBrief queryBasicTraces(final int serviceId, final String traceId, final String endpointName, + final int minTraceDuration, int maxTraceDuration, final TraceState traceState, final QueryOrder queryOrder, + final Pagination paging, final long startTB, final long endTB) throws IOException { + PaginationUtils.Page page = PaginationUtils.INSTANCE.exchange(paging); + + return getTraceQueryDAO().queryBasicTraces(startTB, endTB, minTraceDuration, maxTraceDuration, endpointName, serviceId, traceId, page.getLimit(), page.getFrom(), traceState, queryOrder); + } + + public Trace queryTrace(final String traceId) throws IOException { + Trace trace = new Trace(); + + List segmentRecords = getTraceQueryDAO().queryByTraceId(traceId); + for (SegmentRecord segment : segmentRecords) { + if (nonNull(segment)) { + TraceSegmentObject segmentObject = TraceSegmentObject.parseFrom(segment.getDataBinary()); + trace.getSpans().addAll(buildSpanList(traceId, segment.getSegmentId(), segment.getServiceId(), segmentObject.getSpansList())); + } + } + + List sortedSpans = new LinkedList<>(); + if (CollectionUtils.isNotEmpty(trace.getSpans())) { + List rootSpans = findRoot(trace.getSpans()); + + if (CollectionUtils.isNotEmpty(rootSpans)) { + rootSpans.forEach(span -> { + List childrenSpan = new ArrayList<>(); + childrenSpan.add(span); + findChildren(trace.getSpans(), span, childrenSpan); + sortedSpans.addAll(childrenSpan); + }); + } + } + + trace.getSpans().addAll(sortedSpans); + return trace; + } + + private List buildSpanList(String traceId, String segmentId, int serviceId, + List spanObjects) { + List spans = new ArrayList<>(); + + spanObjects.forEach(spanObject -> { + Span span = new Span(); + span.setTraceId(traceId); + span.setSegmentId(segmentId); + span.setSpanId(spanObject.getSpanId()); + span.setParentSpanId(spanObject.getParentSpanId()); + span.setStartTime(spanObject.getStartTime()); + span.setEndTime(spanObject.getEndTime()); + span.setError(spanObject.getIsError()); + span.setLayer(spanObject.getSpanLayer().name()); + span.setType(spanObject.getSpanType().name()); + + String segmentSpanId = segmentId + Const.SEGMENT_SPAN_SPLIT + String.valueOf(spanObject.getSpanId()); + span.setSegmentSpanId(segmentSpanId); + + String segmentParentSpanId = segmentId + Const.SEGMENT_SPAN_SPLIT + String.valueOf(spanObject.getParentSpanId()); + span.setSegmentParentSpanId(segmentParentSpanId); + + if (spanObject.getPeerId() == 0) { + span.setPeer(spanObject.getPeer()); + } else { + span.setPeer(getNetworkAddressInventoryCache().get(spanObject.getPeerId()).getName()); + } + + String endpointName = spanObject.getOperationName(); + if (spanObject.getOperationNameId() != 0) { + EndpointInventory endpointInventory = getEndpointInventoryCache().get(spanObject.getOperationNameId()); + if (nonNull(endpointInventory)) { + endpointName = endpointInventory.getName(); + } else { + endpointName = Const.EMPTY_STRING; + } + } + span.setEndpointName(endpointName); + + String serviceCode = getServiceInventoryCache().get(serviceId).getName(); + span.setServiceCode(serviceCode); + + if (spanObject.getComponentId() == 0) { + span.setComponent(spanObject.getComponent()); + } else { + span.setComponent(getComponentLibraryCatalogService().getComponentName(spanObject.getComponentId())); + } + + spanObject.getRefsList().forEach(reference -> { + Ref ref = new Ref(); + ref.setTraceId(traceId); + + switch (reference.getRefType()) { + case CrossThread: + ref.setType(RefType.CROSS_THREAD); + break; + case CrossProcess: + ref.setType(RefType.CROSS_PROCESS); + break; + } + ref.setParentSpanId(reference.getParentSpanId()); + + UniqueId uniqueId = reference.getParentTraceSegmentId(); + StringBuilder segmentIdBuilder = new StringBuilder(); + for (int i = 0; i < uniqueId.getIdPartsList().size(); i++) { + if (i == 0) { + segmentIdBuilder.append(String.valueOf(uniqueId.getIdPartsList().get(i))); + } else { + segmentIdBuilder.append(".").append(String.valueOf(uniqueId.getIdPartsList().get(i))); + } + } + ref.setParentSegmentId(segmentIdBuilder.toString()); + + span.setSegmentParentSpanId(ref.getParentSegmentId() + Const.SEGMENT_SPAN_SPLIT + String.valueOf(ref.getParentSpanId())); + + span.getRefs().add(ref); + }); + + spanObject.getTagsList().forEach(tag -> { + KeyValue keyValue = new KeyValue(); + keyValue.setKey(tag.getKey()); + keyValue.setValue(tag.getValue()); + span.getTags().add(keyValue); + }); + + spanObject.getLogsList().forEach(log -> { + LogEntity logEntity = new LogEntity(); + logEntity.setTime(log.getTime()); + + log.getDataList().forEach(data -> { + KeyValue keyValue = new KeyValue(); + keyValue.setKey(data.getKey()); + keyValue.setValue(data.getValue()); + logEntity.getData().add(keyValue); + }); + + span.getLogs().add(logEntity); + }); + + spans.add(span); + }); + + return spans; + } + + private List findRoot(List spans) { + List rootSpans = new ArrayList<>(); + spans.forEach(span -> { + String segmentParentSpanId = span.getSegmentParentSpanId(); + + boolean hasParent = false; + for (Span subSpan : spans) { + if (segmentParentSpanId.equals(subSpan.getSegmentSpanId())) { + hasParent = true; + } + } + + if (!hasParent) { + span.setRoot(true); + rootSpans.add(span); + } + }); + return rootSpans; + } + + private void findChildren(List spans, Span parentSpan, List childrenSpan) { + spans.forEach(span -> { + if (span.getSegmentParentSpanId().equals(parentSpan.getSegmentSpanId())) { + childrenSpan.add(span); + findChildren(spans, span, childrenSpan); + } + }); + } +} diff --git a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/type/BasicTrace.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/BasicTrace.java similarity index 80% rename from oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/type/BasicTrace.java rename to oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/BasicTrace.java index 562599b79..7ccbdeacf 100644 --- a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/type/BasicTrace.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/BasicTrace.java @@ -16,15 +16,18 @@ * */ -package org.apache.skywalking.oap.query.graphql.type; +package org.apache.skywalking.oap.server.core.query.entity; -import java.util.List; +import java.util.*; +import lombok.*; +@Getter +@Setter public class BasicTrace { private String segmentId; - private List operationNames; + private List endpointNames = new ArrayList<>(); private int duration; private String start; private boolean isError; - private List traceIds; + private List traceIds = new ArrayList<>(); } diff --git a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/type/KeyValue.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/KeyValue.java similarity index 90% rename from oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/type/KeyValue.java rename to oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/KeyValue.java index 3b6b1af9e..29cb6116d 100644 --- a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/type/KeyValue.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/KeyValue.java @@ -16,8 +16,12 @@ * */ -package org.apache.skywalking.oap.query.graphql.type; +package org.apache.skywalking.oap.server.core.query.entity; +import lombok.*; + +@Getter +@Setter public class KeyValue { private String key; private String value; diff --git a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/type/LogEntity.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/LogEntity.java similarity index 83% rename from oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/type/LogEntity.java rename to oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/LogEntity.java index 30dc45fa4..4b3e32034 100644 --- a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/type/LogEntity.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/LogEntity.java @@ -16,11 +16,14 @@ * */ -package org.apache.skywalking.oap.query.graphql.type; +package org.apache.skywalking.oap.server.core.query.entity; -import java.util.List; +import java.util.*; +import lombok.*; +@Getter +@Setter public class LogEntity { private long time; - private List data; + private List data = new ArrayList<>(); } diff --git a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/type/Pagination.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Pagination.java similarity index 90% rename from oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/type/Pagination.java rename to oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Pagination.java index bef2d1413..1c612e23b 100644 --- a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/type/Pagination.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Pagination.java @@ -16,8 +16,12 @@ * */ -package org.apache.skywalking.oap.query.graphql.type; +package org.apache.skywalking.oap.server.core.query.entity; +import lombok.*; + +@Getter +@Setter public class Pagination { private int pageNum; private int pageSize; diff --git a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/type/QueryOrder.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/QueryOrder.java similarity index 93% rename from oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/type/QueryOrder.java rename to oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/QueryOrder.java index 958da2e49..ec388954f 100644 --- a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/type/QueryOrder.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/QueryOrder.java @@ -16,7 +16,7 @@ * */ -package org.apache.skywalking.oap.query.graphql.type; +package org.apache.skywalking.oap.server.core.query.entity; public enum QueryOrder { BY_START_TIME, diff --git a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/type/Ref.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Ref.java similarity index 90% rename from oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/type/Ref.java rename to oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Ref.java index 08e50f2a6..d2b0f71f8 100644 --- a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/type/Ref.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Ref.java @@ -16,8 +16,12 @@ * */ -package org.apache.skywalking.oap.query.graphql.type; +package org.apache.skywalking.oap.server.core.query.entity; +import lombok.*; + +@Setter +@Getter public class Ref { private String traceId; private String parentSegmentId; diff --git a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/type/RefType.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/RefType.java similarity index 93% rename from oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/type/RefType.java rename to oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/RefType.java index cb99a1475..4436cd25e 100644 --- a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/type/RefType.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/RefType.java @@ -16,7 +16,7 @@ * */ -package org.apache.skywalking.oap.query.graphql.type; +package org.apache.skywalking.oap.server.core.query.entity; public enum RefType { CROSS_PROCESS, diff --git a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/type/Span.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Span.java similarity index 74% rename from oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/type/Span.java rename to oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Span.java index 0f3e5d823..0a28568a2 100644 --- a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/type/Span.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Span.java @@ -16,26 +16,31 @@ * */ -package org.apache.skywalking.oap.query.graphql.type; +package org.apache.skywalking.oap.server.core.query.entity; -import java.util.List; +import java.util.*; +import lombok.*; +@Getter +@Setter public class Span { private String traceId; private String segmentId; private int spanId; private int parentSpanId; - private List refs; - private String applicationCode; + private List refs = new ArrayList<>(); + private String serviceCode; private long startTime; private long endTime; - private String operationName; + private String endpointName; private String type; private String peer; private String component; private boolean isError; private String layer; - private List tags; - private List logs; - private String serviceCode; + private List tags = new ArrayList<>(); + private List logs = new ArrayList<>(); + private boolean isRoot; + private String segmentSpanId; + private String segmentParentSpanId; } diff --git a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/type/Trace.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Trace.java similarity index 83% rename from oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/type/Trace.java rename to oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Trace.java index 281f16fbf..87988a2ba 100644 --- a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/type/Trace.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Trace.java @@ -16,10 +16,12 @@ * */ -package org.apache.skywalking.oap.query.graphql.type; +package org.apache.skywalking.oap.server.core.query.entity; -import java.util.List; +import java.util.*; +import lombok.Getter; +@Getter public class Trace { - private List spans; + private List spans = new ArrayList<>(); } diff --git a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/type/TraceBrief.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/TraceBrief.java similarity index 83% rename from oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/type/TraceBrief.java rename to oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/TraceBrief.java index b0ecec9b4..d24333ed2 100644 --- a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/type/TraceBrief.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/TraceBrief.java @@ -16,11 +16,14 @@ * */ -package org.apache.skywalking.oap.query.graphql.type; +package org.apache.skywalking.oap.server.core.query.entity; -import java.util.List; +import java.util.*; +import lombok.*; +@Setter +@Getter public class TraceBrief { - private List traces; + private List traces = new ArrayList<>(); private int total; } diff --git a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/type/TraceState.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/TraceState.java similarity index 93% rename from oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/type/TraceState.java rename to oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/TraceState.java index 891218a6e..c184a00d0 100644 --- a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/type/TraceState.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/TraceState.java @@ -16,7 +16,7 @@ * */ -package org.apache.skywalking.oap.query.graphql.type; +package org.apache.skywalking.oap.server.core.query.entity; public enum TraceState { ALL, diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/StorageModule.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/StorageModule.java index c1bf7634d..cd00d470e 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/StorageModule.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/StorageModule.java @@ -19,7 +19,7 @@ package org.apache.skywalking.oap.server.core.storage; import org.apache.skywalking.oap.server.core.storage.cache.*; -import org.apache.skywalking.oap.server.core.storage.query.ITopologyQueryDAO; +import org.apache.skywalking.oap.server.core.storage.query.*; import org.apache.skywalking.oap.server.library.module.ModuleDefine; /** @@ -38,6 +38,6 @@ public class StorageModule extends ModuleDefine { IBatchDAO.class, StorageDAO.class, IRegisterLockDAO.class, IServiceInventoryCacheDAO.class, IServiceInstanceInventoryCacheDAO.class, IEndpointInventoryCacheDAO.class, INetworkAddressInventoryCacheDAO.class, - ITopologyQueryDAO.class}; + ITopologyQueryDAO.class, IMetricQueryDAO.class, ITraceQueryDAO.class}; } } diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/query/ITraceQueryDAO.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/query/ITraceQueryDAO.java new file mode 100644 index 000000000..cfe85291e --- /dev/null +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/query/ITraceQueryDAO.java @@ -0,0 +1,37 @@ +/* + * 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.storage.query; + +import java.io.IOException; +import java.util.List; +import org.apache.skywalking.oap.server.core.analysis.manual.segment.SegmentRecord; +import org.apache.skywalking.oap.server.core.query.entity.*; +import org.apache.skywalking.oap.server.library.module.Service; + +/** + * @author peng-yongsheng + */ +public interface ITraceQueryDAO extends Service { + + TraceBrief queryBasicTraces(long startSecondTB, long endSecondTB, long minDuration, + long maxDuration, String endpointName, int serviceId, String traceId, int limit, int from, + TraceState traceState, QueryOrder queryOrder) throws IOException; + + List queryByTraceId(String traceId) throws IOException; +} diff --git a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/GraphQLQueryProvider.java b/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/GraphQLQueryProvider.java index a08904125..9722cae31 100644 --- a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/GraphQLQueryProvider.java +++ b/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/GraphQLQueryProvider.java @@ -61,7 +61,7 @@ public class GraphQLQueryProvider extends ModuleProvider { .file("query-protocol/topology.graphqls") .resolvers(new TopologyQuery(getManager())) .file("query-protocol/trace.graphqls") - .resolvers(new TraceQuery()) + .resolvers(new TraceQuery(getManager())) .file("query-protocol/aggregation.graphqls") .resolvers(new AggregationQuery()) .file("query-protocol/alarm.graphqls") diff --git a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/AlarmQuery.java b/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/AlarmQuery.java index 88f7a5a45..06e094ff2 100644 --- a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/AlarmQuery.java +++ b/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/AlarmQuery.java @@ -19,18 +19,15 @@ package org.apache.skywalking.oap.query.graphql.resolver; import com.coxautodev.graphql.tools.GraphQLQueryResolver; -import org.apache.skywalking.oap.query.graphql.type.AlarmTrend; -import org.apache.skywalking.oap.query.graphql.type.Alarms; -import org.apache.skywalking.oap.query.graphql.type.Duration; -import org.apache.skywalking.oap.query.graphql.type.Pagination; -import org.apache.skywalking.oap.query.graphql.type.Scope; +import org.apache.skywalking.oap.query.graphql.type.*; +import org.apache.skywalking.oap.server.core.query.entity.Pagination; public class AlarmQuery implements GraphQLQueryResolver { public AlarmTrend getAlarmTrend(final Duration duration) { return new AlarmTrend(); } - public Alarms getAlarm(final Duration duration, final Scope scope,final String keyword, final Pagination paging) { + public Alarms getAlarm(final Duration duration, final Scope scope, final String keyword, final Pagination paging) { return new Alarms(); } } diff --git a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/TraceQuery.java b/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/TraceQuery.java index 203f1ecfa..3a7920b8c 100644 --- a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/TraceQuery.java +++ b/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/TraceQuery.java @@ -19,16 +19,58 @@ package org.apache.skywalking.oap.query.graphql.resolver; import com.coxautodev.graphql.tools.GraphQLQueryResolver; -import org.apache.skywalking.oap.query.graphql.type.Trace; -import org.apache.skywalking.oap.query.graphql.type.TraceBrief; +import java.io.IOException; import org.apache.skywalking.oap.query.graphql.type.TraceQueryCondition; +import org.apache.skywalking.oap.server.core.*; +import org.apache.skywalking.oap.server.core.query.*; +import org.apache.skywalking.oap.server.core.query.entity.*; +import org.apache.skywalking.oap.server.library.module.ModuleManager; +import org.apache.skywalking.oap.server.library.util.StringUtils; + +import static java.util.Objects.nonNull; public class TraceQuery implements GraphQLQueryResolver { - public TraceBrief queryBasicTraces(final TraceQueryCondition condition) { - return new TraceBrief(); + + private final ModuleManager moduleManager; + private TraceQueryService queryService; + + public TraceQuery(ModuleManager moduleManager) { + this.moduleManager = moduleManager; } - public Trace queryTrace(final String traceId) { - return new Trace(); + private TraceQueryService getQueryService() { + if (queryService == null) { + this.queryService = moduleManager.find(CoreModule.NAME).getService(TraceQueryService.class); + } + return queryService; + } + + public TraceBrief queryBasicTraces(final TraceQueryCondition condition) throws IOException { + long startSecondTB = 0; + long endSecondTB = 0; + String traceId = Const.EMPTY_STRING; + + if (StringUtils.isNotEmpty(condition.getTraceId())) { + traceId = condition.getTraceId(); + } else if (nonNull(condition.getQueryDuration())) { + startSecondTB = DurationUtils.INSTANCE.startTimeDurationToSecondTimeBucket(condition.getQueryDuration().getStep(), condition.getQueryDuration().getStart()); + endSecondTB = DurationUtils.INSTANCE.endTimeDurationToSecondTimeBucket(condition.getQueryDuration().getStep(), condition.getQueryDuration().getEnd()); + } else { + throw new UnexpectedException("The condition must contains either queryDuration or traceId."); + } + + int minDuration = condition.getMinTraceDuration(); + int maxDuration = condition.getMaxTraceDuration(); + String endpointName = condition.getEndpointName(); + int serviceId = condition.getServiceId(); + TraceState traceState = condition.getTraceState(); + QueryOrder queryOrder = condition.getQueryOrder(); + Pagination pagination = condition.getPaging(); + + return getQueryService().queryBasicTraces(serviceId, traceId, endpointName, minDuration, maxDuration, traceState, queryOrder, pagination, startSecondTB, endSecondTB); + } + + public Trace queryTrace(final String traceId) throws IOException { + return getQueryService().queryTrace(traceId); } } diff --git a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/type/TraceQueryCondition.java b/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/type/TraceQueryCondition.java index 50b94324e..a26de80d9 100644 --- a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/type/TraceQueryCondition.java +++ b/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/type/TraceQueryCondition.java @@ -18,18 +18,19 @@ package org.apache.skywalking.oap.query.graphql.type; -import lombok.Getter; +import lombok.*; +import org.apache.skywalking.oap.server.core.query.entity.*; @Getter +@Setter public class TraceQueryCondition { - private int applicationId; + private int serviceId; private String traceId; - private String operationName; + private String endpointName; private Duration queryDuration; private int minTraceDuration; private int maxTraceDuration; private TraceState traceState; private QueryOrder queryOrder; private Pagination paging; - } diff --git a/oap-server/server-query-plugin/query-graphql-plugin/src/main/resources/query-protocol b/oap-server/server-query-plugin/query-graphql-plugin/src/main/resources/query-protocol index b93baa588..9eafa5a6c 160000 --- a/oap-server/server-query-plugin/query-graphql-plugin/src/main/resources/query-protocol +++ b/oap-server/server-query-plugin/query-graphql-plugin/src/main/resources/query-protocol @@ -1 +1 @@ -Subproject commit b93baa58852595164aae50e3e7be37683c220175 +Subproject commit 9eafa5a6c5b3b9a61002391485799ed89be96b9c diff --git a/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/StorageModuleElasticsearchProvider.java b/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/StorageModuleElasticsearchProvider.java index 696e86e74..711b26acf 100644 --- a/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/StorageModuleElasticsearchProvider.java +++ b/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/StorageModuleElasticsearchProvider.java @@ -20,14 +20,14 @@ package org.apache.skywalking.oap.server.storage.plugin.elasticsearch; import org.apache.skywalking.oap.server.core.storage.*; import org.apache.skywalking.oap.server.core.storage.cache.*; -import org.apache.skywalking.oap.server.core.storage.query.ITopologyQueryDAO; +import org.apache.skywalking.oap.server.core.storage.query.*; import org.apache.skywalking.oap.server.library.client.NameSpace; import org.apache.skywalking.oap.server.library.client.elasticsearch.ElasticSearchClient; import org.apache.skywalking.oap.server.library.module.*; import org.apache.skywalking.oap.server.storage.plugin.elasticsearch.base.*; import org.apache.skywalking.oap.server.storage.plugin.elasticsearch.cache.*; import org.apache.skywalking.oap.server.storage.plugin.elasticsearch.lock.*; -import org.apache.skywalking.oap.server.storage.plugin.elasticsearch.query.TopologyQueryEsDAO; +import org.apache.skywalking.oap.server.storage.plugin.elasticsearch.query.*; import org.slf4j.*; /** @@ -76,6 +76,8 @@ public class StorageModuleElasticsearchProvider extends ModuleProvider { this.registerServiceImplementation(INetworkAddressInventoryCacheDAO.class, new NetworkAddressInventoryCacheEsDAO(elasticSearchClient)); this.registerServiceImplementation(ITopologyQueryDAO.class, new TopologyQueryEsDAO(elasticSearchClient)); + this.registerServiceImplementation(IMetricQueryDAO.class, new MetricQueryEsDAO(elasticSearchClient)); + this.registerServiceImplementation(ITraceQueryDAO.class, new TraceQueryEsDAO(elasticSearchClient)); } @Override diff --git a/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/query/MetricQueryEsDAO.java b/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/query/MetricQueryEsDAO.java index 310f3b7ed..ff92fa364 100644 --- a/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/query/MetricQueryEsDAO.java +++ b/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/query/MetricQueryEsDAO.java @@ -112,7 +112,7 @@ public class MetricQueryEsDAO extends EsDAO implements IMetricQueryDAO { int numOfSteps = ((Number)itemResponse.getResponse().getSource().get(ThermodynamicIndicator.NUM_OF_STEPS)).intValue(); String value = (String)itemResponse.getResponse().getSource().get(ThermodynamicIndicator.DETAIL_GROUP); - IntKeyLongValueArray intKeyLongValues = new IntKeyLongValueArray(); + IntKeyLongValueArray intKeyLongValues = new IntKeyLongValueArray(5); intKeyLongValues.toObject(value); List axisYValues = new ArrayList<>(); diff --git a/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/query/TraceQueryEsDAO.java b/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/query/TraceQueryEsDAO.java new file mode 100644 index 000000000..ab34a8ced --- /dev/null +++ b/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/query/TraceQueryEsDAO.java @@ -0,0 +1,141 @@ +/* + * 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.storage.plugin.elasticsearch.query; + +import java.io.IOException; +import java.util.*; +import org.apache.skywalking.oap.server.core.analysis.manual.segment.SegmentRecord; +import org.apache.skywalking.oap.server.core.query.entity.*; +import org.apache.skywalking.oap.server.core.storage.query.ITraceQueryDAO; +import org.apache.skywalking.oap.server.library.client.elasticsearch.ElasticSearchClient; +import org.apache.skywalking.oap.server.library.util.*; +import org.apache.skywalking.oap.server.storage.plugin.elasticsearch.base.EsDAO; +import org.elasticsearch.action.search.SearchResponse; +import org.elasticsearch.index.query.*; +import org.elasticsearch.search.SearchHit; +import org.elasticsearch.search.builder.SearchSourceBuilder; +import org.elasticsearch.search.sort.SortOrder; + +/** + * @author peng-yongsheng + */ +public class TraceQueryEsDAO extends EsDAO implements ITraceQueryDAO { + + public TraceQueryEsDAO(ElasticSearchClient client) { + super(client); + } + + @Override + public TraceBrief queryBasicTraces(long startSecondTB, long endSecondTB, long minDuration, + long maxDuration, String endpointName, int serviceId, String traceId, int limit, int from, + TraceState traceState, QueryOrder queryOrder) throws IOException { + SearchSourceBuilder sourceBuilder = SearchSourceBuilder.searchSource(); + + BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); + sourceBuilder.query(boolQueryBuilder); + List mustQueryList = boolQueryBuilder.must(); + + if (startSecondTB != 0 && endSecondTB != 0) { + mustQueryList.add(QueryBuilders.rangeQuery(SegmentRecord.TIME_BUCKET).gte(startSecondTB).lte(endSecondTB)); + } + + if (minDuration != 0 || maxDuration != 0) { + RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery(SegmentRecord.LATENCY); + if (minDuration != 0) { + rangeQueryBuilder.gte(minDuration); + } + if (maxDuration != 0) { + rangeQueryBuilder.lte(maxDuration); + } + boolQueryBuilder.must().add(rangeQueryBuilder); + } + if (StringUtils.isNotEmpty(endpointName)) { + mustQueryList.add(QueryBuilders.matchPhraseQuery(SegmentRecord.ENDPOINT_NAME, endpointName)); + } + if (serviceId != 0) { + boolQueryBuilder.must().add(QueryBuilders.termQuery(SegmentRecord.SERVICE_ID, serviceId)); + } + if (StringUtils.isNotEmpty(traceId)) { + boolQueryBuilder.must().add(QueryBuilders.termQuery(SegmentRecord.TRACE_ID, traceId)); + } + switch (traceState) { + case ERROR: + mustQueryList.add(QueryBuilders.matchQuery(SegmentRecord.IS_ERROR, BooleanUtils.TRUE)); + break; + case SUCCESS: + mustQueryList.add(QueryBuilders.matchQuery(SegmentRecord.IS_ERROR, BooleanUtils.FALSE)); + break; + } + switch (queryOrder) { + case BY_START_TIME: + sourceBuilder.sort(SegmentRecord.START_TIME, SortOrder.DESC); + break; + case BY_DURATION: + sourceBuilder.sort(SegmentRecord.START_TIME, SortOrder.DESC); + break; + } + sourceBuilder.size(limit); + sourceBuilder.from(from); + + SearchResponse response = getClient().search(SegmentRecord.INDEX_NAME, sourceBuilder); + + TraceBrief traceBrief = new TraceBrief(); + traceBrief.setTotal((int)response.getHits().totalHits); + + for (SearchHit searchHit : response.getHits().getHits()) { + BasicTrace basicTrace = new BasicTrace(); + + basicTrace.setSegmentId((String)searchHit.getSourceAsMap().get(SegmentRecord.SEGMENT_ID)); + basicTrace.setStart(String.valueOf(searchHit.getSourceAsMap().get(SegmentRecord.START_TIME))); + basicTrace.getEndpointNames().add((String)searchHit.getSourceAsMap().get(SegmentRecord.ENDPOINT_NAME)); + basicTrace.setDuration(((Number)searchHit.getSourceAsMap().get(SegmentRecord.LATENCY)).intValue()); + basicTrace.setError(BooleanUtils.valueToBoolean(((Number)searchHit.getSourceAsMap().get(SegmentRecord.IS_ERROR)).intValue())); + traceBrief.getTraces().add(basicTrace); + } + + return traceBrief; + } + + @Override public List queryByTraceId(String traceId) throws IOException { + SearchSourceBuilder sourceBuilder = SearchSourceBuilder.searchSource(); + sourceBuilder.query(QueryBuilders.termQuery(SegmentRecord.TRACE_ID, traceId)); + sourceBuilder.size(20); + + SearchResponse response = getClient().search(SegmentRecord.INDEX_NAME, sourceBuilder); + + List segmentRecords = new ArrayList<>(); + for (SearchHit searchHit : response.getHits().getHits()) { + SegmentRecord segmentRecord = new SegmentRecord(); + segmentRecord.setSegmentId((String)searchHit.getSourceAsMap().get(SegmentRecord.SEGMENT_ID)); + segmentRecord.setTraceId((String)searchHit.getSourceAsMap().get(SegmentRecord.TRACE_ID)); + segmentRecord.setServiceId(((Number)searchHit.getSourceAsMap().get(SegmentRecord.SERVICE_ID)).intValue()); + segmentRecord.setEndpointName((String)searchHit.getSourceAsMap().get(SegmentRecord.ENDPOINT_NAME)); + segmentRecord.setStartTime(((Number)searchHit.getSourceAsMap().get(SegmentRecord.START_TIME)).longValue()); + segmentRecord.setEndTime(((Number)searchHit.getSourceAsMap().get(SegmentRecord.END_TIME)).longValue()); + segmentRecord.setLatency(((Number)searchHit.getSourceAsMap().get(SegmentRecord.LATENCY)).intValue()); + segmentRecord.setIsError(((Number)searchHit.getSourceAsMap().get(SegmentRecord.IS_ERROR)).intValue()); + String dataBinaryBase64 = (String)searchHit.getSourceAsMap().get(SegmentRecord.DATA_BINARY); + if (StringUtils.isNotEmpty(dataBinaryBase64)) { + segmentRecord.setDataBinary(Base64.getDecoder().decode(dataBinaryBase64)); + } + segmentRecords.add(segmentRecord); + } + return segmentRecords; + } +}